@xwang152/claw-lark 0.1.22 → 0.1.24
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/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/src/media.d.ts +63 -0
- package/dist/src/media.js +259 -0
- package/dist/src/media.js.map +1 -1
- package/dist/src/mention.d.ts +17 -0
- package/dist/src/mention.js +22 -0
- package/dist/src/mention.js.map +1 -1
- package/dist/src/message-context.d.ts +65 -0
- package/dist/src/message-context.js +105 -0
- package/dist/src/message-context.js.map +1 -0
- package/dist/src/monitor.js +55 -3
- package/dist/src/monitor.js.map +1 -1
- package/dist/src/sender-name.d.ts +54 -0
- package/dist/src/sender-name.js +108 -0
- package/dist/src/sender-name.js.map +1 -0
- package/dist/src/typing.d.ts +76 -0
- package/dist/src/typing.js +165 -0
- package/dist/src/typing.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,9 +12,13 @@ export { createLarkClient, createLarkWSClient } from "./src/client.js";
|
|
|
12
12
|
export { monitorLarkProvider, stopMonitor } from "./src/monitor.js";
|
|
13
13
|
export { startWebhookServer } from "./src/webhook.js";
|
|
14
14
|
export { listLarkDirectoryPeers, listLarkDirectoryGroups } from "./src/directory.js";
|
|
15
|
-
export { downloadImageLark, downloadFileLark } from "./src/media.js";
|
|
15
|
+
export { downloadImageLark, downloadFileLark, uploadImageLark, uploadFileLark, sendImageLark, sendFileLark, sendMediaLark, detectFileType, } from "./src/media.js";
|
|
16
16
|
export { addReactionLark, removeReactionLark, listReactionsLark } from "./src/reactions.js";
|
|
17
|
-
export { extractMentionTargets, extractMessageBody, isMentionForwardRequest, formatMentionForText, formatMentionForCard, formatMentionAllForText, formatMentionAllForCard, } from "./src/mention.js";
|
|
17
|
+
export { extractMentionTargets, extractMessageBody, isMentionForwardRequest, formatMentionForText, formatMentionForCard, formatMentionAllForText, formatMentionAllForCard, buildMentionedMessage, buildMentionedCardContent, } from "./src/mention.js";
|
|
18
|
+
export { addTypingIndicator, removeTypingIndicator, createTypingController, } from "./src/typing.js";
|
|
19
|
+
export type { TypingIndicatorState } from "./src/typing.js";
|
|
20
|
+
export { resolveLarkSenderName, clearSenderNameCache, getSenderNameCacheStats, prefetchLarkSenderNames, } from "./src/sender-name.js";
|
|
21
|
+
export { getLarkMessage, formatQuotedContext, isReplyMessage, buildMessageContextWithQuote, } from "./src/message-context.js";
|
|
18
22
|
export type { LarkDomain, LarkConnectionMode, LarkAccountConfig, ResolvedLarkAccount, LarkChannelConfig, LarkMessageEvent, ParsedMessage, SendResult, } from "./src/types.js";
|
|
19
23
|
declare const plugin: {
|
|
20
24
|
id: string;
|
package/dist/index.js
CHANGED
|
@@ -16,9 +16,12 @@ export { createLarkClient, createLarkWSClient } from "./src/client.js";
|
|
|
16
16
|
export { monitorLarkProvider, stopMonitor } from "./src/monitor.js";
|
|
17
17
|
export { startWebhookServer } from "./src/webhook.js";
|
|
18
18
|
export { listLarkDirectoryPeers, listLarkDirectoryGroups } from "./src/directory.js";
|
|
19
|
-
export { downloadImageLark, downloadFileLark } from "./src/media.js";
|
|
19
|
+
export { downloadImageLark, downloadFileLark, uploadImageLark, uploadFileLark, sendImageLark, sendFileLark, sendMediaLark, detectFileType, } from "./src/media.js";
|
|
20
20
|
export { addReactionLark, removeReactionLark, listReactionsLark } from "./src/reactions.js";
|
|
21
|
-
export { extractMentionTargets, extractMessageBody, isMentionForwardRequest, formatMentionForText, formatMentionForCard, formatMentionAllForText, formatMentionAllForCard, } from "./src/mention.js";
|
|
21
|
+
export { extractMentionTargets, extractMessageBody, isMentionForwardRequest, formatMentionForText, formatMentionForCard, formatMentionAllForText, formatMentionAllForCard, buildMentionedMessage, buildMentionedCardContent, } from "./src/mention.js";
|
|
22
|
+
export { addTypingIndicator, removeTypingIndicator, createTypingController, } from "./src/typing.js";
|
|
23
|
+
export { resolveLarkSenderName, clearSenderNameCache, getSenderNameCacheStats, prefetchLarkSenderNames, } from "./src/sender-name.js";
|
|
24
|
+
export { getLarkMessage, formatQuotedContext, isReplyMessage, buildMessageContextWithQuote, } from "./src/message-context.js";
|
|
22
25
|
const plugin = {
|
|
23
26
|
id: "claw-lark",
|
|
24
27
|
name: "Lark",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,mCAAmC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,mCAAmC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAYlC,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,4CAA4C;IACzD,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC7B,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,wCAAwC;QACxC,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5C,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/src/media.d.ts
CHANGED
|
@@ -19,3 +19,66 @@ export declare function downloadFileLark(params: {
|
|
|
19
19
|
fileKey: string;
|
|
20
20
|
type: "file" | "image" | "media";
|
|
21
21
|
}): Promise<DownloadImageResult>;
|
|
22
|
+
export type UploadImageResult = {
|
|
23
|
+
imageKey: string;
|
|
24
|
+
};
|
|
25
|
+
export type UploadFileResult = {
|
|
26
|
+
fileKey: string;
|
|
27
|
+
};
|
|
28
|
+
export type SendMediaResult = {
|
|
29
|
+
messageId: string;
|
|
30
|
+
chatId: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Upload an image to Lark and get an image_key for sending.
|
|
34
|
+
* Supports: JPEG, PNG, WEBP, GIF, TIFF, BMP, ICO
|
|
35
|
+
*/
|
|
36
|
+
export declare function uploadImageLark(params: {
|
|
37
|
+
account: ResolvedLarkAccount;
|
|
38
|
+
image: Buffer | string;
|
|
39
|
+
imageType?: "message" | "avatar";
|
|
40
|
+
}): Promise<UploadImageResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Upload a file to Lark and get a file_key for sending.
|
|
43
|
+
* Max file size: 30MB
|
|
44
|
+
*/
|
|
45
|
+
export declare function uploadFileLark(params: {
|
|
46
|
+
account: ResolvedLarkAccount;
|
|
47
|
+
file: Buffer | string;
|
|
48
|
+
fileName: string;
|
|
49
|
+
fileType: "opus" | "mp4" | "pdf" | "doc" | "xls" | "ppt" | "stream";
|
|
50
|
+
duration?: number;
|
|
51
|
+
}): Promise<UploadFileResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Send an image message using an image_key
|
|
54
|
+
*/
|
|
55
|
+
export declare function sendImageLark(params: {
|
|
56
|
+
account: ResolvedLarkAccount;
|
|
57
|
+
to: string;
|
|
58
|
+
imageKey: string;
|
|
59
|
+
replyToMessageId?: string;
|
|
60
|
+
}): Promise<SendMediaResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Send a file message using a file_key
|
|
63
|
+
*/
|
|
64
|
+
export declare function sendFileLark(params: {
|
|
65
|
+
account: ResolvedLarkAccount;
|
|
66
|
+
to: string;
|
|
67
|
+
fileKey: string;
|
|
68
|
+
replyToMessageId?: string;
|
|
69
|
+
}): Promise<SendMediaResult>;
|
|
70
|
+
/**
|
|
71
|
+
* Helper to detect file type from extension
|
|
72
|
+
*/
|
|
73
|
+
export declare function detectFileType(fileName: string): "opus" | "mp4" | "pdf" | "doc" | "xls" | "ppt" | "stream";
|
|
74
|
+
/**
|
|
75
|
+
* Upload and send media (image or file) from URL, local path, or buffer
|
|
76
|
+
*/
|
|
77
|
+
export declare function sendMediaLark(params: {
|
|
78
|
+
account: ResolvedLarkAccount;
|
|
79
|
+
to: string;
|
|
80
|
+
mediaUrl?: string;
|
|
81
|
+
mediaBuffer?: Buffer;
|
|
82
|
+
fileName?: string;
|
|
83
|
+
replyToMessageId?: string;
|
|
84
|
+
}): Promise<SendMediaResult>;
|
package/dist/src/media.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createLarkClient } from "./client.js";
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import os from "os";
|
|
5
|
+
import { Readable } from "stream";
|
|
5
6
|
/**
|
|
6
7
|
* Download an image from Lark using image_key.
|
|
7
8
|
*/
|
|
@@ -97,4 +98,262 @@ async function processResponseData(response, responseAny, tempPrefix) {
|
|
|
97
98
|
}
|
|
98
99
|
return buffer;
|
|
99
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Upload an image to Lark and get an image_key for sending.
|
|
103
|
+
* Supports: JPEG, PNG, WEBP, GIF, TIFF, BMP, ICO
|
|
104
|
+
*/
|
|
105
|
+
export async function uploadImageLark(params) {
|
|
106
|
+
const { account, image, imageType = "message" } = params;
|
|
107
|
+
const client = createLarkClient(account);
|
|
108
|
+
// SDK expects a Readable stream, not a Buffer
|
|
109
|
+
// Use type assertion since SDK actually accepts any Readable at runtime
|
|
110
|
+
const imageStream = typeof image === "string" ? fs.createReadStream(image) : Readable.from(image);
|
|
111
|
+
const response = await client.im.image.create({
|
|
112
|
+
data: {
|
|
113
|
+
image_type: imageType,
|
|
114
|
+
image: imageStream,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
// SDK v1.30+ returns data directly without code wrapper on success
|
|
118
|
+
// On error, it throws or returns { code, msg }
|
|
119
|
+
const responseAny = response;
|
|
120
|
+
if (responseAny.code !== undefined && responseAny.code !== 0) {
|
|
121
|
+
throw new Error(`Lark image upload failed: ${responseAny.msg || `code ${responseAny.code}`}`);
|
|
122
|
+
}
|
|
123
|
+
const imageKey = responseAny.image_key ?? responseAny.data?.image_key;
|
|
124
|
+
if (!imageKey) {
|
|
125
|
+
throw new Error("Lark image upload failed: no image_key returned");
|
|
126
|
+
}
|
|
127
|
+
return { imageKey };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Upload a file to Lark and get a file_key for sending.
|
|
131
|
+
* Max file size: 30MB
|
|
132
|
+
*/
|
|
133
|
+
export async function uploadFileLark(params) {
|
|
134
|
+
const { account, file, fileName, fileType, duration } = params;
|
|
135
|
+
const client = createLarkClient(account);
|
|
136
|
+
// SDK expects a Readable stream, not a Buffer
|
|
137
|
+
// Use type assertion since SDK actually accepts any Readable at runtime
|
|
138
|
+
const fileStream = typeof file === "string" ? fs.createReadStream(file) : Readable.from(file);
|
|
139
|
+
const response = await client.im.file.create({
|
|
140
|
+
data: {
|
|
141
|
+
file_type: fileType,
|
|
142
|
+
file_name: fileName,
|
|
143
|
+
file: fileStream,
|
|
144
|
+
...(duration !== undefined && { duration }),
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
// SDK v1.30+ returns data directly without code wrapper on success
|
|
148
|
+
const responseAny = response;
|
|
149
|
+
if (responseAny.code !== undefined && responseAny.code !== 0) {
|
|
150
|
+
throw new Error(`Lark file upload failed: ${responseAny.msg || `code ${responseAny.code}`}`);
|
|
151
|
+
}
|
|
152
|
+
const fileKey = responseAny.file_key ?? responseAny.data?.file_key;
|
|
153
|
+
if (!fileKey) {
|
|
154
|
+
throw new Error("Lark file upload failed: no file_key returned");
|
|
155
|
+
}
|
|
156
|
+
return { fileKey };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Send an image message using an image_key
|
|
160
|
+
*/
|
|
161
|
+
export async function sendImageLark(params) {
|
|
162
|
+
const { account, to, imageKey, replyToMessageId } = params;
|
|
163
|
+
const client = createLarkClient(account);
|
|
164
|
+
const receiveId = to;
|
|
165
|
+
const content = JSON.stringify({ image_key: imageKey });
|
|
166
|
+
// Determine receive_id_type from recipient ID format
|
|
167
|
+
const inferReceiveIdType = (recipientId) => {
|
|
168
|
+
if (recipientId.startsWith("oc_"))
|
|
169
|
+
return "chat_id";
|
|
170
|
+
if (recipientId.startsWith("ou_"))
|
|
171
|
+
return "open_id";
|
|
172
|
+
if (recipientId.startsWith("on_"))
|
|
173
|
+
return "union_id";
|
|
174
|
+
return "open_id";
|
|
175
|
+
};
|
|
176
|
+
const receiveIdType = inferReceiveIdType(receiveId);
|
|
177
|
+
if (replyToMessageId) {
|
|
178
|
+
const response = await client.im.message.reply({
|
|
179
|
+
path: { message_id: replyToMessageId },
|
|
180
|
+
data: {
|
|
181
|
+
content,
|
|
182
|
+
msg_type: "image",
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
if (response.code !== 0) {
|
|
186
|
+
throw new Error(`Lark image reply failed: ${response.msg || `code ${response.code}`}`);
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
messageId: response.data?.message_id ?? "unknown",
|
|
190
|
+
chatId: receiveId,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const response = await client.im.message.create({
|
|
194
|
+
params: { receive_id_type: receiveIdType },
|
|
195
|
+
data: {
|
|
196
|
+
receive_id: receiveId,
|
|
197
|
+
content,
|
|
198
|
+
msg_type: "image",
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
if (response.code !== 0) {
|
|
202
|
+
throw new Error(`Lark image send failed: ${response.msg || `code ${response.code}`}`);
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
messageId: response.data?.message_id ?? "unknown",
|
|
206
|
+
chatId: receiveId,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Send a file message using a file_key
|
|
211
|
+
*/
|
|
212
|
+
export async function sendFileLark(params) {
|
|
213
|
+
const { account, to, fileKey, replyToMessageId } = params;
|
|
214
|
+
const client = createLarkClient(account);
|
|
215
|
+
const receiveId = to;
|
|
216
|
+
const content = JSON.stringify({ file_key: fileKey });
|
|
217
|
+
// Determine receive_id_type from recipient ID format
|
|
218
|
+
const inferReceiveIdType = (recipientId) => {
|
|
219
|
+
if (recipientId.startsWith("oc_"))
|
|
220
|
+
return "chat_id";
|
|
221
|
+
if (recipientId.startsWith("ou_"))
|
|
222
|
+
return "open_id";
|
|
223
|
+
if (recipientId.startsWith("on_"))
|
|
224
|
+
return "union_id";
|
|
225
|
+
return "open_id";
|
|
226
|
+
};
|
|
227
|
+
const receiveIdType = inferReceiveIdType(receiveId);
|
|
228
|
+
if (replyToMessageId) {
|
|
229
|
+
const response = await client.im.message.reply({
|
|
230
|
+
path: { message_id: replyToMessageId },
|
|
231
|
+
data: {
|
|
232
|
+
content,
|
|
233
|
+
msg_type: "file",
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
if (response.code !== 0) {
|
|
237
|
+
throw new Error(`Lark file reply failed: ${response.msg || `code ${response.code}`}`);
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
messageId: response.data?.message_id ?? "unknown",
|
|
241
|
+
chatId: receiveId,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
const response = await client.im.message.create({
|
|
245
|
+
params: { receive_id_type: receiveIdType },
|
|
246
|
+
data: {
|
|
247
|
+
receive_id: receiveId,
|
|
248
|
+
content,
|
|
249
|
+
msg_type: "file",
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
if (response.code !== 0) {
|
|
253
|
+
throw new Error(`Lark file send failed: ${response.msg || `code ${response.code}`}`);
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
messageId: response.data?.message_id ?? "unknown",
|
|
257
|
+
chatId: receiveId,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Helper to detect file type from extension
|
|
262
|
+
*/
|
|
263
|
+
export function detectFileType(fileName) {
|
|
264
|
+
const ext = path.extname(fileName).toLowerCase();
|
|
265
|
+
switch (ext) {
|
|
266
|
+
case ".opus":
|
|
267
|
+
case ".ogg":
|
|
268
|
+
return "opus";
|
|
269
|
+
case ".mp4":
|
|
270
|
+
case ".mov":
|
|
271
|
+
case ".avi":
|
|
272
|
+
return "mp4";
|
|
273
|
+
case ".pdf":
|
|
274
|
+
return "pdf";
|
|
275
|
+
case ".doc":
|
|
276
|
+
case ".docx":
|
|
277
|
+
return "doc";
|
|
278
|
+
case ".xls":
|
|
279
|
+
case ".xlsx":
|
|
280
|
+
return "xls";
|
|
281
|
+
case ".ppt":
|
|
282
|
+
case ".pptx":
|
|
283
|
+
return "ppt";
|
|
284
|
+
default:
|
|
285
|
+
return "stream";
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Check if a string is a local file path (not a URL)
|
|
290
|
+
*/
|
|
291
|
+
function isLocalPath(urlOrPath) {
|
|
292
|
+
// Starts with / or ~ or drive letter (Windows)
|
|
293
|
+
if (urlOrPath.startsWith("/") || urlOrPath.startsWith("~") || /^[a-zA-Z]:/.test(urlOrPath)) {
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
// Try to parse as URL - if it fails or has no protocol, it's likely a local path
|
|
297
|
+
try {
|
|
298
|
+
const url = new URL(urlOrPath);
|
|
299
|
+
return url.protocol === "file:";
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return true; // Not a valid URL, treat as local path
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Upload and send media (image or file) from URL, local path, or buffer
|
|
307
|
+
*/
|
|
308
|
+
export async function sendMediaLark(params) {
|
|
309
|
+
const { account, to, mediaUrl, mediaBuffer, fileName, replyToMessageId } = params;
|
|
310
|
+
let buffer;
|
|
311
|
+
let name;
|
|
312
|
+
if (mediaBuffer) {
|
|
313
|
+
buffer = mediaBuffer;
|
|
314
|
+
name = fileName ?? "file";
|
|
315
|
+
}
|
|
316
|
+
else if (mediaUrl) {
|
|
317
|
+
if (isLocalPath(mediaUrl)) {
|
|
318
|
+
// Local file path - read directly
|
|
319
|
+
const filePath = mediaUrl.startsWith("~")
|
|
320
|
+
? mediaUrl.replace("~", process.env.HOME ?? "")
|
|
321
|
+
: mediaUrl.replace("file://", "");
|
|
322
|
+
if (!fs.existsSync(filePath)) {
|
|
323
|
+
throw new Error(`Local file not found: ${filePath}`);
|
|
324
|
+
}
|
|
325
|
+
buffer = fs.readFileSync(filePath);
|
|
326
|
+
name = fileName ?? path.basename(filePath);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
// Remote URL - fetch
|
|
330
|
+
const response = await fetch(mediaUrl);
|
|
331
|
+
if (!response.ok) {
|
|
332
|
+
throw new Error(`Failed to fetch media from URL: ${response.status}`);
|
|
333
|
+
}
|
|
334
|
+
buffer = Buffer.from(await response.arrayBuffer());
|
|
335
|
+
name = fileName ?? (path.basename(new URL(mediaUrl).pathname) || "file");
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
throw new Error("Either mediaUrl or mediaBuffer must be provided");
|
|
340
|
+
}
|
|
341
|
+
// Determine if it's an image based on extension
|
|
342
|
+
const ext = path.extname(name).toLowerCase();
|
|
343
|
+
const isImage = [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".ico", ".tiff"].includes(ext);
|
|
344
|
+
if (isImage) {
|
|
345
|
+
const { imageKey } = await uploadImageLark({ account, image: buffer });
|
|
346
|
+
return sendImageLark({ account, to, imageKey, replyToMessageId });
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
const fileType = detectFileType(name);
|
|
350
|
+
const { fileKey } = await uploadFileLark({
|
|
351
|
+
account,
|
|
352
|
+
file: buffer,
|
|
353
|
+
fileName: name,
|
|
354
|
+
fileType,
|
|
355
|
+
});
|
|
356
|
+
return sendFileLark({ account, to, fileKey, replyToMessageId });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
100
359
|
//# sourceMappingURL=media.js.map
|
package/dist/src/media.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/media.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/media.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mention.d.ts
CHANGED
|
@@ -43,3 +43,20 @@ export declare function formatMentionForCard(target: {
|
|
|
43
43
|
* Format @everyone for card message
|
|
44
44
|
*/
|
|
45
45
|
export declare function formatMentionAllForCard(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Build complete message with @mentions (text format)
|
|
48
|
+
*
|
|
49
|
+
* Prepends all mention tags to the message for proper forwarding.
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildMentionedMessage(targets: Array<{
|
|
52
|
+
openId: string;
|
|
53
|
+
name?: string;
|
|
54
|
+
}>, message: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Build card content with @mentions (Markdown format)
|
|
57
|
+
*
|
|
58
|
+
* Prepends all mention tags to the message for card rendering.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildMentionedCardContent(targets: Array<{
|
|
61
|
+
openId: string;
|
|
62
|
+
}>, message: string): string;
|
package/dist/src/mention.js
CHANGED
|
@@ -74,4 +74,26 @@ export function formatMentionForCard(target) {
|
|
|
74
74
|
export function formatMentionAllForCard() {
|
|
75
75
|
return `<at id=all></at>`;
|
|
76
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Build complete message with @mentions (text format)
|
|
79
|
+
*
|
|
80
|
+
* Prepends all mention tags to the message for proper forwarding.
|
|
81
|
+
*/
|
|
82
|
+
export function buildMentionedMessage(targets, message) {
|
|
83
|
+
if (targets.length === 0)
|
|
84
|
+
return message;
|
|
85
|
+
const mentionParts = targets.map((t) => formatMentionForText(t));
|
|
86
|
+
return `${mentionParts.join(" ")} ${message}`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build card content with @mentions (Markdown format)
|
|
90
|
+
*
|
|
91
|
+
* Prepends all mention tags to the message for card rendering.
|
|
92
|
+
*/
|
|
93
|
+
export function buildMentionedCardContent(targets, message) {
|
|
94
|
+
if (targets.length === 0)
|
|
95
|
+
return message;
|
|
96
|
+
const mentionParts = targets.map((t) => formatMentionForCard(t));
|
|
97
|
+
return `${mentionParts.join(" ")} ${message}`;
|
|
98
|
+
}
|
|
77
99
|
//# sourceMappingURL=mention.js.map
|
package/dist/src/mention.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/mention.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAuB,EACvB,SAAkB;IAElB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAE9C,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,yBAAyB;QACzB,IAAI,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1D,oBAAoB;QACpB,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAQ;QACrB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,EAAE,CAAC,CAAC,GAAG;KACX,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAuB,EACvB,SAAkB;IAElB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;IAC1D,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAEzE,IAAI,eAAe,EAAE,CAAC;QACpB,+CAA+C;QAC/C,OAAO,eAAe,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,kDAAkD;QAClD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;QACvE,OAAO,aAAa,IAAI,eAAe,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,cAAwB;IACvE,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,4BAA4B;IAC5B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAyC;IAC5E,OAAO,gBAAgB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,OAAO,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,iCAAiC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,OAAO,UAAU,MAAM,CAAC,MAAM,QAAQ,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
|
|
1
|
+
{"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/mention.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAuB,EACvB,SAAkB;IAElB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAE9C,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,yBAAyB;QACzB,IAAI,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1D,oBAAoB;QACpB,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAQ;QACrB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,EAAE,CAAC,CAAC,GAAG;KACX,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAuB,EACvB,SAAkB;IAElB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;IAC1D,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAEzE,IAAI,eAAe,EAAE,CAAC;QACpB,+CAA+C;QAC/C,OAAO,eAAe,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,kDAAkD;QAClD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;QACvE,OAAO,aAAa,IAAI,eAAe,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,cAAwB;IACvE,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,4BAA4B;IAC5B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAyC;IAC5E,OAAO,gBAAgB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,OAAO,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,iCAAiC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,OAAO,UAAU,MAAM,CAAC,MAAM,QAAQ,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAiD,EAAE,OAAe;IACtG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAEzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAkC,EAAE,OAAe;IAC3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAEzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Context and Quoting
|
|
3
|
+
*
|
|
4
|
+
* Functions for fetching quoted/replied message content to provide
|
|
5
|
+
* better conversational context to the AI agent.
|
|
6
|
+
*/
|
|
7
|
+
import type { ResolvedLarkAccount } from "./types.js";
|
|
8
|
+
export type LarkMessageInfo = {
|
|
9
|
+
messageId: string;
|
|
10
|
+
chatId: string;
|
|
11
|
+
senderId?: string;
|
|
12
|
+
senderOpenId?: string;
|
|
13
|
+
content: string;
|
|
14
|
+
contentType: string;
|
|
15
|
+
createTime?: number;
|
|
16
|
+
parent_id?: string;
|
|
17
|
+
thread_id?: string;
|
|
18
|
+
root_id?: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Get a message by its ID.
|
|
22
|
+
*
|
|
23
|
+
* Useful for fetching quoted/replied message content when the user
|
|
24
|
+
* replies to a previous message. This provides context to the AI agent.
|
|
25
|
+
*
|
|
26
|
+
* @param params - Account and message ID
|
|
27
|
+
* @returns Message info or null if not found
|
|
28
|
+
*/
|
|
29
|
+
export declare function getLarkMessage(params: {
|
|
30
|
+
account: ResolvedLarkAccount;
|
|
31
|
+
messageId: string;
|
|
32
|
+
}): Promise<LarkMessageInfo | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Format quoted message context for inclusion in the message body.
|
|
35
|
+
*
|
|
36
|
+
* When a user replies to a previous message, this function formats
|
|
37
|
+
* the quoted content for inclusion in the AI context.
|
|
38
|
+
*
|
|
39
|
+
* @param quotedMessage - The message being replied to
|
|
40
|
+
* @returns Formatted context string
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatQuotedContext(quotedMessage: LarkMessageInfo | null): string;
|
|
43
|
+
/**
|
|
44
|
+
* Check if a message event is a reply to another message.
|
|
45
|
+
*
|
|
46
|
+
* Lark messages have a parent_id field when they are replies.
|
|
47
|
+
*
|
|
48
|
+
* @param parent_id - The parent_id from the message event
|
|
49
|
+
* @returns true if this is a reply
|
|
50
|
+
*/
|
|
51
|
+
export declare function isReplyMessage(parent_id?: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Build context with quoted message if applicable.
|
|
54
|
+
*
|
|
55
|
+
* This combines the original message body with quoted context
|
|
56
|
+
* when the user is replying to a previous message.
|
|
57
|
+
*
|
|
58
|
+
* @param params - Message details
|
|
59
|
+
* @returns Combined message body with context
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildMessageContextWithQuote(params: {
|
|
62
|
+
account: ResolvedLarkAccount;
|
|
63
|
+
messageBody: string;
|
|
64
|
+
parentId?: string;
|
|
65
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Context and Quoting
|
|
3
|
+
*
|
|
4
|
+
* Functions for fetching quoted/replied message content to provide
|
|
5
|
+
* better conversational context to the AI agent.
|
|
6
|
+
*/
|
|
7
|
+
import { createLarkClient } from "./client.js";
|
|
8
|
+
import { extractText as extractTextFromMessage } from "./monitor.js";
|
|
9
|
+
/**
|
|
10
|
+
* Get a message by its ID.
|
|
11
|
+
*
|
|
12
|
+
* Useful for fetching quoted/replied message content when the user
|
|
13
|
+
* replies to a previous message. This provides context to the AI agent.
|
|
14
|
+
*
|
|
15
|
+
* @param params - Account and message ID
|
|
16
|
+
* @returns Message info or null if not found
|
|
17
|
+
*/
|
|
18
|
+
export async function getLarkMessage(params) {
|
|
19
|
+
const { account, messageId } = params;
|
|
20
|
+
const client = createLarkClient(account);
|
|
21
|
+
try {
|
|
22
|
+
const response = (await client.im.message.get({
|
|
23
|
+
path: { message_id: messageId },
|
|
24
|
+
}));
|
|
25
|
+
if (response.code !== 0) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const item = response.data?.items?.[0];
|
|
29
|
+
if (!item) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// Extract text content based on message type
|
|
33
|
+
const content = extractTextFromMessage(item.content ?? "", item.msg_type ?? "text");
|
|
34
|
+
return {
|
|
35
|
+
messageId: item.message_id ?? messageId,
|
|
36
|
+
chatId: item.chat_id ?? "",
|
|
37
|
+
senderId: item.sender_id?.union_id || item.sender_id?.user_id,
|
|
38
|
+
senderOpenId: item.sender_id?.open_id,
|
|
39
|
+
content,
|
|
40
|
+
contentType: item.msg_type ?? "text",
|
|
41
|
+
createTime: item.create_time ? parseInt(item.create_time, 10) : undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error(`[lark] Failed to get message ${messageId}:`, error);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Format quoted message context for inclusion in the message body.
|
|
51
|
+
*
|
|
52
|
+
* When a user replies to a previous message, this function formats
|
|
53
|
+
* the quoted content for inclusion in the AI context.
|
|
54
|
+
*
|
|
55
|
+
* @param quotedMessage - The message being replied to
|
|
56
|
+
* @returns Formatted context string
|
|
57
|
+
*/
|
|
58
|
+
export function formatQuotedContext(quotedMessage) {
|
|
59
|
+
if (!quotedMessage) {
|
|
60
|
+
return "";
|
|
61
|
+
}
|
|
62
|
+
const sender = quotedMessage.senderOpenId || quotedMessage.senderId || "Unknown";
|
|
63
|
+
const content = quotedMessage.content.slice(0, 200); // Limit to 200 chars
|
|
64
|
+
const ellipsis = quotedMessage.content.length > 200 ? "..." : "";
|
|
65
|
+
return `[Replying to ${sender}: "${content}"${ellipsis}]`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if a message event is a reply to another message.
|
|
69
|
+
*
|
|
70
|
+
* Lark messages have a parent_id field when they are replies.
|
|
71
|
+
*
|
|
72
|
+
* @param parent_id - The parent_id from the message event
|
|
73
|
+
* @returns true if this is a reply
|
|
74
|
+
*/
|
|
75
|
+
export function isReplyMessage(parent_id) {
|
|
76
|
+
return !!parent_id && parent_id.length > 0;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Build context with quoted message if applicable.
|
|
80
|
+
*
|
|
81
|
+
* This combines the original message body with quoted context
|
|
82
|
+
* when the user is replying to a previous message.
|
|
83
|
+
*
|
|
84
|
+
* @param params - Message details
|
|
85
|
+
* @returns Combined message body with context
|
|
86
|
+
*/
|
|
87
|
+
export async function buildMessageContextWithQuote(params) {
|
|
88
|
+
const { account, messageBody, parentId } = params;
|
|
89
|
+
// If not a reply, return as-is
|
|
90
|
+
if (!parentId || !isReplyMessage(parentId)) {
|
|
91
|
+
return messageBody;
|
|
92
|
+
}
|
|
93
|
+
// Fetch the quoted message
|
|
94
|
+
const quotedMessage = await getLarkMessage({
|
|
95
|
+
account,
|
|
96
|
+
messageId: parentId,
|
|
97
|
+
});
|
|
98
|
+
const quotedContext = formatQuotedContext(quotedMessage);
|
|
99
|
+
// Combine quoted context with new message
|
|
100
|
+
if (quotedContext) {
|
|
101
|
+
return `${quotedContext}\n\n${messageBody}`;
|
|
102
|
+
}
|
|
103
|
+
return messageBody;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=message-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-context.js","sourceRoot":"","sources":["../../src/message-context.ts"],"names":[],"mappings":"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"}
|
package/dist/src/monitor.js
CHANGED
|
@@ -10,6 +10,25 @@ import { startWebhookServer } from "./webhook.js";
|
|
|
10
10
|
// Active connections for cleanup
|
|
11
11
|
let activeWsClient = null;
|
|
12
12
|
let activeWebhookServer = null;
|
|
13
|
+
/**
|
|
14
|
+
* Determine receive_id_type from recipient ID format.
|
|
15
|
+
* IDs starting with "oc_" are chat IDs,
|
|
16
|
+
* IDs starting with "ou_" are open IDs (user),
|
|
17
|
+
* IDs starting with "on_" are union IDs (user).
|
|
18
|
+
*/
|
|
19
|
+
function inferReceiveIdType(recipientId) {
|
|
20
|
+
if (recipientId.startsWith("oc_")) {
|
|
21
|
+
return "chat_id";
|
|
22
|
+
}
|
|
23
|
+
if (recipientId.startsWith("ou_")) {
|
|
24
|
+
return "open_id";
|
|
25
|
+
}
|
|
26
|
+
if (recipientId.startsWith("on_")) {
|
|
27
|
+
return "union_id";
|
|
28
|
+
}
|
|
29
|
+
// Default to open_id for other formats
|
|
30
|
+
return "open_id";
|
|
31
|
+
}
|
|
13
32
|
/**
|
|
14
33
|
* Extract plain text from Lark message content.
|
|
15
34
|
* Handles different message types (text, post/rich-text).
|
|
@@ -150,9 +169,42 @@ export async function routeMessage(event, account) {
|
|
|
150
169
|
cfg: api.config,
|
|
151
170
|
dispatcherOptions: {
|
|
152
171
|
deliver: async (payload) => {
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
|
|
172
|
+
// Send reply to Lark
|
|
173
|
+
try {
|
|
174
|
+
const client = createLarkClient(account);
|
|
175
|
+
const text = payload.text || "";
|
|
176
|
+
const mediaUrls = payload.mediaUrls || [];
|
|
177
|
+
const replyToId = payload.replyToId || parsed.threadId;
|
|
178
|
+
// Send text message
|
|
179
|
+
if (text || mediaUrls.length > 0) {
|
|
180
|
+
let finalText = text;
|
|
181
|
+
// If there are media URLs, append them to the text
|
|
182
|
+
// Note: Lark requires media to be uploaded first, then sent with media_key
|
|
183
|
+
// For now, we'll just send the text
|
|
184
|
+
const response = await client.im.message.create({
|
|
185
|
+
params: {
|
|
186
|
+
receive_id_type: inferReceiveIdType(parsed.chatId),
|
|
187
|
+
},
|
|
188
|
+
data: {
|
|
189
|
+
receive_id: parsed.chatId,
|
|
190
|
+
msg_type: "text",
|
|
191
|
+
content: JSON.stringify({ text: finalText }),
|
|
192
|
+
...(replyToId && { root_id: replyToId }),
|
|
193
|
+
// Reply to specific message if in thread
|
|
194
|
+
...(parsed.threadId && { parent_id: parsed.messageId }),
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
if (response.code === 0) {
|
|
198
|
+
api.logger.info(`[feishu] Reply sent: message_id=${response.data?.message_id}`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
api.logger.error(`[feishu] Failed to send reply: ${response.msg}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
api.logger.error(`[feishu] Error sending reply: ${err}`);
|
|
207
|
+
}
|
|
156
208
|
},
|
|
157
209
|
onError: (err) => {
|
|
158
210
|
api.logger.error(`[feishu] Reply error: ${err}`);
|
package/dist/src/monitor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/monitor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sender Name Resolution
|
|
3
|
+
*
|
|
4
|
+
* Resolves sender display names from open_id using Lark contact API.
|
|
5
|
+
* Caches results for 10 minutes to avoid excessive API calls.
|
|
6
|
+
*
|
|
7
|
+
* This is useful in group chats where the agent needs to distinguish
|
|
8
|
+
* who is speaking (by name rather than just open_id).
|
|
9
|
+
*/
|
|
10
|
+
import type { ResolvedLarkAccount } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Resolve sender display name from open_id.
|
|
13
|
+
*
|
|
14
|
+
* Uses the contact.user.get API to fetch the user's display name.
|
|
15
|
+
* Results are cached for 10 minutes to reduce API calls.
|
|
16
|
+
*
|
|
17
|
+
* @param params - Account and sender open_id
|
|
18
|
+
* @returns Display name or undefined if not found
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveLarkSenderName(params: {
|
|
21
|
+
account: ResolvedLarkAccount;
|
|
22
|
+
senderOpenId: string;
|
|
23
|
+
log?: (...args: any[]) => void;
|
|
24
|
+
}): Promise<string | undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* Clear the sender name cache.
|
|
27
|
+
*
|
|
28
|
+
* This can be useful for testing or when you need fresh data.
|
|
29
|
+
*/
|
|
30
|
+
export declare function clearSenderNameCache(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get cache statistics.
|
|
33
|
+
*
|
|
34
|
+
* Useful for monitoring and debugging.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getSenderNameCacheStats(): {
|
|
37
|
+
size: number;
|
|
38
|
+
entries: Array<{
|
|
39
|
+
openId: string;
|
|
40
|
+
name: string;
|
|
41
|
+
expireAt: number;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Prefetch sender names for a list of open_ids.
|
|
46
|
+
*
|
|
47
|
+
* This can be useful for warming up the cache before processing
|
|
48
|
+
* a batch of messages.
|
|
49
|
+
*/
|
|
50
|
+
export declare function prefetchLarkSenderNames(params: {
|
|
51
|
+
account: ResolvedLarkAccount;
|
|
52
|
+
senderOpenIds: string[];
|
|
53
|
+
log?: (...args: any[]) => void;
|
|
54
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sender Name Resolution
|
|
3
|
+
*
|
|
4
|
+
* Resolves sender display names from open_id using Lark contact API.
|
|
5
|
+
* Caches results for 10 minutes to avoid excessive API calls.
|
|
6
|
+
*
|
|
7
|
+
* This is useful in group chats where the agent needs to distinguish
|
|
8
|
+
* who is speaking (by name rather than just open_id).
|
|
9
|
+
*/
|
|
10
|
+
import { createLarkClient } from "./client.js";
|
|
11
|
+
// Cache display names by open_id to avoid an API call on every message
|
|
12
|
+
const SENDER_NAME_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
13
|
+
const senderNameCache = new Map();
|
|
14
|
+
/**
|
|
15
|
+
* Resolve sender display name from open_id.
|
|
16
|
+
*
|
|
17
|
+
* Uses the contact.user.get API to fetch the user's display name.
|
|
18
|
+
* Results are cached for 10 minutes to reduce API calls.
|
|
19
|
+
*
|
|
20
|
+
* @param params - Account and sender open_id
|
|
21
|
+
* @returns Display name or undefined if not found
|
|
22
|
+
*/
|
|
23
|
+
export async function resolveLarkSenderName(params) {
|
|
24
|
+
const { account, senderOpenId, log = console.log } = params;
|
|
25
|
+
if (!senderOpenId)
|
|
26
|
+
return undefined;
|
|
27
|
+
// Check cache first
|
|
28
|
+
const cached = senderNameCache.get(senderOpenId);
|
|
29
|
+
const now = Date.now();
|
|
30
|
+
if (cached && cached.expireAt > now) {
|
|
31
|
+
return cached.name;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const client = createLarkClient(account);
|
|
35
|
+
// contact/v3/user/:user_id?user_id_type=open_id
|
|
36
|
+
const res = await client.contact.user.get({
|
|
37
|
+
path: { user_id: senderOpenId },
|
|
38
|
+
params: { user_id_type: "open_id" },
|
|
39
|
+
});
|
|
40
|
+
// Try multiple name fields in order of preference
|
|
41
|
+
const name = res?.data?.user?.name ||
|
|
42
|
+
res?.data?.user?.display_name ||
|
|
43
|
+
res?.data?.user?.nickname ||
|
|
44
|
+
res?.data?.user?.en_name;
|
|
45
|
+
if (name && typeof name === "string") {
|
|
46
|
+
// Cache the result
|
|
47
|
+
senderNameCache.set(senderOpenId, { name, expireAt: now + SENDER_NAME_TTL_MS });
|
|
48
|
+
return name;
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
// Best-effort. Don't fail message handling if name lookup fails.
|
|
54
|
+
log(`[lark] Failed to resolve sender name for ${senderOpenId}: ${String(err)}`);
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Clear the sender name cache.
|
|
60
|
+
*
|
|
61
|
+
* This can be useful for testing or when you need fresh data.
|
|
62
|
+
*/
|
|
63
|
+
export function clearSenderNameCache() {
|
|
64
|
+
senderNameCache.clear();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get cache statistics.
|
|
68
|
+
*
|
|
69
|
+
* Useful for monitoring and debugging.
|
|
70
|
+
*/
|
|
71
|
+
export function getSenderNameCacheStats() {
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
const entries = Array.from(senderNameCache.entries())
|
|
74
|
+
.filter(([, value]) => value.expireAt > now)
|
|
75
|
+
.map(([openId, value]) => ({
|
|
76
|
+
openId,
|
|
77
|
+
name: value.name,
|
|
78
|
+
expireAt: value.expireAt,
|
|
79
|
+
}));
|
|
80
|
+
return {
|
|
81
|
+
size: entries.length,
|
|
82
|
+
entries,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Prefetch sender names for a list of open_ids.
|
|
87
|
+
*
|
|
88
|
+
* This can be useful for warming up the cache before processing
|
|
89
|
+
* a batch of messages.
|
|
90
|
+
*/
|
|
91
|
+
export async function prefetchLarkSenderNames(params) {
|
|
92
|
+
const { account, senderOpenIds, log = console.log } = params;
|
|
93
|
+
// Only fetch names that aren't already cached
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
const uncachedIds = senderOpenIds.filter((id) => {
|
|
96
|
+
const cached = senderNameCache.get(id);
|
|
97
|
+
return !cached || cached.expireAt <= now;
|
|
98
|
+
});
|
|
99
|
+
// Process in parallel with a limit to avoid overwhelming the API
|
|
100
|
+
const batchSize = 10;
|
|
101
|
+
for (let i = 0; i < uncachedIds.length; i += batchSize) {
|
|
102
|
+
const batch = uncachedIds.slice(i, i + batchSize);
|
|
103
|
+
await Promise.all(batch.map((id) => resolveLarkSenderName({ account, senderOpenId: id, log }).catch(() => {
|
|
104
|
+
// Ignore errors - best effort prefetch
|
|
105
|
+
})));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=sender-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-name.js","sourceRoot":"","sources":["../../src/sender-name.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AACxD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA8C,CAAC;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAI3C;IACC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IAE5D,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAEpC,oBAAoB;IACpB,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAEzC,gDAAgD;QAChD,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAC7C,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;YAC/B,MAAM,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;SACpC,CAAC,CAAC;QAEH,kDAAkD;QAClD,MAAM,IAAI,GACR,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;YACrB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY;YAC7B,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ;YACzB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;QAE3B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,mBAAmB;YACnB,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,kBAAkB,EAAE,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iEAAiE;QACjE,GAAG,CAAC,4CAA4C,YAAY,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,eAAe,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IAIrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;SAClD,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM;QACN,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC,CAAC;IAEN,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,MAAM;QACpB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAI7C;IACC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IAE7D,8CAA8C;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAClD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACf,qBAAqB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACnE,uCAAuC;QACzC,CAAC,CAAC,CACH,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typing Indicators for Lark/Feishu
|
|
3
|
+
*
|
|
4
|
+
* Since Lark/Feishu doesn't have a native typing indicator API,
|
|
5
|
+
* we use emoji reactions as a substitute.
|
|
6
|
+
*
|
|
7
|
+
* When the bot starts processing a message, it adds a "Typing" reaction.
|
|
8
|
+
* When the reply is sent, it removes the reaction.
|
|
9
|
+
*
|
|
10
|
+
* Reference: https://open.feishu.cn/document/server-docs/im-v1/message-reaction/emojis-introduce
|
|
11
|
+
*/
|
|
12
|
+
import type { OpenClawConfig } from "openclaw/plugin-sdk";
|
|
13
|
+
export type TypingIndicatorState = {
|
|
14
|
+
messageId: string;
|
|
15
|
+
reactionId: string | null;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Add a typing indicator (reaction) to a message.
|
|
19
|
+
*
|
|
20
|
+
* This adds a visual indicator that the bot is "typing" or processing the message.
|
|
21
|
+
* Uses the "Typing" emoji reaction if available, falls back gracefully if not.
|
|
22
|
+
*
|
|
23
|
+
* @param params - Configuration and message ID
|
|
24
|
+
* @returns State object containing message ID and reaction ID (for later removal)
|
|
25
|
+
*/
|
|
26
|
+
export declare function addTypingIndicator(params: {
|
|
27
|
+
cfg: OpenClawConfig;
|
|
28
|
+
messageId: string;
|
|
29
|
+
accountId?: string;
|
|
30
|
+
}): Promise<TypingIndicatorState>;
|
|
31
|
+
/**
|
|
32
|
+
* Remove a typing indicator (reaction) from a message.
|
|
33
|
+
*
|
|
34
|
+
* This should be called after the reply is sent to clean up the typing indicator.
|
|
35
|
+
*
|
|
36
|
+
* @param params - Configuration and typing indicator state
|
|
37
|
+
*/
|
|
38
|
+
export declare function removeTypingIndicator(params: {
|
|
39
|
+
cfg: OpenClawConfig;
|
|
40
|
+
state: TypingIndicatorState;
|
|
41
|
+
accountId?: string;
|
|
42
|
+
}): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Create a typing indicator controller for managing the lifecycle.
|
|
45
|
+
*
|
|
46
|
+
* This is useful for ensuring the typing indicator is removed even if errors occur.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const typing = createTypingController({ cfg, messageId });
|
|
51
|
+
* await typing.start();
|
|
52
|
+
* try {
|
|
53
|
+
* // ... process message and send reply ...
|
|
54
|
+
* } finally {
|
|
55
|
+
* await typing.stop();
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function createTypingController(params: {
|
|
60
|
+
cfg: OpenClawConfig;
|
|
61
|
+
messageId: string;
|
|
62
|
+
accountId?: string;
|
|
63
|
+
}): {
|
|
64
|
+
/**
|
|
65
|
+
* Start the typing indicator
|
|
66
|
+
*/
|
|
67
|
+
start(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Stop the typing indicator
|
|
70
|
+
*/
|
|
71
|
+
stop(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Get current state
|
|
74
|
+
*/
|
|
75
|
+
getState(): TypingIndicatorState | null;
|
|
76
|
+
};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typing Indicators for Lark/Feishu
|
|
3
|
+
*
|
|
4
|
+
* Since Lark/Feishu doesn't have a native typing indicator API,
|
|
5
|
+
* we use emoji reactions as a substitute.
|
|
6
|
+
*
|
|
7
|
+
* When the bot starts processing a message, it adds a "Typing" reaction.
|
|
8
|
+
* When the reply is sent, it removes the reaction.
|
|
9
|
+
*
|
|
10
|
+
* Reference: https://open.feishu.cn/document/server-docs/im-v1/message-reaction/emojis-introduce
|
|
11
|
+
*/
|
|
12
|
+
import { createLarkClient } from "./client.js";
|
|
13
|
+
// Lark emoji type for typing indicator
|
|
14
|
+
// Note: "Typing" may not be available in all Lark instances
|
|
15
|
+
// Fallback options: "THUMBSUP", "OK", "SMILE"
|
|
16
|
+
const TYPING_EMOJI = "Typing";
|
|
17
|
+
/**
|
|
18
|
+
* Extract Lark channel config from OpenClaw config
|
|
19
|
+
*/
|
|
20
|
+
function getChannelConfig(cfg) {
|
|
21
|
+
return cfg.channels?.lark ?? {};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Add a typing indicator (reaction) to a message.
|
|
25
|
+
*
|
|
26
|
+
* This adds a visual indicator that the bot is "typing" or processing the message.
|
|
27
|
+
* Uses the "Typing" emoji reaction if available, falls back gracefully if not.
|
|
28
|
+
*
|
|
29
|
+
* @param params - Configuration and message ID
|
|
30
|
+
* @returns State object containing message ID and reaction ID (for later removal)
|
|
31
|
+
*/
|
|
32
|
+
export async function addTypingIndicator(params) {
|
|
33
|
+
const { cfg, messageId, accountId = "default" } = params;
|
|
34
|
+
const channelConfig = getChannelConfig(cfg);
|
|
35
|
+
const accountConfig = channelConfig.accounts?.[accountId];
|
|
36
|
+
if (!accountConfig?.appId || !accountConfig?.appSecret) {
|
|
37
|
+
return { messageId, reactionId: null };
|
|
38
|
+
}
|
|
39
|
+
const client = createLarkClient({
|
|
40
|
+
accountId,
|
|
41
|
+
enabled: true,
|
|
42
|
+
configured: true,
|
|
43
|
+
appId: accountConfig.appId,
|
|
44
|
+
appSecret: accountConfig.appSecret,
|
|
45
|
+
domain: accountConfig.domain ?? "feishu",
|
|
46
|
+
connectionMode: "websocket",
|
|
47
|
+
webhookPort: 3000,
|
|
48
|
+
dmPolicy: "open",
|
|
49
|
+
dmAllowlist: [],
|
|
50
|
+
groupPolicy: "open",
|
|
51
|
+
groupAllowlist: [],
|
|
52
|
+
requireMention: true,
|
|
53
|
+
mediaMaxMb: 30,
|
|
54
|
+
renderMode: "auto",
|
|
55
|
+
historyLimit: 10,
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
const response = await client.im.messageReaction.create({
|
|
59
|
+
path: { message_id: messageId },
|
|
60
|
+
data: {
|
|
61
|
+
reaction_type: { emoji_type: TYPING_EMOJI },
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
const reactionId = response?.data?.reaction_id ?? null;
|
|
65
|
+
return { messageId, reactionId };
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
// Silently fail - typing indicator is not critical
|
|
69
|
+
console.log(`[lark] Failed to add typing indicator: ${err}`);
|
|
70
|
+
return { messageId, reactionId: null };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Remove a typing indicator (reaction) from a message.
|
|
75
|
+
*
|
|
76
|
+
* This should be called after the reply is sent to clean up the typing indicator.
|
|
77
|
+
*
|
|
78
|
+
* @param params - Configuration and typing indicator state
|
|
79
|
+
*/
|
|
80
|
+
export async function removeTypingIndicator(params) {
|
|
81
|
+
const { cfg, state, accountId = "default" } = params;
|
|
82
|
+
if (!state.reactionId)
|
|
83
|
+
return;
|
|
84
|
+
const channelConfig = getChannelConfig(cfg);
|
|
85
|
+
const accountConfig = channelConfig.accounts?.[accountId];
|
|
86
|
+
if (!accountConfig?.appId || !accountConfig?.appSecret)
|
|
87
|
+
return;
|
|
88
|
+
const client = createLarkClient({
|
|
89
|
+
accountId,
|
|
90
|
+
enabled: true,
|
|
91
|
+
configured: true,
|
|
92
|
+
appId: accountConfig.appId,
|
|
93
|
+
appSecret: accountConfig.appSecret,
|
|
94
|
+
domain: accountConfig.domain ?? "feishu",
|
|
95
|
+
connectionMode: "websocket",
|
|
96
|
+
webhookPort: 3000,
|
|
97
|
+
dmPolicy: "open",
|
|
98
|
+
dmAllowlist: [],
|
|
99
|
+
groupPolicy: "open",
|
|
100
|
+
groupAllowlist: [],
|
|
101
|
+
requireMention: true,
|
|
102
|
+
mediaMaxMb: 30,
|
|
103
|
+
renderMode: "auto",
|
|
104
|
+
historyLimit: 10,
|
|
105
|
+
});
|
|
106
|
+
try {
|
|
107
|
+
await client.im.messageReaction.delete({
|
|
108
|
+
path: {
|
|
109
|
+
message_id: state.messageId,
|
|
110
|
+
reaction_id: state.reactionId,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
// Silently fail - cleanup is not critical
|
|
116
|
+
console.log(`[lark] Failed to remove typing indicator: ${err}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a typing indicator controller for managing the lifecycle.
|
|
121
|
+
*
|
|
122
|
+
* This is useful for ensuring the typing indicator is removed even if errors occur.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const typing = createTypingController({ cfg, messageId });
|
|
127
|
+
* await typing.start();
|
|
128
|
+
* try {
|
|
129
|
+
* // ... process message and send reply ...
|
|
130
|
+
* } finally {
|
|
131
|
+
* await typing.stop();
|
|
132
|
+
* }
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export function createTypingController(params) {
|
|
136
|
+
let state = null;
|
|
137
|
+
return {
|
|
138
|
+
/**
|
|
139
|
+
* Start the typing indicator
|
|
140
|
+
*/
|
|
141
|
+
async start() {
|
|
142
|
+
state = await addTypingIndicator(params);
|
|
143
|
+
},
|
|
144
|
+
/**
|
|
145
|
+
* Stop the typing indicator
|
|
146
|
+
*/
|
|
147
|
+
async stop() {
|
|
148
|
+
if (state) {
|
|
149
|
+
await removeTypingIndicator({
|
|
150
|
+
cfg: params.cfg,
|
|
151
|
+
state,
|
|
152
|
+
accountId: params.accountId,
|
|
153
|
+
});
|
|
154
|
+
state = null;
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
/**
|
|
158
|
+
* Get current state
|
|
159
|
+
*/
|
|
160
|
+
getState() {
|
|
161
|
+
return state;
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=typing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typing.js","sourceRoot":"","sources":["../../src/typing.ts"],"names":[],"mappings":"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"}
|