@zhin.js/adapter-wecom 2.0.2 → 2.0.3

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 (53) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +79 -226
  3. package/adapters/wecom.ts +27 -0
  4. package/agent/tools/get_dept_users.ts +2 -2
  5. package/agent/tools/get_user.ts +2 -2
  6. package/agent/tools/list_departments.ts +2 -2
  7. package/agent/tools/send_text.ts +2 -2
  8. package/lib/endpoint.d.ts +46 -0
  9. package/lib/endpoint.js +205 -0
  10. package/lib/index.d.ts +5 -0
  11. package/lib/index.js +5 -0
  12. package/lib/platform-permit.d.ts +15 -0
  13. package/lib/{src/platform-permit.js → platform-permit.js} +1 -2
  14. package/lib/protocol.d.ts +96 -0
  15. package/lib/protocol.js +252 -0
  16. package/lib/webhook.d.ts +14 -0
  17. package/lib/webhook.js +86 -0
  18. package/lib/wecom-agent-deps.d.ts +17 -0
  19. package/lib/wecom-agent-deps.js +30 -0
  20. package/package.json +45 -20
  21. package/plugin.ts +12 -0
  22. package/schema.json +24 -0
  23. package/src/endpoint.ts +196 -584
  24. package/src/index.ts +48 -53
  25. package/src/platform-permit.ts +1 -1
  26. package/src/protocol.ts +362 -0
  27. package/src/webhook.ts +130 -0
  28. package/src/wecom-agent-deps.ts +37 -9
  29. package/lib/agent/tools/get_dept_users.js +0 -18
  30. package/lib/agent/tools/get_dept_users.js.map +0 -1
  31. package/lib/agent/tools/get_user.js +0 -17
  32. package/lib/agent/tools/get_user.js.map +0 -1
  33. package/lib/agent/tools/list_departments.js +0 -18
  34. package/lib/agent/tools/list_departments.js.map +0 -1
  35. package/lib/agent/tools/send_text.js +0 -19
  36. package/lib/agent/tools/send_text.js.map +0 -1
  37. package/lib/src/adapter.js +0 -22
  38. package/lib/src/adapter.js.map +0 -1
  39. package/lib/src/endpoint.js +0 -602
  40. package/lib/src/endpoint.js.map +0 -1
  41. package/lib/src/index.js +0 -41
  42. package/lib/src/index.js.map +0 -1
  43. package/lib/src/platform-permit.js.map +0 -1
  44. package/lib/src/segment-mapper.js +0 -2
  45. package/lib/src/segment-mapper.js.map +0 -1
  46. package/lib/src/types.js +0 -5
  47. package/lib/src/types.js.map +0 -1
  48. package/lib/src/wecom-agent-deps.js +0 -10
  49. package/lib/src/wecom-agent-deps.js.map +0 -1
  50. package/plugin.yml +0 -3
  51. package/src/adapter.ts +0 -28
  52. package/src/segment-mapper.ts +0 -1
  53. package/src/types.ts +0 -51
@@ -1,602 +0,0 @@
1
- /**
2
- * 企业微信 Endpoint 实现
3
- */
4
- import { formatCompact, Message, segment, expandInteractiveSegmentsInContent, } from 'zhin.js';
5
- import { registerFetchRoute } from '@zhin.js/host-router/router';
6
- import { createHash, createDecipheriv } from 'node:crypto';
7
- import { normalizeWecomSenderForPermit } from './platform-permit.js';
8
- import { fromCanonicalSegments, toCanonicalSegments } from './segment-mapper.js';
9
- export class WecomEndpoint {
10
- adapter;
11
- $config;
12
- $connected;
13
- router;
14
- accessToken;
15
- baseURL;
16
- aesKey;
17
- corpId;
18
- #refreshPromise = null;
19
- get $id() {
20
- return this.$config.name;
21
- }
22
- get logger() {
23
- return this.adapter.plugin.logger;
24
- }
25
- constructor(adapter, router, $config) {
26
- this.adapter = adapter;
27
- this.$config = $config;
28
- this.router = router;
29
- this.$connected = false;
30
- this.accessToken = { access_token: '', expires_in: 0, timestamp: 0 };
31
- this.baseURL = $config.apiBaseUrl || 'https://qyapi.weixin.qq.com';
32
- this.corpId = $config.corpId;
33
- this.aesKey = Buffer.from($config.encodingAESKey + '=', 'base64');
34
- if (this.aesKey.length !== 32) {
35
- throw new Error(`encodingAESKey must produce a 32-byte key, got ${this.aesKey.length} bytes`);
36
- }
37
- this.setupWebhookRoute();
38
- }
39
- // ── HTTP helpers ──
40
- async request(path, options = {}) {
41
- await this.ensureAccessToken();
42
- const { method = 'GET', params = {}, body } = options;
43
- const urlParams = new URLSearchParams({
44
- ...params,
45
- access_token: this.accessToken.access_token,
46
- });
47
- const url = `${this.baseURL}${path}?${urlParams.toString()}`;
48
- const fetchOptions = {
49
- method,
50
- headers: { 'Content-Type': 'application/json; charset=utf-8' },
51
- };
52
- if (body && method === 'POST') {
53
- fetchOptions.body = JSON.stringify(body);
54
- }
55
- const response = await fetch(url, fetchOptions);
56
- if (!response.ok) {
57
- const text = await response.text().catch(() => '');
58
- throw new Error(`WeCom API error ${response.status}: ${text}`);
59
- }
60
- return await response.json();
61
- }
62
- // ── Webhook route ──
63
- setupWebhookRoute() {
64
- const webhookPath = this.$config.webhookPath || '/wecom/callback';
65
- registerFetchRoute(this.router, 'GET', webhookPath, (ctx) => {
66
- void this.handleVerification(ctx);
67
- });
68
- registerFetchRoute(this.router, 'POST', webhookPath, (ctx) => {
69
- void this.handleWebhook(ctx);
70
- });
71
- }
72
- // ── URL 验证(企业微信首次配置回调 URL 时的 GET 请求)──
73
- handleVerification(ctx) {
74
- try {
75
- const { msg_signature, timestamp, nonce, echostr } = ctx.query;
76
- if (!msg_signature || !timestamp || !nonce || !echostr) {
77
- ctx.status = 400;
78
- ctx.body = 'Missing required query parameters';
79
- return;
80
- }
81
- if (!this.verifySignature(msg_signature, timestamp, nonce, echostr)) {
82
- this.logger.warn(formatCompact({ op: 'verify', ok: false, error: 'invalid signature' }));
83
- ctx.status = 403;
84
- ctx.body = 'Forbidden';
85
- return;
86
- }
87
- // 解密 echostr 并返回明文
88
- const decrypted = this.decryptMessage(echostr);
89
- if (!decrypted) {
90
- ctx.status = 400;
91
- ctx.body = 'Decryption failed';
92
- return;
93
- }
94
- ctx.status = 200;
95
- ctx.body = decrypted;
96
- }
97
- catch (error) {
98
- this.logger.error('URL verification error:', error);
99
- ctx.status = 500;
100
- ctx.body = 'Internal Server Error';
101
- }
102
- }
103
- // ── 消息回调处理 ──
104
- async handleWebhook(ctx) {
105
- try {
106
- const query = ctx.query;
107
- const msgSignature = query.msg_signature;
108
- const timestamp = query.timestamp;
109
- const nonce = query.nonce;
110
- // 解析 XML body
111
- const rawBody = typeof ctx.request.body === 'string'
112
- ? ctx.request.body
113
- : String(ctx.request.body || '');
114
- // 从 XML 中提取 Encrypt 字段(使用字符类避免 CodeQL 多项式正则警告)
115
- const encryptMatch = rawBody.match(/<Encrypt><!\[CDATA\[([^[\]]+)]\]><\/Encrypt>/);
116
- if (!encryptMatch) {
117
- this.logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'no Encrypt field' }));
118
- ctx.status = 200;
119
- ctx.body = 'success';
120
- return;
121
- }
122
- const encrypted = encryptMatch[1];
123
- // 验证签名
124
- if (!this.verifySignature(msgSignature, timestamp, nonce, encrypted)) {
125
- this.logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'invalid signature' }));
126
- ctx.status = 403;
127
- ctx.body = 'Forbidden';
128
- return;
129
- }
130
- // 解密消息
131
- const decryptedXml = this.decryptMessage(encrypted);
132
- if (!decryptedXml) {
133
- ctx.status = 200;
134
- ctx.body = 'success';
135
- return;
136
- }
137
- const message = this.parseXmlMessage(decryptedXml);
138
- if (message) {
139
- await this.handleMessage(message);
140
- }
141
- ctx.status = 200;
142
- ctx.body = 'success';
143
- }
144
- catch (error) {
145
- this.logger.error('Webhook error:', error);
146
- ctx.status = 200;
147
- ctx.body = 'success';
148
- }
149
- }
150
- // ── 签名验证(SHA1 排序拼接)──
151
- verifySignature(signature, timestamp, nonce, encrypt) {
152
- try {
153
- const arr = [this.$config.token, timestamp, nonce, encrypt].sort();
154
- const str = arr.join('');
155
- const hash = createHash('sha1').update(str).digest('hex');
156
- return hash === signature;
157
- }
158
- catch (error) {
159
- this.logger.error('Signature verification error:', error);
160
- return false;
161
- }
162
- }
163
- // ── AES-CBC 解密 ──
164
- decryptMessage(encrypted) {
165
- const buf = Buffer.from(encrypted, 'base64');
166
- const iv = this.aesKey.subarray(0, 16);
167
- const decipher = createDecipheriv('aes-256-cbc', this.aesKey, iv);
168
- decipher.setAutoPadding(false);
169
- const decrypted = Buffer.concat([decipher.update(buf), decipher.final()]);
170
- // PKCS7 unpad
171
- const pad = decrypted[decrypted.length - 1];
172
- const content = decrypted.subarray(0, decrypted.length - pad);
173
- // 提取: 16 字节随机数 + 4 字节消息长度 + 消息体 + corpId
174
- const msgLen = content.readUInt32BE(16);
175
- const msg = content.subarray(20, 20 + msgLen).toString('utf8');
176
- const extractedCorpId = content.subarray(20 + msgLen).toString('utf8');
177
- if (extractedCorpId !== this.corpId) {
178
- this.logger.warn(formatCompact({ op: 'decrypt', ok: false, error: 'corpId mismatch', expected: this.corpId, got: extractedCorpId }));
179
- return null;
180
- }
181
- return msg;
182
- }
183
- // ── XML 解析(简易,无外部依赖)──
184
- parseXmlMessage(xml) {
185
- try {
186
- const get = (tag) => {
187
- // 使用字符类避免 CodeQL 多项式正则警告
188
- const m = xml.match(new RegExp(`<${tag}><!\\[CDATA\\[([^\\[\\]]*)\\]\\]><\\/${tag}>`))
189
- || xml.match(new RegExp(`<${tag}>([^<]*)<\\/${tag}>`));
190
- return m ? m[1] : undefined;
191
- };
192
- const msgType = get('MsgType');
193
- if (!msgType)
194
- return null;
195
- const msg = {
196
- ToUserName: get('ToUserName') || '',
197
- FromUserName: get('FromUserName') || '',
198
- CreateTime: Number(get('CreateTime') || Date.now()),
199
- MsgType: msgType,
200
- MsgId: get('MsgId'),
201
- AgentID: get('AgentID'),
202
- };
203
- switch (msgType) {
204
- case 'text':
205
- msg.Content = get('Content');
206
- break;
207
- case 'image':
208
- msg.PicUrl = get('PicUrl');
209
- msg.MediaId = get('MediaId');
210
- break;
211
- case 'voice':
212
- msg.MediaId = get('MediaId');
213
- msg.Format = get('Format');
214
- msg.Recognition = get('Recognition');
215
- break;
216
- case 'video':
217
- case 'shortvideo':
218
- msg.MediaId = get('MediaId');
219
- msg.ThumbMediaId = get('ThumbMediaId');
220
- break;
221
- case 'location':
222
- msg.Location_X = get('Location_X');
223
- msg.Location_Y = get('Location_Y');
224
- msg.Scale = get('Scale');
225
- msg.Label = get('Label');
226
- break;
227
- case 'link':
228
- msg.Title = get('Title');
229
- msg.Description = get('Description');
230
- msg.Url = get('Url');
231
- break;
232
- case 'event':
233
- msg.Event = get('Event');
234
- msg.EventKey = get('EventKey');
235
- break;
236
- }
237
- return msg;
238
- }
239
- catch (error) {
240
- this.logger.error('Failed to parse XML message:', error);
241
- return null;
242
- }
243
- }
244
- // ── 消息处理 ──
245
- async handleMessage(msg) {
246
- const formatted = this.$formatMessage(msg);
247
- this.adapter.emit('message.receive', formatted);
248
- this.logger.debug(formatCompact({
249
- op: 'recv',
250
- endpoint: this.$config.name,
251
- channel: formatted.$channel.type,
252
- id: formatted.$channel.id,
253
- len: segment.raw(formatted.$content).length,
254
- }));
255
- }
256
- // ── Access Token 管理 ──
257
- async ensureAccessToken() {
258
- const now = Date.now();
259
- if (this.accessToken.access_token &&
260
- now < this.accessToken.timestamp + (this.accessToken.expires_in - 300) * 1000) {
261
- return;
262
- }
263
- if (this.#refreshPromise) {
264
- await this.#refreshPromise;
265
- return;
266
- }
267
- this.#refreshPromise = this.refreshAccessToken()
268
- .then(() => this.accessToken.access_token)
269
- .finally(() => { this.#refreshPromise = null; });
270
- await this.#refreshPromise;
271
- }
272
- async refreshAccessToken() {
273
- try {
274
- const url = `${this.baseURL}/cgi-bin/gettoken?corpid=${this.corpId}&corpsecret=${this.$config.agentSecret}`;
275
- const response = await fetch(url);
276
- const data = await response.json();
277
- if (data.errcode === 0) {
278
- this.accessToken = {
279
- access_token: data.access_token,
280
- expires_in: data.expires_in,
281
- timestamp: Date.now(),
282
- };
283
- this.logger.debug('Access token refreshed successfully');
284
- }
285
- else {
286
- throw new Error(`Failed to get access token: ${data.errmsg} (${data.errcode})`);
287
- }
288
- }
289
- catch (error) {
290
- this.logger.error('Failed to refresh access token:', error);
291
- throw error;
292
- }
293
- }
294
- // ── $formatMessage ──
295
- $formatMessage(msg) {
296
- const wire = this.parseMessageContent(msg);
297
- const content = toCanonicalSegments(wire);
298
- // 企业微信中群消息与私聊消息的判断:
299
- // 群消息 FromUserName 以 @chatroom 结尾
300
- const chatType = msg.FromUserName.endsWith('@chatroom') ? 'group' : 'private';
301
- // NOTE: v1: look up group admin status via WeCom API
302
- const permit = normalizeWecomSenderForPermit({ isAdmin: false, isOwner: false });
303
- return Message.from(msg, {
304
- $id: msg.MsgId || Date.now().toString(),
305
- $adapter: 'wecom',
306
- $endpoint: this.$config.name,
307
- $sender: {
308
- id: msg.FromUserName,
309
- name: msg.FromUserName,
310
- role: permit.role,
311
- permissions: permit.permissions,
312
- },
313
- $channel: {
314
- id: chatType === 'group' ? msg.FromUserName : msg.FromUserName,
315
- type: chatType,
316
- },
317
- $content: content,
318
- $raw: JSON.stringify(msg),
319
- $timestamp: (msg.CreateTime || Math.floor(Date.now() / 1000)) * 1000,
320
- $recall: async () => {
321
- await this.$recallMessage(msg.MsgId || '');
322
- },
323
- $reply: async (content) => {
324
- return await this.adapter.sendMessage({
325
- context: 'wecom',
326
- endpoint: this.$config.name,
327
- id: msg.FromUserName,
328
- type: chatType,
329
- content: content,
330
- });
331
- },
332
- });
333
- }
334
- parseMessageContent(msg) {
335
- const content = [];
336
- if (!msg.MsgType)
337
- return content;
338
- try {
339
- switch (msg.MsgType) {
340
- case 'text':
341
- if (msg.Content) {
342
- content.push(segment('text', { content: msg.Content }));
343
- }
344
- break;
345
- case 'image':
346
- if (msg.MediaId) {
347
- content.push(segment('image', {
348
- file: msg.MediaId,
349
- url: msg.PicUrl || '',
350
- }));
351
- }
352
- break;
353
- case 'voice':
354
- if (msg.MediaId) {
355
- content.push(segment('audio', {
356
- file: msg.MediaId,
357
- }));
358
- // 语音识别结果
359
- if (msg.Recognition) {
360
- content.push(segment('text', { content: msg.Recognition }));
361
- }
362
- }
363
- break;
364
- case 'video':
365
- case 'shortvideo':
366
- if (msg.MediaId) {
367
- content.push(segment('video', {
368
- file: msg.MediaId,
369
- }));
370
- }
371
- break;
372
- case 'location':
373
- content.push(segment('text', {
374
- content: `[位置] ${msg.Label || ''} (${msg.Location_X}, ${msg.Location_Y})`,
375
- }));
376
- break;
377
- case 'link':
378
- content.push(segment('link', {
379
- title: msg.Title || '',
380
- content: msg.Description || '',
381
- url: msg.Url || '',
382
- }));
383
- break;
384
- case 'event':
385
- content.push(segment('text', {
386
- content: `[事件] ${msg.Event || ''} ${msg.EventKey || ''}`,
387
- }));
388
- break;
389
- default:
390
- content.push(segment('text', {
391
- content: `[不支持的消息类型: ${msg.MsgType}]`,
392
- }));
393
- break;
394
- }
395
- }
396
- catch (error) {
397
- this.logger.error('Failed to parse message content:', error);
398
- content.push(segment('text', { content: '[消息解析失败]' }));
399
- }
400
- return content;
401
- }
402
- // ── $sendMessage ──
403
- async $sendMessage(options) {
404
- const targetId = options.id;
405
- const canonical = expandInteractiveSegmentsInContent(options.content);
406
- const wire = fromCanonicalSegments(canonical);
407
- const content = this.formatSendContent(wire);
408
- try {
409
- const body = {
410
- touser: targetId,
411
- msgtype: content.msgtype,
412
- agentid: this.$config.agentSecret,
413
- [content.msgtype]: content.data,
414
- };
415
- // 群消息使用 chatid
416
- if (targetId.endsWith('@chatroom')) {
417
- delete body.touser;
418
- body.chatid = targetId;
419
- }
420
- const data = await this.request('/cgi-bin/message/send', {
421
- method: 'POST',
422
- body,
423
- });
424
- if (data.errcode !== 0) {
425
- throw new Error(`Failed to send message: ${data.errmsg} (${data.errcode})`);
426
- }
427
- this.logger.debug(formatCompact({ op: 'send', endpoint: this.$config.name, to: targetId }));
428
- return data.msgid || Date.now().toString();
429
- }
430
- catch (error) {
431
- this.logger.error('Failed to send message:', error);
432
- throw error;
433
- }
434
- }
435
- // ── $recallMessage (企业微信不支持机器人撤回) ──
436
- async $recallMessage(_id) {
437
- this.logger.warn(formatCompact({ op: 'recall', ok: false, error: 'not supported by wecom' }));
438
- }
439
- // ── 发送内容格式化 ──
440
- formatSendContent(content) {
441
- if (typeof content === 'string') {
442
- return { msgtype: 'text', data: { content } };
443
- }
444
- if (Array.isArray(content)) {
445
- const textParts = [];
446
- let hasMedia = false;
447
- let mediaType = '';
448
- let mediaData = null;
449
- let droppedMediaCount = 0;
450
- for (const item of content) {
451
- if (typeof item === 'string') {
452
- textParts.push(item);
453
- continue;
454
- }
455
- const seg = item;
456
- switch (seg.type) {
457
- case 'text':
458
- textParts.push(seg.data.content || seg.data.text || '');
459
- break;
460
- case 'at':
461
- // 企业微信 @ 格式: <@userid>
462
- const userId = seg.data.id || seg.data.userId;
463
- if (userId)
464
- textParts.push(`<@${userId}>`);
465
- break;
466
- case 'image':
467
- if (!hasMedia) {
468
- hasMedia = true;
469
- mediaType = 'image';
470
- mediaData = { media_id: seg.data.file || seg.data.url };
471
- }
472
- else {
473
- droppedMediaCount++;
474
- }
475
- break;
476
- case 'markdown':
477
- if (!hasMedia) {
478
- hasMedia = true;
479
- mediaType = 'markdown';
480
- mediaData = { content: seg.data.content || seg.data.text };
481
- }
482
- else {
483
- droppedMediaCount++;
484
- }
485
- break;
486
- case 'link':
487
- if (!hasMedia) {
488
- hasMedia = true;
489
- mediaType = 'news';
490
- mediaData = {
491
- articles: [{
492
- title: seg.data.title || '链接',
493
- description: seg.data.text || seg.data.content || '',
494
- url: seg.data.url,
495
- picurl: seg.data.picUrl,
496
- }],
497
- };
498
- }
499
- else {
500
- droppedMediaCount++;
501
- }
502
- break;
503
- }
504
- }
505
- if (droppedMediaCount > 0) {
506
- this.logger.warn(formatCompact({
507
- op: 'formatSend',
508
- droppedMedia: droppedMediaCount,
509
- note: 'WeCom API only supports one media segment per message',
510
- }));
511
- }
512
- if (hasMedia && mediaData) {
513
- return { msgtype: mediaType, data: mediaData };
514
- }
515
- return { msgtype: 'text', data: { content: textParts.join('') } };
516
- }
517
- return { msgtype: 'text', data: { content: String(content) } };
518
- }
519
- // ── 生命周期 ──
520
- async $connect() {
521
- try {
522
- await this.refreshAccessToken();
523
- this.$connected = true;
524
- this.logger.debug(formatCompact({ op: 'connect', endpoint: this.$config.name }));
525
- this.logger.debug(formatCompact({ op: 'webhook', path: this.$config.webhookPath || '/wecom/callback' }));
526
- }
527
- catch (error) {
528
- this.logger.error('Failed to connect WeCom bot:', error);
529
- throw error;
530
- }
531
- }
532
- async $disconnect() {
533
- this.$connected = false;
534
- this.logger.debug(formatCompact({ op: 'disconnect', endpoint: this.$config.name }));
535
- }
536
- // ── 企业微信特有 API ──
537
- async getUserInfo(userId) {
538
- try {
539
- const data = await this.request('/cgi-bin/user/get', {
540
- params: { userid: userId },
541
- });
542
- if (data.errcode === 0)
543
- return data;
544
- throw new Error(`Failed to get user info: ${data.errmsg}`);
545
- }
546
- catch (error) {
547
- this.logger.error('Failed to get user info:', error);
548
- return null;
549
- }
550
- }
551
- async getDepartmentUsers(deptId) {
552
- try {
553
- const data = await this.request('/cgi-bin/user/simplelist', {
554
- params: { department_id: deptId },
555
- });
556
- if (data.errcode === 0)
557
- return data.userlist || [];
558
- throw new Error(`Failed to get department users: ${data.errmsg}`);
559
- }
560
- catch (error) {
561
- this.logger.error('Failed to get department users:', error);
562
- return [];
563
- }
564
- }
565
- async getDepartmentList(deptId = 1) {
566
- try {
567
- const data = await this.request('/cgi-bin/department/list', {
568
- params: { id: deptId },
569
- });
570
- if (data.errcode === 0)
571
- return data.department || [];
572
- throw new Error(`Failed to get department list: ${data.errmsg}`);
573
- }
574
- catch (error) {
575
- this.logger.error('Failed to get department list:', error);
576
- return [];
577
- }
578
- }
579
- async sendTextMessage(userId, content) {
580
- try {
581
- const data = await this.request('/cgi-bin/message/send', {
582
- method: 'POST',
583
- body: {
584
- touser: userId,
585
- msgtype: 'text',
586
- agentid: this.$config.agentSecret,
587
- text: { content },
588
- },
589
- });
590
- if (data.errcode === 0) {
591
- this.logger.debug('Text message sent successfully');
592
- return true;
593
- }
594
- throw new Error(`Failed to send text message: ${data.errmsg}`);
595
- }
596
- catch (error) {
597
- this.logger.error('Failed to send text message:', error);
598
- return false;
599
- }
600
- }
601
- }
602
- //# sourceMappingURL=endpoint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/endpoint.ts"],"names":[],"mappings":"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"}