@xgjktech/xg_cwork_im 1.11.3 → 1.11.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.
- package/README.md +10 -10
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/{index.ts → dist/index.js} +5 -9
- package/dist/index.js.map +1 -0
- package/dist/src/auth.d.ts +25 -0
- package/dist/src/auth.d.ts.map +1 -0
- package/{src/auth.ts → dist/src/auth.js} +55 -79
- package/dist/src/auth.js.map +1 -0
- package/dist/src/channel.d.ts +13 -0
- package/dist/src/channel.d.ts.map +1 -0
- package/{src/channel.ts → dist/src/channel.js} +180 -385
- package/dist/src/channel.js.map +1 -0
- package/dist/src/connection.d.ts +51 -0
- package/dist/src/connection.d.ts.map +1 -0
- package/{src/connection.ts → dist/src/connection.js} +45 -122
- package/dist/src/connection.js.map +1 -0
- package/dist/src/group-history-tool.d.ts +23 -0
- package/dist/src/group-history-tool.d.ts.map +1 -0
- package/{src/group-history-tool.ts → dist/src/group-history-tool.js} +168 -204
- package/dist/src/group-history-tool.js.map +1 -0
- package/dist/src/inbound-media-local.d.ts +40 -0
- package/dist/src/inbound-media-local.d.ts.map +1 -0
- package/{src/inbound-media-local.ts → dist/src/inbound-media-local.js} +52 -90
- package/dist/src/inbound-media-local.js.map +1 -0
- package/dist/src/recommended-system-prompt.d.ts +3 -0
- package/dist/src/recommended-system-prompt.d.ts.map +1 -0
- package/dist/src/recommended-system-prompt.js +3 -0
- package/dist/src/recommended-system-prompt.js.map +1 -0
- package/dist/src/resource-file.d.ts +65 -0
- package/dist/src/resource-file.d.ts.map +1 -0
- package/{src/resource-file.ts → dist/src/resource-file.js} +77 -99
- package/dist/src/resource-file.js.map +1 -0
- package/dist/src/send-group-message-tool.d.ts +16 -0
- package/dist/src/send-group-message-tool.d.ts.map +1 -0
- package/{src/send-group-message-tool.ts → dist/src/send-group-message-tool.js} +17 -34
- package/dist/src/send-group-message-tool.js.map +1 -0
- package/dist/src/send-service.d.ts +34 -0
- package/dist/src/send-service.d.ts.map +1 -0
- package/{src/send-service.ts → dist/src/send-service.js} +60 -146
- package/dist/src/send-service.js.map +1 -0
- package/{src/tool-json-result.ts → dist/src/tool-json-result.d.ts} +14 -24
- package/dist/src/tool-json-result.d.ts.map +1 -0
- package/dist/src/tool-json-result.js +20 -0
- package/dist/src/tool-json-result.js.map +1 -0
- package/{src/types.ts → dist/src/types.d.ts} +26 -94
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +32 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +7 -6
- package/src/recommended-system-prompt.ts +0 -3
|
@@ -4,29 +4,21 @@
|
|
|
4
4
|
* 调用 IM 接口将 AI 回复发送到指定群聊,并 @ 原始发送者。
|
|
5
5
|
* 支持 RICH_TEXT 与带资源 fileId 的 FILE 类型(attachments)。
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import axios from "axios";
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
downloadMediaBuffer,
|
|
12
|
-
formatFromFilename,
|
|
13
|
-
resolveMaxAttachmentBytes,
|
|
14
|
-
resolveResourceUploadUrl,
|
|
15
|
-
uploadWholeResourceFile,
|
|
16
|
-
} from "./resource-file.js";
|
|
17
|
-
import type { SendMessageBody, SendMessageFileAttachment, SendMessageReply, XgImConfig } from "./types.js";
|
|
18
|
-
|
|
19
|
-
function formatDeliverError(err: unknown): string {
|
|
8
|
+
import { downloadMediaBuffer, formatFromFilename, resolveMaxAttachmentBytes, resolveResourceUploadUrl, uploadWholeResourceFile, } from "./resource-file.js";
|
|
9
|
+
function formatDeliverError(err) {
|
|
20
10
|
if (axios.isAxiosError(err)) {
|
|
21
11
|
const parts = [err.message];
|
|
22
|
-
if (err.code)
|
|
23
|
-
|
|
12
|
+
if (err.code)
|
|
13
|
+
parts.push(`axiosCode=${err.code}`);
|
|
14
|
+
if (err.response?.status != null)
|
|
15
|
+
parts.push(`httpStatus=${err.response.status}`);
|
|
24
16
|
return parts.join(" ");
|
|
25
17
|
}
|
|
26
|
-
if (err instanceof Error)
|
|
18
|
+
if (err instanceof Error)
|
|
19
|
+
return err.message;
|
|
27
20
|
return String(err);
|
|
28
21
|
}
|
|
29
|
-
|
|
30
22
|
/**
|
|
31
23
|
* 发消息接口的重试参数。
|
|
32
24
|
*
|
|
@@ -35,51 +27,41 @@ function formatDeliverError(err: unknown): string {
|
|
|
35
27
|
*/
|
|
36
28
|
const IM_SEND_MAX_RETRIES = 5;
|
|
37
29
|
const IM_SEND_RETRY_DELAY_MS = 1_000;
|
|
38
|
-
|
|
39
|
-
function delay(ms: number): Promise<void> {
|
|
30
|
+
function delay(ms) {
|
|
40
31
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
41
32
|
}
|
|
42
|
-
|
|
43
33
|
/**
|
|
44
34
|
* 判断错误是否值得重试。
|
|
45
35
|
*
|
|
46
36
|
* - axios 网络错误 / 超时 / 5xx / 408 / 429 → 重试
|
|
47
37
|
* - 4xx(其它)/ 业务 resultCode 错误(普通 Error)→ 永久失败,不重试
|
|
48
38
|
*/
|
|
49
|
-
function isRetryableSendError(err
|
|
39
|
+
function isRetryableSendError(err) {
|
|
50
40
|
if (axios.isAxiosError(err)) {
|
|
51
41
|
const status = err.response?.status;
|
|
52
|
-
if (status === undefined)
|
|
53
|
-
|
|
54
|
-
if (status
|
|
42
|
+
if (status === undefined)
|
|
43
|
+
return true;
|
|
44
|
+
if (status >= 500)
|
|
45
|
+
return true;
|
|
46
|
+
if (status === 408 || status === 429)
|
|
47
|
+
return true;
|
|
55
48
|
return false;
|
|
56
49
|
}
|
|
57
50
|
return false;
|
|
58
51
|
}
|
|
59
|
-
|
|
60
|
-
async function postImMessage(
|
|
61
|
-
config: XgImConfig,
|
|
62
|
-
token: string,
|
|
63
|
-
groupId: string,
|
|
64
|
-
body: SendMessageBody,
|
|
65
|
-
atUserIds: string[] = [],
|
|
66
|
-
log?: Log,
|
|
67
|
-
): Promise<void> {
|
|
52
|
+
async function postImMessage(config, token, groupId, body, atUserIds = [], log) {
|
|
68
53
|
const url = `${config.baseUrl}/im/message/send`;
|
|
69
|
-
const full
|
|
54
|
+
const full = {
|
|
70
55
|
...body,
|
|
71
56
|
groupId,
|
|
72
57
|
...(atUserIds.length > 0 ? { atUserIds } : {}),
|
|
73
|
-
}
|
|
74
|
-
|
|
58
|
+
};
|
|
75
59
|
log?.info(`[cwork_im:send] POST ${url} groupId=${groupId} type=${full.type} atUsers=${JSON.stringify(atUserIds)}`);
|
|
76
60
|
if (config.debug) {
|
|
77
61
|
log?.debug?.(`[cwork_im:send] Request body: ${JSON.stringify(full)}`);
|
|
78
62
|
}
|
|
79
|
-
|
|
80
63
|
const totalAttempts = 1 + IM_SEND_MAX_RETRIES;
|
|
81
|
-
let lastErr
|
|
82
|
-
|
|
64
|
+
let lastErr = undefined;
|
|
83
65
|
for (let attempt = 1; attempt <= totalAttempts; attempt++) {
|
|
84
66
|
try {
|
|
85
67
|
const res = await axios.post(url, full, {
|
|
@@ -89,74 +71,45 @@ async function postImMessage(
|
|
|
89
71
|
},
|
|
90
72
|
timeout: 10_000,
|
|
91
73
|
});
|
|
92
|
-
|
|
93
74
|
log?.info(`[cwork_im:send] Response status=${res.status} (attempt=${attempt}/${totalAttempts})`);
|
|
94
75
|
if (config.debug) {
|
|
95
76
|
log?.debug?.(`[cwork_im:send] Response body: ${JSON.stringify(res.data)}`);
|
|
96
77
|
}
|
|
97
|
-
|
|
98
78
|
// Detect business-level errors that arrive with HTTP 200.
|
|
99
79
|
// IM API unified response: { data, resultCode: 1, resultMsg: "" } — resultCode=1 means success.
|
|
100
80
|
const d = res.data;
|
|
101
81
|
if (d && typeof d === "object") {
|
|
102
|
-
const resultCode =
|
|
103
|
-
const resultMsg =
|
|
82
|
+
const resultCode = d.resultCode;
|
|
83
|
+
const resultMsg = d.resultMsg;
|
|
104
84
|
if (resultCode !== undefined && resultCode !== 1) {
|
|
105
|
-
throw new Error(
|
|
106
|
-
`IM API error resultCode=${resultCode}${resultMsg ? ` resultMsg=${resultMsg}` : ""}`,
|
|
107
|
-
);
|
|
85
|
+
throw new Error(`IM API error resultCode=${resultCode}${resultMsg ? ` resultMsg=${resultMsg}` : ""}`);
|
|
108
86
|
}
|
|
109
87
|
}
|
|
110
88
|
return;
|
|
111
|
-
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
112
91
|
lastErr = err;
|
|
113
92
|
const msg = formatDeliverError(err);
|
|
114
93
|
const retryable = isRetryableSendError(err);
|
|
115
94
|
const isLast = attempt >= totalAttempts;
|
|
116
|
-
|
|
117
95
|
if (!retryable || isLast) {
|
|
118
|
-
log?.error(
|
|
119
|
-
`
|
|
120
|
-
`(attempt=${attempt}/${totalAttempts}, retryable=${retryable}): ${msg}`,
|
|
121
|
-
);
|
|
96
|
+
log?.error(`[cwork_im:send] Failed to send message to groupId=${groupId} ` +
|
|
97
|
+
`(attempt=${attempt}/${totalAttempts}, retryable=${retryable}): ${msg}`);
|
|
122
98
|
throw err;
|
|
123
99
|
}
|
|
124
|
-
|
|
125
100
|
const warn = log?.warn ?? log?.info;
|
|
126
|
-
warn?.(
|
|
127
|
-
`
|
|
128
|
-
`retrying in ${IM_SEND_RETRY_DELAY_MS}ms: ${msg}`,
|
|
129
|
-
);
|
|
101
|
+
warn?.(`[cwork_im:send] Send failed (attempt=${attempt}/${totalAttempts}), ` +
|
|
102
|
+
`retrying in ${IM_SEND_RETRY_DELAY_MS}ms: ${msg}`);
|
|
130
103
|
await delay(IM_SEND_RETRY_DELAY_MS);
|
|
131
104
|
}
|
|
132
105
|
}
|
|
133
|
-
|
|
134
106
|
// 理论上不可达:上面循环里要么 return 要么 throw。这里只是给 TS 一个安全兜底。
|
|
135
107
|
throw lastErr ?? new Error("[cwork_im:send] Send failed after retries");
|
|
136
108
|
}
|
|
137
|
-
|
|
138
|
-
/** OpenClaw dispatch deliver 单块载荷:文本 + 可选媒体 URL(与 plugin-sdk 约定对齐)。 */
|
|
139
|
-
export type ReplyDeliverPayload = {
|
|
140
|
-
markdown?: string;
|
|
141
|
-
text?: string;
|
|
142
|
-
isThinking?: boolean;
|
|
143
|
-
mediaUrl?: string;
|
|
144
|
-
mediaUrls?: string[];
|
|
145
|
-
};
|
|
146
|
-
|
|
147
109
|
/**
|
|
148
110
|
* 将 deliver 块发到 IM:若有媒体则先 POST baseUrl/file/upDownload/uploadWholeFile 再发 FILE;否则发 RICH_TEXT。
|
|
149
111
|
*/
|
|
150
|
-
export async function sendReplyDeliverBlock(
|
|
151
|
-
config: XgImConfig,
|
|
152
|
-
token: string,
|
|
153
|
-
groupId: string,
|
|
154
|
-
payload: ReplyDeliverPayload,
|
|
155
|
-
atUserIds: string[] = [],
|
|
156
|
-
log?: Log,
|
|
157
|
-
msgId?: string,
|
|
158
|
-
reply?: SendMessageReply,
|
|
159
|
-
): Promise<void> {
|
|
112
|
+
export async function sendReplyDeliverBlock(config, token, groupId, payload, atUserIds = [], log, msgId, reply) {
|
|
160
113
|
const textToSend = (payload.markdown || payload.text || "").trim();
|
|
161
114
|
const mediaList = [
|
|
162
115
|
...(payload.mediaUrl ? [payload.mediaUrl] : []),
|
|
@@ -165,13 +118,11 @@ export async function sendReplyDeliverBlock(
|
|
|
165
118
|
const uniqueUrls = [...new Set(mediaList)];
|
|
166
119
|
const maxBytes = resolveMaxAttachmentBytes(config);
|
|
167
120
|
const formField = config.fileUploadFormField?.trim() || "file";
|
|
168
|
-
|
|
169
121
|
const wantFile = uniqueUrls.length > 0 && !payload.isThinking;
|
|
170
|
-
|
|
171
122
|
if (wantFile) {
|
|
172
123
|
const fileUploadUrl = resolveResourceUploadUrl(config.baseUrl);
|
|
173
124
|
try {
|
|
174
|
-
const attachments
|
|
125
|
+
const attachments = [];
|
|
175
126
|
for (const u of uniqueUrls) {
|
|
176
127
|
const { buffer, filename } = await downloadMediaBuffer(u, maxBytes, log);
|
|
177
128
|
const { fileId } = await uploadWholeResourceFile({
|
|
@@ -192,59 +143,37 @@ export async function sendReplyDeliverBlock(
|
|
|
192
143
|
});
|
|
193
144
|
}
|
|
194
145
|
const caption = textToSend.length > 0 ? textToSend : " ";
|
|
195
|
-
await postImMessage(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
{
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
attachments,
|
|
203
|
-
...(msgId ? { msgId } : {}),
|
|
204
|
-
...(reply ? { reply } : {}),
|
|
205
|
-
},
|
|
206
|
-
atUserIds,
|
|
207
|
-
log,
|
|
208
|
-
);
|
|
146
|
+
await postImMessage(config, token, groupId, {
|
|
147
|
+
type: "FILE",
|
|
148
|
+
text: caption,
|
|
149
|
+
attachments,
|
|
150
|
+
...(msgId ? { msgId } : {}),
|
|
151
|
+
...(reply ? { reply } : {}),
|
|
152
|
+
}, atUserIds, log);
|
|
209
153
|
return;
|
|
210
|
-
}
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
211
156
|
log?.error(`[cwork_im:send] FILE deliver failed, fallback to text if any: ${formatDeliverError(err)}`);
|
|
212
157
|
const errNote = `(文件发送失败:${formatDeliverError(err)})`;
|
|
213
158
|
const fallbackText = textToSend.length > 0 ? `${textToSend}\n\n${errNote}` : errNote;
|
|
214
|
-
await postImMessage(
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
{
|
|
219
|
-
|
|
220
|
-
text: fallbackText,
|
|
221
|
-
...(msgId ? { msgId } : {}),
|
|
222
|
-
...(reply ? { reply } : {}),
|
|
223
|
-
},
|
|
224
|
-
atUserIds,
|
|
225
|
-
log,
|
|
226
|
-
);
|
|
159
|
+
await postImMessage(config, token, groupId, {
|
|
160
|
+
type: "RICH_TEXT",
|
|
161
|
+
text: fallbackText,
|
|
162
|
+
...(msgId ? { msgId } : {}),
|
|
163
|
+
...(reply ? { reply } : {}),
|
|
164
|
+
}, atUserIds, log);
|
|
227
165
|
return;
|
|
228
166
|
}
|
|
229
167
|
}
|
|
230
|
-
|
|
231
168
|
if (textToSend.length > 0) {
|
|
232
|
-
await postImMessage(
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
{
|
|
237
|
-
|
|
238
|
-
text: textToSend,
|
|
239
|
-
...(msgId ? { msgId } : {}),
|
|
240
|
-
...(reply ? { reply } : {}),
|
|
241
|
-
},
|
|
242
|
-
atUserIds,
|
|
243
|
-
log,
|
|
244
|
-
);
|
|
169
|
+
await postImMessage(config, token, groupId, {
|
|
170
|
+
type: "RICH_TEXT",
|
|
171
|
+
text: textToSend,
|
|
172
|
+
...(msgId ? { msgId } : {}),
|
|
173
|
+
...(reply ? { reply } : {}),
|
|
174
|
+
}, atUserIds, log);
|
|
245
175
|
}
|
|
246
176
|
}
|
|
247
|
-
|
|
248
177
|
/**
|
|
249
178
|
* 发送文本消息到指定 IM 群聊。
|
|
250
179
|
*
|
|
@@ -257,27 +186,12 @@ export async function sendReplyDeliverBlock(
|
|
|
257
186
|
* @param msgId 可选的业务消息 ID(用于覆盖/更新已有消息)
|
|
258
187
|
* @param reply 可选的被回复消息信息(用于在 IM 中建立“回复某条消息”的关联)
|
|
259
188
|
*/
|
|
260
|
-
export async function sendTextMessage(
|
|
261
|
-
config
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
msgId?: string,
|
|
268
|
-
reply?: SendMessageReply,
|
|
269
|
-
): Promise<void> {
|
|
270
|
-
await postImMessage(
|
|
271
|
-
config,
|
|
272
|
-
token,
|
|
273
|
-
groupId,
|
|
274
|
-
{
|
|
275
|
-
type: "RICH_TEXT",
|
|
276
|
-
text: content,
|
|
277
|
-
...(msgId ? { msgId } : {}),
|
|
278
|
-
...(reply ? { reply } : {}),
|
|
279
|
-
},
|
|
280
|
-
atUserIds,
|
|
281
|
-
log,
|
|
282
|
-
);
|
|
189
|
+
export async function sendTextMessage(config, token, groupId, content, atUserIds = [], log, msgId, reply) {
|
|
190
|
+
await postImMessage(config, token, groupId, {
|
|
191
|
+
type: "RICH_TEXT",
|
|
192
|
+
text: content,
|
|
193
|
+
...(msgId ? { msgId } : {}),
|
|
194
|
+
...(reply ? { reply } : {}),
|
|
195
|
+
}, atUserIds, log);
|
|
283
196
|
}
|
|
197
|
+
//# sourceMappingURL=send-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-service.js","sourceRoot":"","sources":["../../src/send-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,14 @@
|
|
|
1
|
-
import type { AnyAgentTool } from "openclaw/plugin-sdk";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (payload === undefined) {
|
|
16
|
-
return { content: [{ type: "text", text: "" }] } as ToolExecuteReturn;
|
|
17
|
-
}
|
|
18
|
-
const text =
|
|
19
|
-
typeof payload === "string" ? JSON.stringify(payload) : JSON.stringify(payload, null, 2);
|
|
20
|
-
return {
|
|
21
|
-
content: [{ type: "text", text }],
|
|
22
|
-
details: payload,
|
|
23
|
-
} as ToolExecuteReturn;
|
|
24
|
-
}
|
|
1
|
+
import type { AnyAgentTool } from "openclaw/plugin-sdk";
|
|
2
|
+
type ToolExecuteReturn = Awaited<ReturnType<NonNullable<AnyAgentTool["execute"]>>>;
|
|
3
|
+
/**
|
|
4
|
+
* 与 `openclaw/plugin-sdk` 的 `jsonResult` 返回结构一致(AgentToolResult),
|
|
5
|
+
* 供工具 `execute` 使用。
|
|
6
|
+
*
|
|
7
|
+
* 部分环境下网关打包插件后,`import { jsonResult } from "openclaw/plugin-sdk"` 会变成
|
|
8
|
+
* `_pluginSdk.jsonResult` 且值为 `undefined`,调用时报
|
|
9
|
+
* `(0 , _pluginSdk.jsonResult) is not a function`。
|
|
10
|
+
* 使用本函数可避免依赖该命名导出在打包产物中是否保留。
|
|
11
|
+
*/
|
|
12
|
+
export declare function toolJsonResult(payload: unknown): ToolExecuteReturn;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=tool-json-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-json-result.d.ts","sourceRoot":"","sources":["../../src/tool-json-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAUlE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 与 `openclaw/plugin-sdk` 的 `jsonResult` 返回结构一致(AgentToolResult),
|
|
3
|
+
* 供工具 `execute` 使用。
|
|
4
|
+
*
|
|
5
|
+
* 部分环境下网关打包插件后,`import { jsonResult } from "openclaw/plugin-sdk"` 会变成
|
|
6
|
+
* `_pluginSdk.jsonResult` 且值为 `undefined`,调用时报
|
|
7
|
+
* `(0 , _pluginSdk.jsonResult) is not a function`。
|
|
8
|
+
* 使用本函数可避免依赖该命名导出在打包产物中是否保留。
|
|
9
|
+
*/
|
|
10
|
+
export function toolJsonResult(payload) {
|
|
11
|
+
if (payload === undefined) {
|
|
12
|
+
return { content: [{ type: "text", text: "" }] };
|
|
13
|
+
}
|
|
14
|
+
const text = typeof payload === "string" ? JSON.stringify(payload) : JSON.stringify(payload, null, 2);
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: "text", text }],
|
|
17
|
+
details: payload,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=tool-json-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-json-result.js","sourceRoot":"","sources":["../../src/tool-json-result.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAuB,CAAC;IAC1E,CAAC;IACD,MAAM,IAAI,GACN,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7F,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO;KACE,CAAC;AAC3B,CAAC"}
|
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* XG-IM Channel Plugin — 类型定义
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import type {
|
|
6
|
-
OpenClawConfig,
|
|
7
|
-
OpenClawPluginApi,
|
|
8
|
-
ChannelLogSink as SDKChannelLogSink,
|
|
9
|
-
ChannelAccountSnapshot as SDKChannelAccountSnapshot,
|
|
10
|
-
ChannelGatewayContext as SDKChannelGatewayContext,
|
|
11
|
-
ChannelPlugin as SDKChannelPlugin,
|
|
12
|
-
PluginRuntime,
|
|
13
|
-
} from "openclaw/plugin-sdk";
|
|
14
|
-
|
|
15
|
-
// ─── 插件模块 ───────────────────────────────────────────────────────────────
|
|
16
|
-
|
|
4
|
+
import type { OpenClawConfig, OpenClawPluginApi, ChannelLogSink as SDKChannelLogSink, ChannelAccountSnapshot as SDKChannelAccountSnapshot, ChannelGatewayContext as SDKChannelGatewayContext, ChannelPlugin as SDKChannelPlugin, PluginRuntime } from "openclaw/plugin-sdk";
|
|
17
5
|
export interface XgImPluginModule {
|
|
18
6
|
id: string;
|
|
19
7
|
name: string;
|
|
@@ -21,12 +9,8 @@ export interface XgImPluginModule {
|
|
|
21
9
|
configSchema?: unknown;
|
|
22
10
|
register?: (api: OpenClawPluginApi) => void | Promise<void>;
|
|
23
11
|
}
|
|
24
|
-
|
|
25
12
|
/** 与 openclaw.plugin.json 中 id: xg_cwork_im 对应 */
|
|
26
13
|
export type XgCworkImPluginModule = XgImPluginModule;
|
|
27
|
-
|
|
28
|
-
// ─── Channel 配置 ────────────────────────────────────────────────────────────
|
|
29
|
-
|
|
30
14
|
/** 单个机器人账户配置 */
|
|
31
15
|
export interface XgImAccountConfig {
|
|
32
16
|
/** 机器人 Key(新字段,优先于 appKey) */
|
|
@@ -62,11 +46,9 @@ export interface XgImAccountConfig {
|
|
|
62
46
|
*/
|
|
63
47
|
systemPrompt?: string;
|
|
64
48
|
}
|
|
65
|
-
|
|
66
49
|
export interface XgImConfig extends OpenClawConfig {
|
|
67
50
|
/** 多账户列表 */
|
|
68
51
|
accounts?: Record<string, XgImAccountConfig>;
|
|
69
|
-
|
|
70
52
|
/** 机器人 Key(新字段,优先于 appKey,单账户模式) */
|
|
71
53
|
robotKey?: string;
|
|
72
54
|
/** 机器人 appKey(单账户模式,已改名为 robotKey,此字段保留兼容旧配置) */
|
|
@@ -102,7 +84,6 @@ export interface XgImConfig extends OpenClawConfig {
|
|
|
102
84
|
* - 仅用于保护「思考中」占位消息,避免长时间不被更新。
|
|
103
85
|
*/
|
|
104
86
|
firstReplyTimeoutMs?: number;
|
|
105
|
-
|
|
106
87
|
/**
|
|
107
88
|
* 附件上传地址固定为 `{baseUrl}/file/upDownload/uploadWholeFile`,请求头 `access-token` 与发 IM 相同。
|
|
108
89
|
* multipart 字段名默认 `file`,可通过 fileUploadFormField 覆盖。
|
|
@@ -110,7 +91,6 @@ export interface XgImConfig extends OpenClawConfig {
|
|
|
110
91
|
fileUploadFormField?: string;
|
|
111
92
|
/** 单个附件下载/上传允许的最大字节数,默认 50MB */
|
|
112
93
|
maxAttachmentBytes?: number;
|
|
113
|
-
|
|
114
94
|
/**
|
|
115
95
|
* 若配置为非空相对路径(相对于当前 Agent workspace 根目录):入站附件会先下载到
|
|
116
96
|
* `{workspace}/{本字段}/{userId}/{YYYY-MM-DD}/{name}_{HHmmssmmm}.ext`,再向 OpenClaw 传入 **workspace 相对路径**(默认 `./子目录/...`,便于沙箱挂载 `/workspace`)或 `file://`(见 `inboundMediaOpenClawPath`)。
|
|
@@ -130,9 +110,6 @@ export interface XgImConfig extends OpenClawConfig {
|
|
|
130
110
|
*/
|
|
131
111
|
systemPrompt?: string;
|
|
132
112
|
}
|
|
133
|
-
|
|
134
|
-
// ─── IM 接口 Request / Response ─────────────────────────────────────────────
|
|
135
|
-
|
|
136
113
|
/** GET /user/login/appkey 的响应 */
|
|
137
114
|
export interface GetTokenResponse {
|
|
138
115
|
data?: {
|
|
@@ -149,23 +126,18 @@ export interface GetTokenResponse {
|
|
|
149
126
|
resultCode?: number;
|
|
150
127
|
resultMsg?: string | null;
|
|
151
128
|
}
|
|
152
|
-
|
|
153
129
|
/** 机器人身份信息(认证成功后缓存) */
|
|
154
130
|
export interface BotIdentity {
|
|
155
131
|
token: string;
|
|
156
132
|
userId: string;
|
|
157
133
|
name: string;
|
|
158
134
|
}
|
|
159
|
-
|
|
160
|
-
// ─── WebSocket 消息 ──────────────────────────────────────────────────────────
|
|
161
|
-
|
|
162
135
|
/** WebSocket 消息通知(cmd = robotMention) */
|
|
163
136
|
export interface WsMessage {
|
|
164
137
|
cmd: string;
|
|
165
138
|
params: WsMessageParams;
|
|
166
139
|
ts: number;
|
|
167
140
|
}
|
|
168
|
-
|
|
169
141
|
/**
|
|
170
142
|
* 与 IM 服务 `MsgFileVO` 对齐的附件项(WebSocket `msgContent.files[]`)。
|
|
171
143
|
*/
|
|
@@ -186,38 +158,10 @@ export interface MsgFileVO {
|
|
|
186
158
|
*/
|
|
187
159
|
content?: string;
|
|
188
160
|
}
|
|
189
|
-
|
|
190
161
|
/** @deprecated 使用 {@link MsgFileVO} */
|
|
191
162
|
export type WsInboundFileItem = MsgFileVO;
|
|
192
|
-
|
|
193
163
|
/** 常见 IM format → MIME,供 OpenClaw 媒体理解;未知格式返回 undefined */
|
|
194
|
-
export function imFormatToMimeType(format: string | undefined): string | undefined
|
|
195
|
-
const f = format?.trim().toLowerCase();
|
|
196
|
-
if (!f) return undefined;
|
|
197
|
-
const map: Record<string, string> = {
|
|
198
|
-
pdf: "application/pdf",
|
|
199
|
-
png: "image/png",
|
|
200
|
-
jpg: "image/jpeg",
|
|
201
|
-
jpeg: "image/jpeg",
|
|
202
|
-
gif: "image/gif",
|
|
203
|
-
webp: "image/webp",
|
|
204
|
-
doc: "application/msword",
|
|
205
|
-
docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
206
|
-
ppt: "application/vnd.ms-powerpoint",
|
|
207
|
-
pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
208
|
-
xls: "application/vnd.ms-excel",
|
|
209
|
-
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
210
|
-
txt: "text/plain",
|
|
211
|
-
md: "text/markdown",
|
|
212
|
-
csv: "text/csv",
|
|
213
|
-
zip: "application/zip",
|
|
214
|
-
mp3: "audio/mpeg",
|
|
215
|
-
wav: "audio/wav",
|
|
216
|
-
mp4: "video/mp4",
|
|
217
|
-
};
|
|
218
|
-
return map[f];
|
|
219
|
-
}
|
|
220
|
-
|
|
164
|
+
export declare function imFormatToMimeType(format: string | undefined): string | undefined;
|
|
221
165
|
/**
|
|
222
166
|
* 入站消息内容体(与 IM WebSocket `params.msgContent` 对齐)。
|
|
223
167
|
*
|
|
@@ -234,7 +178,6 @@ export interface WsMessageContent {
|
|
|
234
178
|
files?: MsgFileVO[];
|
|
235
179
|
ext?: Record<string, any>;
|
|
236
180
|
}
|
|
237
|
-
|
|
238
181
|
/** robotMention 消息的 params */
|
|
239
182
|
export interface WsMessageParams {
|
|
240
183
|
msgId: string;
|
|
@@ -258,9 +201,6 @@ export interface WsMessageParams {
|
|
|
258
201
|
/** 被 @ 的人员 ID 列表 */
|
|
259
202
|
mentions?: string[] | null;
|
|
260
203
|
}
|
|
261
|
-
|
|
262
|
-
// ─── IM 发送消息 ─────────────────────────────────────────────────────────────
|
|
263
|
-
|
|
264
204
|
/** POST /im/message/send 请求体 */
|
|
265
205
|
export interface SendMessageReply {
|
|
266
206
|
/** 被回复消息ID */
|
|
@@ -272,7 +212,6 @@ export interface SendMessageReply {
|
|
|
272
212
|
/** 被回复消息摘要 */
|
|
273
213
|
previewText: string;
|
|
274
214
|
}
|
|
275
|
-
|
|
276
215
|
/** IM 发送 FILE 类型消息时的附件项(与发消息接口约定一致) */
|
|
277
216
|
export interface SendMessageFileAttachment {
|
|
278
217
|
fileId: string;
|
|
@@ -285,42 +224,34 @@ export interface SendMessageFileAttachment {
|
|
|
285
224
|
/** 固定为 resource */
|
|
286
225
|
source: "resource";
|
|
287
226
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
msgId?: string;
|
|
309
|
-
reply?: SendMessageReply;
|
|
310
|
-
};
|
|
311
|
-
|
|
227
|
+
export type SendMessageBody = {
|
|
228
|
+
type: "TEXT" | "RICH_TEXT" | "VOICE";
|
|
229
|
+
groupId?: string;
|
|
230
|
+
toUserId?: string;
|
|
231
|
+
text: string;
|
|
232
|
+
atUserIds?: string[];
|
|
233
|
+
/** 流式占位消息 ID,用于将回复更新到对应的占位消息上 */
|
|
234
|
+
msgId?: string;
|
|
235
|
+
reply?: SendMessageReply;
|
|
236
|
+
} | {
|
|
237
|
+
type: "FILE";
|
|
238
|
+
groupId?: string;
|
|
239
|
+
toUserId?: string;
|
|
240
|
+
text: string;
|
|
241
|
+
attachments: SendMessageFileAttachment[];
|
|
242
|
+
atUserIds?: string[];
|
|
243
|
+
/** 流式占位消息 ID,用于将回复更新到对应的占位消息上 */
|
|
244
|
+
msgId?: string;
|
|
245
|
+
reply?: SendMessageReply;
|
|
246
|
+
};
|
|
312
247
|
/** GET /im/message/getLatestMsgListForAI 响应 */
|
|
313
248
|
export interface GetLatestMsgListResponse {
|
|
314
249
|
data?: WsMessageParams[];
|
|
315
250
|
resultCode?: number;
|
|
316
251
|
message?: string;
|
|
317
252
|
}
|
|
318
|
-
|
|
319
|
-
// ─── OpenClaw 插件 SDK 类型别名 ───────────────────────────────────────────────
|
|
320
|
-
|
|
321
253
|
export type ChannelLogSink = SDKChannelLogSink;
|
|
322
254
|
export type ChannelAccountSnapshot = SDKChannelAccountSnapshot;
|
|
323
|
-
|
|
324
255
|
export interface ResolvedAccount {
|
|
325
256
|
accountId: string;
|
|
326
257
|
config: XgImConfig;
|
|
@@ -328,9 +259,10 @@ export interface ResolvedAccount {
|
|
|
328
259
|
configured: boolean;
|
|
329
260
|
name?: string | null;
|
|
330
261
|
}
|
|
331
|
-
|
|
332
262
|
export type GatewayStartContext = SDKChannelGatewayContext<ResolvedAccount>;
|
|
333
|
-
export type XgImChannelPlugin = SDKChannelPlugin<ResolvedAccount & {
|
|
334
|
-
|
|
263
|
+
export type XgImChannelPlugin = SDKChannelPlugin<ResolvedAccount & {
|
|
264
|
+
configured: boolean;
|
|
265
|
+
}>;
|
|
335
266
|
/** PluginRuntime 的类型(内部 API 丰富,用 any 表示) */
|
|
336
267
|
export type { PluginRuntime };
|
|
268
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,cAAc,EACd,iBAAiB,EACjB,cAAc,IAAI,iBAAiB,EACnC,sBAAsB,IAAI,yBAAyB,EACnD,qBAAqB,IAAI,wBAAwB,EACjD,aAAa,IAAI,gBAAgB,EACjC,aAAa,EAChB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED,kDAAkD;AAClD,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAIrD,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAClD,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;IACnE;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IAC9C,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAE7C,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oBAAoB;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,0BAA0B;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gCAAgC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;IACnE,gEAAgE;IAChE,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,uBAAuB;AACvB,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAID,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,eAAe,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,uCAAuC;AACvC,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE1C,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAyBjF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC7B,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY;IACZ,QAAQ,EAAE;QACN,aAAa;QACb,EAAE,EAAE,MAAM,CAAC;QACX,aAAa;QACb,IAAI,EAAE,MAAM,CAAC;QACb;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,UAAU,EAAE,gBAAgB,CAAC;IAC7B,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC9B;AAID,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC7B,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,uCAAuC;AACvC,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,MAAM,eAAe,GACrB;IACI,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC5B,GACD;IACI,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAER,+CAA+C;AAC/C,MAAM,WAAW,wBAAwB;IACrC,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAC/C,MAAM,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;AAC5E,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,eAAe,GAAG;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAE5F,4CAA4C;AAC5C,YAAY,EAAE,aAAa,EAAE,CAAC"}
|