@xgjktech/xg_cwork_im 1.16.3 → 1.16.4

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 +8 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/block-streaming-config.test.js +7 -1
  5. package/dist/src/block-streaming-config.test.js.map +1 -1
  6. package/dist/src/channel-config.d.ts +7 -0
  7. package/dist/src/channel-config.d.ts.map +1 -1
  8. package/dist/src/channel-config.js +5 -0
  9. package/dist/src/channel-config.js.map +1 -1
  10. package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -1
  11. package/dist/src/dispatch-mentioned-reply.js +110 -9
  12. package/dist/src/dispatch-mentioned-reply.js.map +1 -1
  13. package/dist/src/recommended-system-prompt.d.ts +1 -1
  14. package/dist/src/recommended-system-prompt.d.ts.map +1 -1
  15. package/dist/src/recommended-system-prompt.js +6 -1
  16. package/dist/src/recommended-system-prompt.js.map +1 -1
  17. package/dist/src/resource-file.d.ts +26 -0
  18. package/dist/src/resource-file.d.ts.map +1 -1
  19. package/dist/src/resource-file.js +59 -5
  20. package/dist/src/resource-file.js.map +1 -1
  21. package/dist/src/send-file-tool.d.ts +81 -0
  22. package/dist/src/send-file-tool.d.ts.map +1 -0
  23. package/dist/src/send-file-tool.js +354 -0
  24. package/dist/src/send-file-tool.js.map +1 -0
  25. package/dist/src/send-file-tool.test.d.ts +2 -0
  26. package/dist/src/send-file-tool.test.d.ts.map +1 -0
  27. package/dist/src/send-file-tool.test.js +176 -0
  28. package/dist/src/send-file-tool.test.js.map +1 -0
  29. package/dist/src/send-group-message-tool.js +1 -1
  30. package/dist/src/send-group-message-tool.js.map +1 -1
  31. package/dist/src/send-service.d.ts +43 -4
  32. package/dist/src/send-service.d.ts.map +1 -1
  33. package/dist/src/send-service.js +62 -38
  34. package/dist/src/send-service.js.map +1 -1
  35. package/dist/src/send-service.test.d.ts +2 -0
  36. package/dist/src/send-service.test.d.ts.map +1 -0
  37. package/dist/src/send-service.test.js +40 -0
  38. package/dist/src/send-service.test.js.map +1 -0
  39. package/dist/src/turn-deliver-buffer.d.ts +5 -0
  40. package/dist/src/turn-deliver-buffer.d.ts.map +1 -1
  41. package/dist/src/turn-deliver-buffer.js +13 -0
  42. package/dist/src/turn-deliver-buffer.js.map +1 -1
  43. package/dist/src/turn-deliver-buffer.test.js +20 -1
  44. package/dist/src/turn-deliver-buffer.test.js.map +1 -1
  45. package/dist/src/types.d.ts +14 -2
  46. package/dist/src/types.d.ts.map +1 -1
  47. package/dist/src/types.js.map +1 -1
  48. package/openclaw.plugin.json +2 -1
  49. package/package.json +2 -2
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=send-file-tool.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-file-tool.test.d.ts","sourceRoot":"","sources":["../../src/send-file-tool.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,176 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdir, symlink, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { describe, it } from "node:test";
6
+ import { resolveAccountConfigStrict, resolveDisplayFileName, resolveWorkspaceFile, selectTrustedAccountId, SendFileError, } from "./send-file-tool.js";
7
+ async function makeWorkspace() {
8
+ const root = path.join(os.tmpdir(), `cwork-sendfile-${Date.now()}-${Math.random().toString(36).slice(2)}`);
9
+ await mkdir(root, { recursive: true });
10
+ return root;
11
+ }
12
+ async function writeWorkspaceFile(root, rel, content = "hello") {
13
+ const abs = path.join(root, rel);
14
+ await mkdir(path.dirname(abs), { recursive: true });
15
+ await writeFile(abs, content, "utf8");
16
+ return abs;
17
+ }
18
+ async function expectCode(promise, code) {
19
+ await assert.rejects(promise, (err) => {
20
+ assert.ok(err instanceof SendFileError, `expected SendFileError, got ${String(err)}`);
21
+ assert.equal(err.code, code);
22
+ return true;
23
+ });
24
+ }
25
+ const MAX = 50 * 1024 * 1024;
26
+ describe("resolveWorkspaceFile - accepts", () => {
27
+ it("accepts plain relative path", async () => {
28
+ const root = await makeWorkspace();
29
+ await writeWorkspaceFile(root, "report.html", "<h1>ok</h1>");
30
+ const r = await resolveWorkspaceFile(root, "report.html", MAX);
31
+ assert.equal(r.sourceName, "report.html");
32
+ assert.ok(r.size > 0);
33
+ });
34
+ it("accepts ./ prefix and nested output path", async () => {
35
+ const root = await makeWorkspace();
36
+ await writeWorkspaceFile(root, "output/report.pdf", "pdfbytes");
37
+ const r = await resolveWorkspaceFile(root, "./output/report.pdf", MAX);
38
+ assert.equal(r.sourceName, "report.pdf");
39
+ });
40
+ it("accepts /workspace/ logical prefix", async () => {
41
+ const root = await makeWorkspace();
42
+ await writeWorkspaceFile(root, "xg-cwork-im/NORMAL/202607/项目报告.html", "<p>报告</p>");
43
+ const r = await resolveWorkspaceFile(root, "/workspace/xg-cwork-im/NORMAL/202607/项目报告.html", MAX);
44
+ assert.equal(r.sourceName, "项目报告.html");
45
+ });
46
+ });
47
+ describe("resolveWorkspaceFile - rejects", () => {
48
+ it("rejects .. traversal", async () => {
49
+ const root = await makeWorkspace();
50
+ await expectCode(resolveWorkspaceFile(root, "../secret.txt", MAX), "PATH_OUTSIDE_WORKSPACE");
51
+ });
52
+ it("rejects windows drive absolute path", async () => {
53
+ const root = await makeWorkspace();
54
+ await expectCode(resolveWorkspaceFile(root, "C:\\Users\\x\\secret.txt", MAX), "PATH_OUTSIDE_WORKSPACE");
55
+ });
56
+ it("rejects UNC path", async () => {
57
+ const root = await makeWorkspace();
58
+ await expectCode(resolveWorkspaceFile(root, "\\\\server\\share\\file.html", MAX), "PATH_OUTSIDE_WORKSPACE");
59
+ });
60
+ it("rejects non-workspace absolute path", async () => {
61
+ const root = await makeWorkspace();
62
+ await expectCode(resolveWorkspaceFile(root, "/tmp/openclaw/file.html", MAX), "PATH_OUTSIDE_WORKSPACE");
63
+ });
64
+ it("rejects file:// and http(s) urls", async () => {
65
+ const root = await makeWorkspace();
66
+ await expectCode(resolveWorkspaceFile(root, "file:///etc/passwd", MAX), "PATH_OUTSIDE_WORKSPACE");
67
+ await expectCode(resolveWorkspaceFile(root, "https://example.com/file.html", MAX), "PATH_OUTSIDE_WORKSPACE");
68
+ });
69
+ it("rejects nonexistent file", async () => {
70
+ const root = await makeWorkspace();
71
+ await expectCode(resolveWorkspaceFile(root, "nope.pdf", MAX), "FILE_NOT_FOUND");
72
+ });
73
+ it("rejects a directory", async () => {
74
+ const root = await makeWorkspace();
75
+ await mkdir(path.join(root, "subdir"), { recursive: true });
76
+ await expectCode(resolveWorkspaceFile(root, "subdir", MAX), "PATH_IS_DIRECTORY");
77
+ });
78
+ it("rejects empty file", async () => {
79
+ const root = await makeWorkspace();
80
+ await writeWorkspaceFile(root, "empty.txt", "");
81
+ await expectCode(resolveWorkspaceFile(root, "empty.txt", MAX), "EMPTY_FILE");
82
+ });
83
+ it("rejects oversized file", async () => {
84
+ const root = await makeWorkspace();
85
+ await writeWorkspaceFile(root, "big.bin", "0123456789");
86
+ await expectCode(resolveWorkspaceFile(root, "big.bin", 4), "FILE_TOO_LARGE");
87
+ });
88
+ it("rejects blocked executable extensions", async () => {
89
+ const root = await makeWorkspace();
90
+ for (const ext of ["exe", "dll", "bat", "cmd", "msi", "ps1", "sh"]) {
91
+ await writeWorkspaceFile(root, `evil.${ext}`, "x");
92
+ await expectCode(resolveWorkspaceFile(root, `evil.${ext}`, MAX), "EXTENSION_NOT_ALLOWED");
93
+ }
94
+ });
95
+ it("rejects symlink escaping workspace", async (t) => {
96
+ const root = await makeWorkspace();
97
+ const outside = await makeWorkspace();
98
+ const secret = await writeWorkspaceFile(outside, "secret.txt", "top secret");
99
+ const linkPath = path.join(root, "link.txt");
100
+ try {
101
+ await symlink(secret, linkPath);
102
+ }
103
+ catch {
104
+ t.skip("symlink not permitted on this platform");
105
+ return;
106
+ }
107
+ await expectCode(resolveWorkspaceFile(root, "link.txt", MAX), "SYMLINK_ESCAPE");
108
+ });
109
+ });
110
+ describe("selectTrustedAccountId", () => {
111
+ it("returns single provided id", () => {
112
+ assert.deepEqual(selectTrustedAccountId("main", undefined), { accountId: "main" });
113
+ assert.deepEqual(selectTrustedAccountId(undefined, "main"), { accountId: "main" });
114
+ });
115
+ it("returns undefined when neither provided", () => {
116
+ assert.deepEqual(selectTrustedAccountId(undefined, undefined), { accountId: undefined });
117
+ });
118
+ it("accepts consistent ids from both sources", () => {
119
+ assert.deepEqual(selectTrustedAccountId("main", "main"), { accountId: "main" });
120
+ });
121
+ it("flags conflict when the two trusted ids differ", () => {
122
+ const r = selectTrustedAccountId("main", "backup");
123
+ assert.ok("conflict" in r);
124
+ });
125
+ });
126
+ describe("resolveAccountConfigStrict", () => {
127
+ const base = (accounts) => ({ baseUrl: "https://im.example.com", ...(accounts ? { accounts } : {}) });
128
+ it("single-account mode returns top-level config", () => {
129
+ const r = resolveAccountConfigStrict(base(), "whatever");
130
+ assert.ok("config" in r);
131
+ });
132
+ it("rejects a non-existent account instead of falling back to first", () => {
133
+ const r = resolveAccountConfigStrict(base({ main: { robotKey: "k1" }, backup: { robotKey: "k2" } }), "ghost");
134
+ assert.ok("error" in r);
135
+ assert.equal(r.error, "ACCOUNT_NOT_FOUND");
136
+ });
137
+ it("resolves an existing account", () => {
138
+ const r = resolveAccountConfigStrict(base({ main: { robotKey: "k1" }, backup: { robotKey: "k2" } }), "main");
139
+ assert.ok("config" in r);
140
+ assert.equal(r.accountId, "main");
141
+ });
142
+ it("auto-selects the only non-default account when id omitted", () => {
143
+ const r = resolveAccountConfigStrict(base({ default: { maxAttachmentBytes: 5 }, only: { robotKey: "k" } }));
144
+ assert.ok("config" in r);
145
+ assert.equal(r.accountId, "only");
146
+ });
147
+ it("rejects when multiple accounts but no id provided (ambiguous)", () => {
148
+ const r = resolveAccountConfigStrict(base({ main: { robotKey: "k1" }, backup: { robotKey: "k2" } }));
149
+ assert.ok("error" in r);
150
+ });
151
+ it("applies account-level maxAttachmentBytes over top-level", () => {
152
+ const cfg = base({ main: { robotKey: "k1", maxAttachmentBytes: 1024 } });
153
+ cfg.maxAttachmentBytes = 50 * 1024 * 1024;
154
+ const r = resolveAccountConfigStrict(cfg, "main");
155
+ assert.ok("config" in r);
156
+ assert.equal(r.config.maxAttachmentBytes, 1024);
157
+ });
158
+ });
159
+ describe("resolveDisplayFileName", () => {
160
+ it("keeps source name when fileName omitted (no UUID/suffix)", () => {
161
+ assert.equal(resolveDisplayFileName("项目报告.html"), "项目报告.html");
162
+ });
163
+ it("strips path parts from fileName and keeps source extension", () => {
164
+ assert.equal(resolveDisplayFileName("report.pdf", "../../evil/我的报告"), "我的报告.pdf");
165
+ });
166
+ it("does not let fileName change the source extension", () => {
167
+ assert.equal(resolveDisplayFileName("report.pdf", "report.exe"), "report.pdf");
168
+ });
169
+ it("removes illegal filesystem characters", () => {
170
+ assert.equal(resolveDisplayFileName("a.md", 'na:me*?"<>|'), "name.md");
171
+ });
172
+ it("falls back to source name when sanitized result is empty", () => {
173
+ assert.equal(resolveDisplayFileName("report.pdf", "///"), "report.pdf");
174
+ });
175
+ });
176
+ //# sourceMappingURL=send-file-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-file-tool.test.js","sourceRoot":"","sources":["../../src/send-file-tool.test.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ export function buildSendGroupMessageTool(config, hints) {
39
39
  description: [
40
40
  "【用途】仅用于 OpenClaw **主动推消息**:例如定时任务 / Cron / 后台任务完成后,经 xg_cwork_im 向群里发一条**纯文字**结果或通知。",
41
41
  "【不要用错】用户正在 IM 里和助手**对话**时,**不要**用本工具回话——对话回复由 OpenClaw 正常走 channel,**用不上**本工具。",
42
- "【发文件】本工具不能发附件。用户要「发报告/发文件」时,在**对用户的助手回复**里用 **mediaUrl(s)** 指向 workspace file://;**禁止**为发文件上传到 tmpfiles 等外站。",
42
+ "【发文件】本工具**只能发纯文本,不能发附件**。用户要「发报告/发文件」时,必须改用 `xg_cwork_im_send_file` 工具(传 workspace 相对路径);禁止用 MEDIA 或上传到外站。",
43
43
  "【参数】groupId 为 IM 群唯一 ID;主动推送时若需告知某人,可填 atUserIds。",
44
44
  ].join("\n"),
45
45
  parameters: SendGroupMessageParams,
@@ -1 +1 @@
1
- {"version":3,"file":"send-group-message-tool.js","sourceRoot":"","sources":["../../src/send-group-message-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"send-group-message-tool.js","sourceRoot":"","sources":["../../src/send-group-message-tool.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,20 @@
5
5
  * 支持 RICH_TEXT 与带资源 fileId 的 FILE 类型(attachments)。
6
6
  */
7
7
  import type { Log } from "./auth.js";
8
- import type { SendMessageReply, XgImConfig } from "./types.js";
8
+ import type { SendMessageFileAttachment, SendMessageReply, XgImConfig } from "./types.js";
9
+ /**
10
+ * 生成一次投递的客户端幂等键。
11
+ *
12
+ * 服务端按 `clientMsgId + groupId + 最近 10 分钟` 去重:同一逻辑消息在其内部 6 次重试间
13
+ * 复用同一 `clientMsgId`,超时/断连重发会命中服务端已有消息,不产生重复气泡。
14
+ * 每个独立投递块生成一次(不同块必须不同)。
15
+ */
16
+ export declare function generateClientMsgId(): string;
17
+ /** 从发送接口响应中解析服务端消息 id(`data.id`)与回显 `clientMsgId`,用于对账日志。 */
18
+ export declare function extractSentMessageInfo(resData: unknown): {
19
+ serverMsgId?: string;
20
+ clientMsgId?: string;
21
+ };
9
22
  /** OpenClaw dispatch deliver 单块载荷:文本 + 可选媒体 URL(与 plugin-sdk 约定对齐)。 */
10
23
  export type ReplyDeliverPayload = {
11
24
  markdown?: string;
@@ -27,7 +40,33 @@ export type ReplyDeliverPayload = {
27
40
  * 用于在多沙箱 agent 场景下正确解析 /workspace/ 前缀路径。
28
41
  * 未传时回退到 process.cwd(),单 agent 部署下行为不变。
29
42
  */
30
- export declare function sendReplyDeliverBlock(config: XgImConfig, token: string, groupId: string, payload: ReplyDeliverPayload, atUserIds?: string[], log?: Log, msgId?: string, reply?: SendMessageReply, agentWorkspaceDir?: string): Promise<void>;
43
+ export declare function sendReplyDeliverBlock(config: XgImConfig, token: string, groupId: string, payload: ReplyDeliverPayload, atUserIds?: string[], log?: Log, _deprecatedMsgId?: string, reply?: SendMessageReply, agentWorkspaceDir?: string): Promise<void>;
44
+ /**
45
+ * 发送一条已上传资源的 FILE 消息到指定 IM 群聊。
46
+ *
47
+ * 与 {@link sendReplyDeliverBlock} 不同:本函数**不做** URL 下载 / 上传失败降级为文本的逻辑,
48
+ * 仅负责把已经拿到 fileId 的附件组装成 FILE 消息发出。失败直接抛出,由调用方(工具)返回明确错误,
49
+ * 不会产生「降级成文本却报成功」的假成功。上传步骤请在调用前用
50
+ * {@link uploadWholeResourceFileWithRetry} 完成。
51
+ *
52
+ * 复用 {@link postImMessage} 的 6 次网络重试与服务端 clientMsgId 去重。
53
+ */
54
+ export declare function sendUploadedFileMessage(args: {
55
+ config: XgImConfig;
56
+ token: string;
57
+ groupId: string;
58
+ /** 附件说明;为空时用单空格占位,避免部分 IM 接口拒收空文本 */
59
+ caption?: string;
60
+ attachment: SendMessageFileAttachment;
61
+ atUserIds?: string[];
62
+ /** 幂等键;省略时自动生成 */
63
+ clientMsgId?: string;
64
+ reply?: SendMessageReply;
65
+ log?: Log;
66
+ }): Promise<{
67
+ clientMsgId: string;
68
+ serverMsgId?: string;
69
+ }>;
31
70
  /**
32
71
  * 发送文本消息到指定 IM 群聊。
33
72
  *
@@ -37,8 +76,8 @@ export declare function sendReplyDeliverBlock(config: XgImConfig, token: string,
37
76
  * @param content 消息内容文本
38
77
  * @param atUserIds 需要 @ 的用户 ID 列表(可为空)
39
78
  * @param log 日志接口
40
- * @param msgId 可选的业务消息 ID(用于覆盖/更新已有消息)
79
+ * @param _deprecatedMsgId 已废弃的占位消息 ID 参数,不再使用(保留以兼容旧调用签名)
41
80
  * @param reply 可选的被回复消息信息(用于在 IM 中建立“回复某条消息”的关联)
42
81
  */
43
- export declare function sendTextMessage(config: XgImConfig, token: string, groupId: string, content: string, atUserIds?: string[], log?: Log, msgId?: string, reply?: SendMessageReply): Promise<void>;
82
+ export declare function sendTextMessage(config: XgImConfig, token: string, groupId: string, content: string, atUserIds?: string[], log?: Log, _deprecatedMsgId?: string, reply?: SendMessageReply): Promise<void>;
44
83
  //# sourceMappingURL=send-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"send-service.d.ts","sourceRoot":"","sources":["../../src/send-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAWrC,OAAO,KAAK,EAA8C,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8M3G,uEAAuE;AACvE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC5B,SAAS,GAAE,MAAM,EAAO,EACxB,GAAG,CAAC,EAAE,GAAG,EACT,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,gBAAgB,EACxB,iBAAiB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,IAAI,CAAC,CAgHf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAM,EAAO,EACxB,GAAG,CAAC,EAAE,GAAG,EACT,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAqBf"}
1
+ {"version":3,"file":"send-service.d.ts","sourceRoot":"","sources":["../../src/send-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAWrC,OAAO,KAAK,EAAmB,yBAAyB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6B3G;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,6DAA6D;AAC7D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAQvG;AA0KD,uEAAuE;AACvE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC5B,SAAS,GAAE,MAAM,EAAO,EACxB,GAAG,CAAC,EAAE,GAAG,EACT,gBAAgB,CAAC,EAAE,MAAM,EACzB,KAAK,CAAC,EAAE,gBAAgB,EACxB,iBAAiB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,IAAI,CAAC,CA2Gf;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,yBAAyB,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,GAAG,CAAC,EAAE,GAAG,CAAC;CACb,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACjC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAM,EAAO,EACxB,GAAG,CAAC,EAAE,GAAG,EACT,gBAAgB,CAAC,EAAE,MAAM,EACzB,KAAK,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -4,6 +4,7 @@
4
4
  * 调用 IM 接口将 AI 回复发送到指定群聊,并 @ 原始发送者。
5
5
  * 支持 RICH_TEXT 与带资源 fileId 的 FILE 类型(attachments)。
6
6
  */
7
+ import { randomUUID } from "node:crypto";
7
8
  import axios from "axios";
8
9
  import { downloadMediaBuffer, formatFromFilename, parseWorkspaceRelativeMediaRef, resolveMaxAttachmentBytes, resolveResourceUploadUrl, uploadWholeResourceFile, } from "./resource-file.js";
9
10
  import { stripMediaDirectiveLines } from "./deliver-text.js";
@@ -35,23 +36,27 @@ function buildFileDeliverFallbackText(textToSend, mediaUrls, err) {
35
36
  }
36
37
  return errNote;
37
38
  }
38
- /** 用于合并流式占位消息:trim 后非空才写入请求体 `msgId` */
39
- function normalizePlaceholderMsgId(msgId) {
40
- if (msgId == null)
41
- return undefined;
42
- const t = String(msgId).trim();
43
- return t.length > 0 ? t : undefined;
39
+ /**
40
+ * 生成一次投递的客户端幂等键。
41
+ *
42
+ * 服务端按 `clientMsgId + groupId + 最近 10 分钟` 去重:同一逻辑消息在其内部 6 次重试间
43
+ * 复用同一 `clientMsgId`,超时/断连重发会命中服务端已有消息,不产生重复气泡。
44
+ * 每个独立投递块生成一次(不同块必须不同)。
45
+ */
46
+ export function generateClientMsgId() {
47
+ return `ocw_${Date.now()}_${randomUUID()}`;
44
48
  }
45
- /** 日志脱敏摘要:便于对照 IM 后台是否收到合并字段(不含完整密钥) */
46
- function summarizePlaceholderMsgId(raw) {
47
- if (raw == null)
48
- return "input=null";
49
- const n = normalizePlaceholderMsgId(raw);
50
- if (!n)
51
- return raw === "" ? "empty-string" : "whitespace-only";
52
- if (n.length <= 18)
53
- return `full=${n}`;
54
- return `len=${n.length} ${n.slice(0, 8)}…${n.slice(-4)}`;
49
+ /** 从发送接口响应中解析服务端消息 id(`data.id`)与回显 `clientMsgId`,用于对账日志。 */
50
+ export function extractSentMessageInfo(resData) {
51
+ if (!resData || typeof resData !== "object")
52
+ return {};
53
+ const data = resData.data;
54
+ if (!data || typeof data !== "object")
55
+ return {};
56
+ const d = data;
57
+ const serverMsgId = typeof d.id === "string" ? d.id : d.id != null ? String(d.id) : undefined;
58
+ const clientMsgId = typeof d.clientMsgId === "string" ? d.clientMsgId : undefined;
59
+ return { serverMsgId, clientMsgId };
55
60
  }
56
61
  /**
57
62
  * 发消息接口的重试参数。
@@ -132,12 +137,9 @@ async function postImMessage(config, token, groupId, body, atUserIds = [], log)
132
137
  groupId,
133
138
  ...(atUserIds.length > 0 ? { atUserIds } : {}),
134
139
  };
135
- const bodyMsgIdRaw = full.msgId;
136
- const bodyMsgId = typeof bodyMsgIdRaw === "string" ? bodyMsgIdRaw : undefined;
137
- const mergedPlaceholder = normalizePlaceholderMsgId(bodyMsgId);
140
+ const bodyClientMsgId = typeof full.clientMsgId === "string" ? full.clientMsgId : undefined;
138
141
  sendLogInfo(log, `[cwork_im:send] POST ${url} groupId=${groupId} type=${full.type} ` +
139
- `placeholderRaw=${summarizePlaceholderMsgId(bodyMsgId)} ` +
140
- `mergeFieldInJson=${mergedPlaceholder != null ? `yes(len=${mergedPlaceholder.length})` : "no"} ` +
142
+ `clientMsgId=${bodyClientMsgId ?? "none"} ` +
141
143
  `atUsers=${JSON.stringify(atUserIds)}`);
142
144
  sendLogDebug(log, config, `[cwork_im:send] Request body: ${JSON.stringify(full)}`);
143
145
  const totalAttempts = 1 + IM_SEND_MAX_RETRIES;
@@ -163,7 +165,13 @@ async function postImMessage(config, token, groupId, body, atUserIds = [], log)
163
165
  throw new Error(`IM API error resultCode=${resultCode}${resultMsg ? ` resultMsg=${resultMsg}` : ""}`);
164
166
  }
165
167
  }
166
- return;
168
+ // 对账日志:服务端消息 id(data.id)+ 回显 clientMsgId;重试命中去重时会返回既有消息。
169
+ const sent = extractSentMessageInfo(d);
170
+ sendLogInfo(log, `[cwork_im:send] Delivered groupId=${groupId} ` +
171
+ `serverMsgId=${sent.serverMsgId ?? "unknown"} ` +
172
+ `clientMsgId=${sent.clientMsgId ?? bodyClientMsgId ?? "none"} ` +
173
+ `(attempt=${attempt}/${totalAttempts})`);
174
+ return { serverMsgId: sent.serverMsgId, clientMsgId: sent.clientMsgId ?? bodyClientMsgId };
167
175
  }
168
176
  catch (err) {
169
177
  lastErr = err;
@@ -191,11 +199,9 @@ async function postImMessage(config, token, groupId, body, atUserIds = [], log)
191
199
  * 用于在多沙箱 agent 场景下正确解析 /workspace/ 前缀路径。
192
200
  * 未传时回退到 process.cwd(),单 agent 部署下行为不变。
193
201
  */
194
- export async function sendReplyDeliverBlock(config, token, groupId, payload, atUserIds = [], log, msgId, reply, agentWorkspaceDir) {
195
- const placeholderMsgId = normalizePlaceholderMsgId(msgId);
196
- if (msgId !== undefined && placeholderMsgId === undefined) {
197
- sendLogWarn(log, `[cwork_im:send] sendReplyDeliverBlock: placeholder msgId omitted (empty/whitespace only after trim) raw=${JSON.stringify(msgId)}`);
198
- }
202
+ export async function sendReplyDeliverBlock(config, token, groupId, payload, atUserIds = [], log, _deprecatedMsgId, reply, agentWorkspaceDir) {
203
+ // 一个投递块一个 clientMsgId:内部 6 次重试复用同值 → 命中服务端去重,不重复投递。
204
+ const clientMsgId = generateClientMsgId();
199
205
  const textToSend = stripMediaDirectiveLines((payload.markdown || payload.text || "").trim());
200
206
  const mediaList = [
201
207
  ...(payload.mediaUrl ? [payload.mediaUrl] : []),
@@ -206,7 +212,7 @@ export async function sendReplyDeliverBlock(config, token, groupId, payload, atU
206
212
  const formField = config.fileUploadFormField?.trim() || "file";
207
213
  const wantFile = uniqueUrls.length > 0 && !payload.isThinking;
208
214
  sendLogInfo(log, `[cwork_im:send] sendReplyDeliverBlock plan kind=${wantFile ? "FILE" : textToSend.length > 0 ? "RICH_TEXT" : "none"} ` +
209
- `placeholder=${placeholderMsgId != null ? `merge(len=${placeholderMsgId.length})` : "no-merge"} ` +
215
+ `clientMsgId=${clientMsgId} ` +
210
216
  `isThinking=${payload.isThinking ?? false}`);
211
217
  if (wantFile) {
212
218
  const fileUploadUrl = resolveResourceUploadUrl(config.baseUrl);
@@ -243,7 +249,7 @@ export async function sendReplyDeliverBlock(config, token, groupId, payload, atU
243
249
  type: "FILE",
244
250
  text: caption,
245
251
  attachments,
246
- ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
252
+ clientMsgId,
247
253
  ...(reply ? { reply } : {}),
248
254
  }, atUserIds, log);
249
255
  return;
@@ -255,7 +261,7 @@ export async function sendReplyDeliverBlock(config, token, groupId, payload, atU
255
261
  await postImMessage(config, token, groupId, {
256
262
  type: "RICH_TEXT",
257
263
  text: fallbackText,
258
- ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
264
+ clientMsgId,
259
265
  ...(reply ? { reply } : {}),
260
266
  }, atUserIds, log);
261
267
  return;
@@ -265,11 +271,33 @@ export async function sendReplyDeliverBlock(config, token, groupId, payload, atU
265
271
  await postImMessage(config, token, groupId, {
266
272
  type: "RICH_TEXT",
267
273
  text: textToSend,
268
- ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
274
+ clientMsgId,
269
275
  ...(reply ? { reply } : {}),
270
276
  }, atUserIds, log);
271
277
  }
272
278
  }
279
+ /**
280
+ * 发送一条已上传资源的 FILE 消息到指定 IM 群聊。
281
+ *
282
+ * 与 {@link sendReplyDeliverBlock} 不同:本函数**不做** URL 下载 / 上传失败降级为文本的逻辑,
283
+ * 仅负责把已经拿到 fileId 的附件组装成 FILE 消息发出。失败直接抛出,由调用方(工具)返回明确错误,
284
+ * 不会产生「降级成文本却报成功」的假成功。上传步骤请在调用前用
285
+ * {@link uploadWholeResourceFileWithRetry} 完成。
286
+ *
287
+ * 复用 {@link postImMessage} 的 6 次网络重试与服务端 clientMsgId 去重。
288
+ */
289
+ export async function sendUploadedFileMessage(args) {
290
+ const caption = args.caption && args.caption.trim().length > 0 ? args.caption : " ";
291
+ const clientMsgId = args.clientMsgId ?? generateClientMsgId();
292
+ const sent = await postImMessage(args.config, args.token, args.groupId, {
293
+ type: "FILE",
294
+ text: caption,
295
+ attachments: [args.attachment],
296
+ clientMsgId,
297
+ ...(args.reply ? { reply: args.reply } : {}),
298
+ }, args.atUserIds ?? [], args.log);
299
+ return { clientMsgId, serverMsgId: sent.serverMsgId };
300
+ }
273
301
  /**
274
302
  * 发送文本消息到指定 IM 群聊。
275
303
  *
@@ -279,18 +307,14 @@ export async function sendReplyDeliverBlock(config, token, groupId, payload, atU
279
307
  * @param content 消息内容文本
280
308
  * @param atUserIds 需要 @ 的用户 ID 列表(可为空)
281
309
  * @param log 日志接口
282
- * @param msgId 可选的业务消息 ID(用于覆盖/更新已有消息)
310
+ * @param _deprecatedMsgId 已废弃的占位消息 ID 参数,不再使用(保留以兼容旧调用签名)
283
311
  * @param reply 可选的被回复消息信息(用于在 IM 中建立“回复某条消息”的关联)
284
312
  */
285
- export async function sendTextMessage(config, token, groupId, content, atUserIds = [], log, msgId, reply) {
286
- const placeholderMsgId = normalizePlaceholderMsgId(msgId);
287
- if (msgId !== undefined && placeholderMsgId === undefined) {
288
- sendLogWarn(log, `[cwork_im:send] sendTextMessage: placeholder msgId omitted (empty/whitespace only after trim) raw=${JSON.stringify(msgId)}`);
289
- }
313
+ export async function sendTextMessage(config, token, groupId, content, atUserIds = [], log, _deprecatedMsgId, reply) {
290
314
  await postImMessage(config, token, groupId, {
291
315
  type: "RICH_TEXT",
292
316
  text: content,
293
- ...(placeholderMsgId ? { msgId: placeholderMsgId } : {}),
317
+ clientMsgId: generateClientMsgId(),
294
318
  ...(reply ? { reply } : {}),
295
319
  }, atUserIds, log);
296
320
  }
@@ -1 +1 @@
1
- {"version":3,"file":"send-service.js","sourceRoot":"","sources":["../../src/send-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"send-service.js","sourceRoot":"","sources":["../../src/send-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=send-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-service.test.d.ts","sourceRoot":"","sources":["../../src/send-service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { extractSentMessageInfo, generateClientMsgId } from "./send-service.js";
4
+ describe("generateClientMsgId", () => {
5
+ it("is unique per call (distinct logical messages)", () => {
6
+ const a = generateClientMsgId();
7
+ const b = generateClientMsgId();
8
+ assert.notEqual(a, b);
9
+ assert.match(a, /^ocw_\d+_/);
10
+ });
11
+ });
12
+ describe("extractSentMessageInfo", () => {
13
+ it("reads server id and echoed clientMsgId from real send response", () => {
14
+ const res = {
15
+ resultCode: 1,
16
+ resultMsg: null,
17
+ data: {
18
+ id: "2077657906769403905",
19
+ groupId: "2072518674467676162",
20
+ type: "TEXT",
21
+ text: "1",
22
+ clientMsgId: "temp_1784187222818_oe8fjl",
23
+ },
24
+ };
25
+ const info = extractSentMessageInfo(res);
26
+ assert.equal(info.serverMsgId, "2077657906769403905");
27
+ assert.equal(info.clientMsgId, "temp_1784187222818_oe8fjl");
28
+ });
29
+ it("coerces numeric id to string", () => {
30
+ const info = extractSentMessageInfo({ data: { id: 12345 } });
31
+ assert.equal(info.serverMsgId, "12345");
32
+ });
33
+ it("returns empty when data missing or malformed", () => {
34
+ assert.deepEqual(extractSentMessageInfo(null), {});
35
+ assert.deepEqual(extractSentMessageInfo({}), {});
36
+ assert.deepEqual(extractSentMessageInfo({ data: null }), {});
37
+ assert.deepEqual(extractSentMessageInfo({ data: "nope" }), {});
38
+ });
39
+ });
40
+ //# sourceMappingURL=send-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-service.test.js","sourceRoot":"","sources":["../../src/send-service.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEhF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,mBAAmB,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,mBAAmB,EAAE,CAAC;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,GAAG,GAAG;YACR,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACF,EAAE,EAAE,qBAAqB;gBACzB,OAAO,EAAE,qBAAqB;gBAC9B,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,GAAG;gBACT,WAAW,EAAE,2BAA2B;aAC3C;SACJ,CAAC;QACF,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -41,6 +41,11 @@ export declare function isDeliverPayloadSendable(args: {
41
41
  * 无权威 OpenClaw 标记,偏保守:宁可追加重复,不可覆盖丢段。
42
42
  */
43
43
  export declare function isDeliverTextRevision(oldText: string, newText: string): boolean;
44
+ /**
45
+ * 段边界 / 轮末 flush 时,判断是否可用 `onPartialReply` 全量快照覆盖 deliver 拼接文本。
46
+ * 仅当快照(归一化后)与缓冲文本相等或为其超集时才覆盖,避免流式竞态下快照落后导致截断丢内容。
47
+ */
48
+ export declare function snapshotSupersedesBufferText(snapshot: string, bufferText: string): boolean;
44
49
  export declare class TurnDeliverBuffer {
45
50
  private buffer;
46
51
  private lastFlushedComparable;
@@ -1 +1 @@
1
- {"version":3,"file":"turn-deliver-buffer.d.ts","sourceRoot":"","sources":["../../src/turn-deliver-buffer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG;IAC/B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,0BAA0B,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GACxB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAEvD,2CAA2C;AAC3C,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAEV;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAS/E;AA4BD,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,qBAAqB,CAAM;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAOpB;IAEF,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,sBAAsB;IAIlC,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAiBxC,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB;IAiCxD,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"turn-deliver-buffer.d.ts","sourceRoot":"","sources":["../../src/turn-deliver-buffer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG;IAC/B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,0BAA0B,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GACxB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAEvD,2CAA2C;AAC3C,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAEV;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAS/E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAM1F;AA4BD,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,qBAAqB,CAAM;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAOpB;IAEF,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,sBAAsB;IAIlC,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAiBxC,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB;IAiCxD,KAAK,IAAI,IAAI;CAGhB"}