@melandlabs/integrations-runtime 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,571 @@
1
+ // src/authorization-errors.ts
2
+ var platformNames = {
3
+ telegram: "Telegram",
4
+ whatsapp: "WhatsApp"
5
+ };
6
+ var userActionTimeoutPatterns = [
7
+ /password input timed out/i,
8
+ /verification code timed out/i,
9
+ /qr login timed out/i
10
+ ];
11
+ var networkErrorPatterns = [
12
+ /\[whatsapp\]\s*socket failed to connect within \d+ms/i,
13
+ /\b(socket|connection|connect|request)\b.*\b(timed out|timeout)\b/i,
14
+ /\b(timed out|timeout)\b.*\b(socket|connection|connect|request|qr code)\b/i,
15
+ /\b(ETIMEDOUT|ECONNRESET|ECONNREFUSED|ENOTFOUND|ENETUNREACH|EHOSTUNREACH|EAI_AGAIN|UND_ERR_CONNECT_TIMEOUT)\b/i,
16
+ /\bfetch failed\b/i,
17
+ /\bnetworkerror\b/i,
18
+ /\bnetwork error\b/i,
19
+ /failed to connect to (telegram|whatsapp)/i,
20
+ /unable to connect to (telegram|whatsapp)/i,
21
+ /timeout generating qr code/i
22
+ ];
23
+ function errorToMessage(error) {
24
+ if (error instanceof Error) return error.message;
25
+ if (typeof error === "string") return error;
26
+ if (error === null || error === void 0) return "";
27
+ return String(error);
28
+ }
29
+ function getConnectorNetworkAuthErrorMessage(platform) {
30
+ return `Unable to connect to ${platformNames[platform]}. Please check your network connection and try again.`;
31
+ }
32
+ function isConnectorAuthNetworkError(error) {
33
+ const message = errorToMessage(error).trim();
34
+ if (!message) return false;
35
+ if (userActionTimeoutPatterns.some((pattern) => pattern.test(message))) {
36
+ return false;
37
+ }
38
+ return networkErrorPatterns.some((pattern) => pattern.test(message));
39
+ }
40
+ function formatConnectorAuthError(error, platform, fallback = "Authentication failed. Please try again.") {
41
+ if (isConnectorAuthNetworkError(error)) {
42
+ return getConnectorNetworkAuthErrorMessage(platform);
43
+ }
44
+ const message = errorToMessage(error).trim();
45
+ return message || fallback;
46
+ }
47
+ function formatConnectorConnectionError(error, platform, fallback = `Failed to connect to ${platformNames[platform]} servers`) {
48
+ if (isConnectorAuthNetworkError(error)) {
49
+ return getConnectorNetworkAuthErrorMessage(platform);
50
+ }
51
+ return fallback;
52
+ }
53
+
54
+ // src/platform-visuals.ts
55
+ var PLATFORM_LOGOS = {
56
+ slack: "/images/apps/slack.png",
57
+ telegram: "/images/apps/telegram.png",
58
+ discord: "/images/apps/discord.png",
59
+ whatsapp: "/images/apps/whatsapp.png",
60
+ gmail: "/images/apps/gmail.png",
61
+ outlook: "/images/apps/outlook.png",
62
+ imessage: "/images/apps/iMessage.png",
63
+ hubspot: "/images/apps/hubspot.png",
64
+ asana: "/images/apps/asana.png",
65
+ jira: "/images/apps/jira.png",
66
+ linear: "/images/apps/linear.png",
67
+ google_docs: "/images/apps/google_docs.png",
68
+ google_drive: "/images/apps/google_drive.png",
69
+ google_calendar: "/images/apps/google_calendar.png",
70
+ linkedin: "/images/apps/linkedin.png",
71
+ facebook_messenger: "/images/apps/facebook_messenger.png",
72
+ teams: "/images/apps/teams.png",
73
+ notion: "/images/apps/notion.png",
74
+ github: "/images/apps/github.png",
75
+ twitter: "/images/apps/twitter.png",
76
+ instagram: "/images/apps/instagram.png",
77
+ outlook_calendar: "/images/apps/outlook_calendar.png",
78
+ feishu: "/images/apps/feishu.png",
79
+ dingtalk: "/images/apps/DingTalk.png",
80
+ qqbot: "/images/apps/qq.png",
81
+ weixin: "/images/apps/WeChat.png"
82
+ };
83
+ var PLATFORM_DISPLAY_INFO = {
84
+ slack: {
85
+ icon: "slack",
86
+ label: "Slack",
87
+ iconBackground: "bg-[#4A154B]/10 text-[#4A154B]"
88
+ },
89
+ telegram: {
90
+ icon: "send_plane",
91
+ label: "Telegram",
92
+ iconBackground: "bg-[#0088CC]/10 text-[#0088CC]"
93
+ },
94
+ discord: {
95
+ icon: "hashtag",
96
+ label: "Discord",
97
+ iconBackground: "bg-[#5865F2]/10 text-[#5865F2]"
98
+ },
99
+ twitter: {
100
+ icon: "twitter-x",
101
+ label: "X (Twitter)",
102
+ iconBackground: "bg-black/10 text-black"
103
+ },
104
+ gmail: {
105
+ icon: "mail",
106
+ label: "Gmail",
107
+ iconBackground: "bg-red-500/10 text-red-500"
108
+ },
109
+ teams: {
110
+ icon: "panel_left",
111
+ label: "Microsoft Teams",
112
+ iconBackground: "bg-[#6264A7]/10 text-[#6264A7]"
113
+ },
114
+ whatsapp: {
115
+ icon: "message",
116
+ label: "WhatsApp",
117
+ iconBackground: "bg-[#25D366]/10 text-[#25D366]"
118
+ },
119
+ outlook: {
120
+ icon: "mail",
121
+ label: "Outlook",
122
+ iconBackground: "bg-[#0F7BFF]/10 text-[#0F7BFF]"
123
+ },
124
+ linkedin: {
125
+ icon: "linkedin",
126
+ label: "LinkedIn",
127
+ iconBackground: "bg-[#0A66C2]/10 text-[#0A66C2]"
128
+ },
129
+ facebook_messenger: {
130
+ icon: "message",
131
+ label: "Facebook Messenger",
132
+ iconBackground: "bg-[#0084FF]/10 text-[#0084FF]"
133
+ },
134
+ google_drive: {
135
+ icon: "cloud",
136
+ label: "Google Drive",
137
+ iconBackground: "bg-[#1A73E8]/10 text-[#1A73E8]"
138
+ },
139
+ google_docs: {
140
+ icon: "file_text",
141
+ label: "Google Docs",
142
+ iconBackground: "bg-[#1A73E8]/10 text-[#1A73E8]"
143
+ },
144
+ outlook_calendar: {
145
+ icon: "calendar",
146
+ label: "Outlook Calendar",
147
+ iconBackground: "bg-[#0F7BFF]/10 text-[#0F7BFF]"
148
+ },
149
+ hubspot: {
150
+ icon: "orbit",
151
+ label: "HubSpot",
152
+ iconBackground: "bg-[#FF7A59]/10 text-[#FF7A59]"
153
+ },
154
+ notion: {
155
+ icon: "blocks",
156
+ label: "Notion",
157
+ iconBackground: "bg-neutral-900/10 text-neutral-900"
158
+ },
159
+ github: {
160
+ icon: "github",
161
+ label: "GitHub",
162
+ iconBackground: "bg-neutral-900/10 text-neutral-900"
163
+ },
164
+ google_calendar: {
165
+ icon: "calendar",
166
+ label: "Google Calendar",
167
+ iconBackground: "bg-[#1A73E8]/10 text-[#1A73E8]"
168
+ },
169
+ google_meet: {
170
+ icon: "video",
171
+ label: "Google Meet",
172
+ iconBackground: "bg-[#0F9D58]/10 text-[#0F9D58]"
173
+ },
174
+ instagram: {
175
+ icon: "instagram",
176
+ label: "Instagram",
177
+ iconBackground: "bg-gradient-to-r from-[#F58529]/20 via-[#DD2A7B]/20 to-[#8134AF]/20 text-[#DD2A7B]"
178
+ },
179
+ asana: {
180
+ icon: "circle_check",
181
+ label: "Asana",
182
+ iconBackground: "bg-[#06B7D2]/10 text-[#06B7D2]"
183
+ },
184
+ jira: {
185
+ icon: "ticket",
186
+ label: "Jira",
187
+ iconBackground: "bg-[#0052CC]/10 text-[#0052CC]"
188
+ },
189
+ linear: {
190
+ icon: "zap",
191
+ label: "Linear",
192
+ iconBackground: "bg-[#5E6AD2]/10 text-[#5E6AD2]"
193
+ },
194
+ imessage: {
195
+ icon: "apple",
196
+ label: "iMessage",
197
+ iconBackground: "bg-[#007AFF]/10 text-[#007AFF]"
198
+ },
199
+ feishu: {
200
+ icon: "chat-smile",
201
+ label: "Lark/Feishu",
202
+ iconBackground: "bg-[#3370FF]/10 text-[#3370FF]"
203
+ },
204
+ dingtalk: {
205
+ icon: "chat-smile",
206
+ label: "DingTalk",
207
+ iconBackground: "bg-[#0089FF]/10 text-[#0089FF]"
208
+ },
209
+ qqbot: {
210
+ icon: "qq",
211
+ label: "QQ",
212
+ iconBackground: "bg-[#12B7F5]/10 text-[#12B7F5]"
213
+ },
214
+ weixin: {
215
+ icon: "chat-smile",
216
+ label: "Weixin",
217
+ iconBackground: "bg-[#07C160]/10 text-[#07C160]"
218
+ }
219
+ };
220
+ var PLATFORM_CONNECT_CARD_THEMES = {
221
+ discord: {
222
+ cardBackground: "#EEF0FF",
223
+ buttonBackground: "#5865F2",
224
+ buttonText: "#FFFFFF"
225
+ },
226
+ slack: {
227
+ cardBackground: "#F8EAF8",
228
+ buttonBackground: "#4A154B",
229
+ buttonText: "#FFFFFF"
230
+ },
231
+ gmail: {
232
+ cardBackground: "#EDEEF3",
233
+ buttonBackground: "#000000",
234
+ buttonText: "#FFFFFF"
235
+ },
236
+ imessage: {
237
+ cardBackground: "#E6FBE9",
238
+ buttonBackground: "#05C334",
239
+ buttonText: "#FFFFFF"
240
+ },
241
+ dingtalk: {
242
+ cardBackground: "#E5F3FF",
243
+ buttonBackground: "#2F9DFF",
244
+ buttonText: "#FFFFFF"
245
+ },
246
+ weixin: {
247
+ cardBackground: "#E4FBE8",
248
+ buttonBackground: "#14C900",
249
+ buttonText: "#FFFFFF"
250
+ },
251
+ hubspot: {
252
+ cardBackground: "#FDEDEA",
253
+ buttonBackground: "#FF5638",
254
+ buttonText: "#FFFFFF"
255
+ },
256
+ google_meet: {
257
+ cardBackground: "#E8F5EE",
258
+ buttonBackground: "#0F9D58",
259
+ buttonText: "#FFFFFF"
260
+ },
261
+ notion: {
262
+ cardBackground: "#EFEFF4",
263
+ buttonBackground: "#000000",
264
+ buttonText: "#FFFFFF"
265
+ },
266
+ telegram: {
267
+ cardBackground: "#E5F5FC",
268
+ buttonBackground: "#29A9E1",
269
+ buttonText: "#FFFFFF"
270
+ },
271
+ whatsapp: {
272
+ cardBackground: "#E6FBE9",
273
+ buttonBackground: "#05C334",
274
+ buttonText: "#FFFFFF"
275
+ },
276
+ outlook: {
277
+ cardBackground: "#E5F3FF",
278
+ buttonBackground: "#0A6EC7",
279
+ buttonText: "#FFFFFF"
280
+ },
281
+ feishu: {
282
+ cardBackground: "#E5F1FF",
283
+ buttonBackground: "#0B74FF",
284
+ buttonText: "#FFFFFF"
285
+ },
286
+ qqbot: {
287
+ cardBackground: "#E5F3FF",
288
+ buttonBackground: "#2F9DFF",
289
+ buttonText: "#FFFFFF"
290
+ },
291
+ twitter: {
292
+ cardBackground: "#EFEFF4",
293
+ buttonBackground: "#000000",
294
+ buttonText: "#FFFFFF"
295
+ },
296
+ linkedin: {
297
+ cardBackground: "#E5F3FF",
298
+ buttonBackground: "#0A66C2",
299
+ buttonText: "#FFFFFF"
300
+ },
301
+ google_drive: {
302
+ cardBackground: "#E8F1FE",
303
+ buttonBackground: "#1A73E8",
304
+ buttonText: "#FFFFFF"
305
+ },
306
+ google_docs: {
307
+ cardBackground: "#E8F1FE",
308
+ buttonBackground: "#1A73E8",
309
+ buttonText: "#FFFFFF"
310
+ },
311
+ google_calendar: {
312
+ cardBackground: "#E8F1FE",
313
+ buttonBackground: "#1A73E8",
314
+ buttonText: "#FFFFFF"
315
+ },
316
+ outlook_calendar: {
317
+ cardBackground: "#E5F3FF",
318
+ buttonBackground: "#0F7BFF",
319
+ buttonText: "#FFFFFF"
320
+ },
321
+ teams: {
322
+ cardBackground: "#EEEEFA",
323
+ buttonBackground: "#6264A7",
324
+ buttonText: "#FFFFFF"
325
+ },
326
+ facebook_messenger: {
327
+ cardBackground: "#E5F3FF",
328
+ buttonBackground: "#0084FF",
329
+ buttonText: "#FFFFFF"
330
+ },
331
+ github: {
332
+ cardBackground: "#EFEFF4",
333
+ buttonBackground: "#000000",
334
+ buttonText: "#FFFFFF"
335
+ },
336
+ instagram: {
337
+ cardBackground: "#FCEAF3",
338
+ buttonBackground: "#DD2A7B",
339
+ buttonText: "#FFFFFF"
340
+ },
341
+ asana: {
342
+ cardBackground: "#E6F8FB",
343
+ buttonBackground: "#06B7D2",
344
+ buttonText: "#FFFFFF"
345
+ },
346
+ jira: {
347
+ cardBackground: "#E8F1FF",
348
+ buttonBackground: "#0052CC",
349
+ buttonText: "#FFFFFF"
350
+ },
351
+ linear: {
352
+ cardBackground: "#EEEEFB",
353
+ buttonBackground: "#5E6AD2",
354
+ buttonText: "#FFFFFF"
355
+ }
356
+ };
357
+ function resolvePlatformLogo(platformId) {
358
+ return PLATFORM_LOGOS[platformId] ?? null;
359
+ }
360
+ function getPlatformDisplayInfo(platformId, t) {
361
+ const info = PLATFORM_DISPLAY_INFO[platformId];
362
+ if (!info) {
363
+ return {
364
+ icon: "ticket",
365
+ label: platformId.charAt(0).toUpperCase() + platformId.slice(1),
366
+ iconBackground: "bg-gray-500/10 text-gray-500"
367
+ };
368
+ }
369
+ return {
370
+ ...info,
371
+ label: platformId === "weixin" ? t?.("platform.weixin") ?? info.label : info.label
372
+ };
373
+ }
374
+ function getPlatformConnectCardTheme(platformId) {
375
+ return PLATFORM_CONNECT_CARD_THEMES[platformId] ?? {
376
+ cardBackground: "#EFEFF4",
377
+ buttonBackground: "#000000",
378
+ buttonText: "#FFFFFF"
379
+ };
380
+ }
381
+
382
+ // src/platform-connectability.ts
383
+ var ALL_INTEGRATION_PLATFORMS = [
384
+ "telegram",
385
+ "whatsapp",
386
+ "slack",
387
+ "discord",
388
+ "gmail",
389
+ "outlook",
390
+ "linkedin",
391
+ "instagram",
392
+ "twitter",
393
+ "google_calendar",
394
+ "google_meet",
395
+ "outlook_calendar",
396
+ "teams",
397
+ "facebook_messenger",
398
+ "google_drive",
399
+ "google_docs",
400
+ "hubspot",
401
+ "notion",
402
+ "github",
403
+ "asana",
404
+ "jira",
405
+ "linear",
406
+ "imessage",
407
+ "feishu",
408
+ "dingtalk",
409
+ "qqbot",
410
+ "weixin"
411
+ ];
412
+ var COMING_SOON_PLATFORMS = /* @__PURE__ */ new Set([
413
+ "github",
414
+ "instagram",
415
+ "facebook_messenger",
416
+ "teams",
417
+ "asana",
418
+ "jira",
419
+ "linear"
420
+ ]);
421
+ var HIDDEN_CONNECTOR_PLATFORMS = /* @__PURE__ */ new Set([
422
+ // Google Meet's Composio toolkit is retained as a low-level future hook
423
+ // for Meet spaces/artifacts, but it is not a user-facing connector today:
424
+ // it cannot represent "meetings I attended" or schedule meetings by itself.
425
+ // Calendar remains the user-facing connector for meeting schedules.
426
+ "google_meet"
427
+ ]);
428
+ function isIntegrationPlatformConnectable(platform) {
429
+ if (HIDDEN_CONNECTOR_PLATFORMS.has(platform)) return false;
430
+ if (COMING_SOON_PLATFORMS.has(platform)) return false;
431
+ switch (platform) {
432
+ case "outlook_calendar":
433
+ return process.env.NEXT_PUBLIC_OUTLOOK_CALENDAR_ENABLED === "true";
434
+ default:
435
+ return true;
436
+ }
437
+ }
438
+ function getConnectableIntegrationPlatforms() {
439
+ return ALL_INTEGRATION_PLATFORMS.filter((platform) => isIntegrationPlatformConnectable(platform));
440
+ }
441
+ function isIntegrationPlatformVisible(platform, options = { hasConnectedAccounts: false }) {
442
+ if (HIDDEN_CONNECTOR_PLATFORMS.has(platform)) return false;
443
+ if (isIntegrationPlatformConnectable(platform)) return true;
444
+ return options.hasConnectedAccounts;
445
+ }
446
+
447
+ // src/task-integration-inference.ts
448
+ var SOURCE_PLATFORM_RULES = [
449
+ {
450
+ platform: "gmail",
451
+ label: "Gmail",
452
+ patterns: [
453
+ /\bgmail\b/i,
454
+ /谷歌邮箱/i,
455
+ /google\s*mail/i,
456
+ /(?:我的|从|读取|拉取|整理|分析|监控|检查|查看).{0,12}(?:邮箱|邮件)/i,
457
+ /(?:邮箱|邮件).{0,12}(?:拉取|读取|整理|分析|监控|检查|查看)/i
458
+ ]
459
+ },
460
+ {
461
+ platform: "outlook",
462
+ label: "Outlook",
463
+ patterns: [/\boutlook\b/i, /微软邮箱/i]
464
+ },
465
+ {
466
+ platform: "slack",
467
+ label: "Slack",
468
+ patterns: [/\bslack\b/i]
469
+ },
470
+ {
471
+ platform: "telegram",
472
+ label: "Telegram",
473
+ patterns: [/\btelegram\b/i, /\btg\b/i]
474
+ },
475
+ {
476
+ platform: "discord",
477
+ label: "Discord",
478
+ patterns: [/\bdiscord\b/i]
479
+ },
480
+ {
481
+ platform: "notion",
482
+ label: "Notion",
483
+ patterns: [/\bnotion\b/i]
484
+ },
485
+ {
486
+ platform: "twitter",
487
+ label: "X/Twitter",
488
+ labelPatterns: ["\u63A8\u7279", "tweets?"],
489
+ patterns: [
490
+ /\btwitter\b/i,
491
+ /\btweet(?:s)?\b/i,
492
+ /推特/i,
493
+ /(?:从|读取|拉取|整理|分析|监控|检查|查看).{0,12}(?:推文|提及|私信)/i,
494
+ /(?:推文|提及|私信).{0,12}(?:读取|拉取|整理|分析|监控|检查|查看)/i
495
+ ]
496
+ }
497
+ ];
498
+ var EMAIL_PLATFORMS = /* @__PURE__ */ new Set(["gmail", "outlook"]);
499
+ var NOTIFICATION_INTENT_PATTERN = /(?:发送|发到|推送|通知|同步|send|notify|push|post|发给).{0,20}/i;
500
+ var EMAIL_SOURCE_STRONG_PATTERNS = [
501
+ /(?:从|读取|拉取|整理|分析|监控|检查|查看).{0,12}(?:邮箱|邮件|收件箱|inbox|email)/i,
502
+ /(?:邮箱|邮件|收件箱|inbox).{0,12}(?:拉取|读取|整理|分析|监控|检查|查看)/i
503
+ ];
504
+ var EMAIL_NOTIFICATION_STRONG_PATTERNS = [
505
+ /(?:通过|用|使用).{0,10}(?:gmail|outlook|邮箱|邮件|email).{0,10}(?:发送|发到|通知|推送|发给|send|notify|push)/i,
506
+ /(?:发送|发到|通知|推送|发给).{0,10}(?:gmail|outlook|邮箱|邮件|email)/i,
507
+ /(?:邮件|email).{0,6}(?:发送|发到|通知|推送|发给|send|notify|push)/i
508
+ ];
509
+ function hasAnyPattern(text, patterns) {
510
+ return patterns.some((pattern) => pattern.test(text));
511
+ }
512
+ function isNotificationIntent(text, platform) {
513
+ if (EMAIL_PLATFORMS.has(platform)) {
514
+ const platformPattern2 = new RegExp(platform.replace("_", "[_\\s-]?"), "i");
515
+ const hasPlatformMention = platformPattern2.test(text) || /(?:邮箱|邮件|email)/i.test(text);
516
+ if (!hasPlatformMention) return false;
517
+ return EMAIL_NOTIFICATION_STRONG_PATTERNS.some((p) => p.test(text));
518
+ }
519
+ const platformPattern = new RegExp(platform.replace("_", "[_\\s-]?"), "i");
520
+ if (!platformPattern.test(text)) return false;
521
+ return NOTIFICATION_INTENT_PATTERN.test(text);
522
+ }
523
+ function escapeRegex(s) {
524
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
525
+ }
526
+ function isSourceIntent(text, rule) {
527
+ if (!hasAnyPattern(text, rule.patterns)) return false;
528
+ if (EMAIL_PLATFORMS.has(rule.platform)) {
529
+ if (EMAIL_SOURCE_STRONG_PATTERNS.some((p) => p.test(text))) {
530
+ return true;
531
+ }
532
+ if (EMAIL_NOTIFICATION_STRONG_PATTERNS.some((p) => p.test(text))) {
533
+ return false;
534
+ }
535
+ return true;
536
+ }
537
+ const escapedLabels = /* @__PURE__ */ new Set([rule.label, ...rule.label.split("/"), rule.platform]);
538
+ const labelAlt = [...Array.from(escapedLabels).map(escapeRegex), ...rule.labelPatterns ?? []].join("|");
539
+ return new RegExp(
540
+ `(?:\u4ECE|\u8BFB\u53D6|\u62C9\u53D6|\u6574\u7406|\u5206\u6790|\u76D1\u63A7|\u68C0\u67E5|\u67E5\u770B)\\s*(?:\u6211\u7684)?\\s*(?:${labelAlt})|(?:${labelAlt}).{0,16}(?:\u8BFB\u53D6|\u62C9\u53D6|\u6574\u7406|\u5206\u6790|\u76D1\u63A7|\u68C0\u67E5|\u67E5\u770B|\u6D88\u606F|\u9891\u9053|channel|messages)`,
541
+ "i"
542
+ ).test(text);
543
+ }
544
+ function inferTaskIntegrationRequirementsFromText(text) {
545
+ const trimmed = text.trim();
546
+ if (!trimmed) {
547
+ return { sources: [], notificationChannels: [] };
548
+ }
549
+ const sourcePlatforms = SOURCE_PLATFORM_RULES.filter((rule) => isSourceIntent(trimmed, rule));
550
+ const notificationPlatforms = SOURCE_PLATFORM_RULES.filter(
551
+ (rule) => isNotificationIntent(trimmed, rule.platform)
552
+ );
553
+ return {
554
+ sources: sourcePlatforms.map((rule) => ({
555
+ type: "channel",
556
+ name: `${rule.platform}:__required__::${rule.label}`
557
+ })),
558
+ notificationChannels: notificationPlatforms.map((rule) => `${rule.platform}:__required__`)
559
+ };
560
+ }
561
+
562
+ // src/oauth-callback-script.ts
563
+ function jsonForScript(value) {
564
+ const serialized = JSON.stringify(value);
565
+ if (serialized === void 0) return serialized;
566
+ return serialized.replace(/</g, "\\u003c");
567
+ }
568
+
569
+ export { formatConnectorAuthError, formatConnectorConnectionError, getConnectableIntegrationPlatforms, getConnectorNetworkAuthErrorMessage, getPlatformConnectCardTheme, getPlatformDisplayInfo, inferTaskIntegrationRequirementsFromText, isConnectorAuthNetworkError, isIntegrationPlatformConnectable, isIntegrationPlatformVisible, jsonForScript, resolvePlatformLogo };
570
+ //# sourceMappingURL=index.js.map
571
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/authorization-errors.ts","../src/platform-visuals.ts","../src/platform-connectability.ts","../src/task-integration-inference.ts","../src/oauth-callback-script.ts"],"names":["platformPattern"],"mappings":"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","file":"index.js","sourcesContent":["export type ConnectorAuthPlatform = \"telegram\" | \"whatsapp\";\n\nconst platformNames: Record<ConnectorAuthPlatform, string> = {\n\ttelegram: \"Telegram\",\n\twhatsapp: \"WhatsApp\",\n};\n\nconst userActionTimeoutPatterns = [\n\t/password input timed out/i,\n\t/verification code timed out/i,\n\t/qr login timed out/i,\n];\n\n// Server routes return getConnectorNetworkAuthErrorMessage() and client UI\n// localizes it by running this matcher again. Keep those generated messages\n// covered here whenever their wording changes.\n// Auth-stage formatting preserves actionable auth messages and codes, while\n// connection-stage formatting hides unknown SDK internals behind a fallback.\nconst networkErrorPatterns = [\n\t/\\[whatsapp\\]\\s*socket failed to connect within \\d+ms/i,\n\t/\\b(socket|connection|connect|request)\\b.*\\b(timed out|timeout)\\b/i,\n\t/\\b(timed out|timeout)\\b.*\\b(socket|connection|connect|request|qr code)\\b/i,\n\t/\\b(ETIMEDOUT|ECONNRESET|ECONNREFUSED|ENOTFOUND|ENETUNREACH|EHOSTUNREACH|EAI_AGAIN|UND_ERR_CONNECT_TIMEOUT)\\b/i,\n\t/\\bfetch failed\\b/i,\n\t/\\bnetworkerror\\b/i,\n\t/\\bnetwork error\\b/i,\n\t/failed to connect to (telegram|whatsapp)/i,\n\t/unable to connect to (telegram|whatsapp)/i,\n\t/timeout generating qr code/i,\n];\n\nfunction errorToMessage(error: unknown): string {\n\tif (error instanceof Error) return error.message;\n\tif (typeof error === \"string\") return error;\n\tif (error === null || error === undefined) return \"\";\n\treturn String(error);\n}\n\nexport function getConnectorNetworkAuthErrorMessage(platform: ConnectorAuthPlatform): string {\n\treturn `Unable to connect to ${platformNames[platform]}. Please check your network connection and try again.`;\n}\n\nexport function isConnectorAuthNetworkError(error: unknown): boolean {\n\tconst message = errorToMessage(error).trim();\n\tif (!message) return false;\n\tif (userActionTimeoutPatterns.some((pattern) => pattern.test(message))) {\n\t\treturn false;\n\t}\n\treturn networkErrorPatterns.some((pattern) => pattern.test(message));\n}\n\nexport function formatConnectorAuthError(\n\terror: unknown,\n\tplatform: ConnectorAuthPlatform,\n\tfallback = \"Authentication failed. Please try again.\",\n): string {\n\tif (isConnectorAuthNetworkError(error)) {\n\t\treturn getConnectorNetworkAuthErrorMessage(platform);\n\t}\n\n\tconst message = errorToMessage(error).trim();\n\treturn message || fallback;\n}\n\nexport function formatConnectorConnectionError(\n\terror: unknown,\n\tplatform: ConnectorAuthPlatform,\n\tfallback = `Failed to connect to ${platformNames[platform]} servers`,\n): string {\n\tif (isConnectorAuthNetworkError(error)) {\n\t\treturn getConnectorNetworkAuthErrorMessage(platform);\n\t}\n\n\treturn fallback;\n}\n","import type { IntegrationId } from \"@melandlabs/contracts/integration-id\";\nimport type { TFunction } from \"i18next\";\n\nexport interface PlatformDisplayInfo {\n\ticon: string;\n\tlabel: string;\n\ticonBackground: string;\n}\n\nexport interface PlatformConnectCardTheme {\n\tcardBackground: string;\n\tbuttonBackground: string;\n\tbuttonText: string;\n}\n\nconst PLATFORM_LOGOS: Partial<Record<IntegrationId, string>> = {\n\tslack: \"/images/apps/slack.png\",\n\ttelegram: \"/images/apps/telegram.png\",\n\tdiscord: \"/images/apps/discord.png\",\n\twhatsapp: \"/images/apps/whatsapp.png\",\n\tgmail: \"/images/apps/gmail.png\",\n\toutlook: \"/images/apps/outlook.png\",\n\timessage: \"/images/apps/iMessage.png\",\n\thubspot: \"/images/apps/hubspot.png\",\n\tasana: \"/images/apps/asana.png\",\n\tjira: \"/images/apps/jira.png\",\n\tlinear: \"/images/apps/linear.png\",\n\tgoogle_docs: \"/images/apps/google_docs.png\",\n\tgoogle_drive: \"/images/apps/google_drive.png\",\n\tgoogle_calendar: \"/images/apps/google_calendar.png\",\n\tlinkedin: \"/images/apps/linkedin.png\",\n\tfacebook_messenger: \"/images/apps/facebook_messenger.png\",\n\tteams: \"/images/apps/teams.png\",\n\tnotion: \"/images/apps/notion.png\",\n\tgithub: \"/images/apps/github.png\",\n\ttwitter: \"/images/apps/twitter.png\",\n\tinstagram: \"/images/apps/instagram.png\",\n\toutlook_calendar: \"/images/apps/outlook_calendar.png\",\n\tfeishu: \"/images/apps/feishu.png\",\n\tdingtalk: \"/images/apps/DingTalk.png\",\n\tqqbot: \"/images/apps/qq.png\",\n\tweixin: \"/images/apps/WeChat.png\",\n};\n\nconst PLATFORM_DISPLAY_INFO: Record<IntegrationId, Omit<PlatformDisplayInfo, \"label\"> & { label: string }> = {\n\tslack: {\n\t\ticon: \"slack\",\n\t\tlabel: \"Slack\",\n\t\ticonBackground: \"bg-[#4A154B]/10 text-[#4A154B]\",\n\t},\n\ttelegram: {\n\t\ticon: \"send_plane\",\n\t\tlabel: \"Telegram\",\n\t\ticonBackground: \"bg-[#0088CC]/10 text-[#0088CC]\",\n\t},\n\tdiscord: {\n\t\ticon: \"hashtag\",\n\t\tlabel: \"Discord\",\n\t\ticonBackground: \"bg-[#5865F2]/10 text-[#5865F2]\",\n\t},\n\ttwitter: {\n\t\ticon: \"twitter-x\",\n\t\tlabel: \"X (Twitter)\",\n\t\ticonBackground: \"bg-black/10 text-black\",\n\t},\n\tgmail: {\n\t\ticon: \"mail\",\n\t\tlabel: \"Gmail\",\n\t\ticonBackground: \"bg-red-500/10 text-red-500\",\n\t},\n\tteams: {\n\t\ticon: \"panel_left\",\n\t\tlabel: \"Microsoft Teams\",\n\t\ticonBackground: \"bg-[#6264A7]/10 text-[#6264A7]\",\n\t},\n\twhatsapp: {\n\t\ticon: \"message\",\n\t\tlabel: \"WhatsApp\",\n\t\ticonBackground: \"bg-[#25D366]/10 text-[#25D366]\",\n\t},\n\toutlook: {\n\t\ticon: \"mail\",\n\t\tlabel: \"Outlook\",\n\t\ticonBackground: \"bg-[#0F7BFF]/10 text-[#0F7BFF]\",\n\t},\n\tlinkedin: {\n\t\ticon: \"linkedin\",\n\t\tlabel: \"LinkedIn\",\n\t\ticonBackground: \"bg-[#0A66C2]/10 text-[#0A66C2]\",\n\t},\n\tfacebook_messenger: {\n\t\ticon: \"message\",\n\t\tlabel: \"Facebook Messenger\",\n\t\ticonBackground: \"bg-[#0084FF]/10 text-[#0084FF]\",\n\t},\n\tgoogle_drive: {\n\t\ticon: \"cloud\",\n\t\tlabel: \"Google Drive\",\n\t\ticonBackground: \"bg-[#1A73E8]/10 text-[#1A73E8]\",\n\t},\n\tgoogle_docs: {\n\t\ticon: \"file_text\",\n\t\tlabel: \"Google Docs\",\n\t\ticonBackground: \"bg-[#1A73E8]/10 text-[#1A73E8]\",\n\t},\n\toutlook_calendar: {\n\t\ticon: \"calendar\",\n\t\tlabel: \"Outlook Calendar\",\n\t\ticonBackground: \"bg-[#0F7BFF]/10 text-[#0F7BFF]\",\n\t},\n\thubspot: {\n\t\ticon: \"orbit\",\n\t\tlabel: \"HubSpot\",\n\t\ticonBackground: \"bg-[#FF7A59]/10 text-[#FF7A59]\",\n\t},\n\tnotion: {\n\t\ticon: \"blocks\",\n\t\tlabel: \"Notion\",\n\t\ticonBackground: \"bg-neutral-900/10 text-neutral-900\",\n\t},\n\tgithub: {\n\t\ticon: \"github\",\n\t\tlabel: \"GitHub\",\n\t\ticonBackground: \"bg-neutral-900/10 text-neutral-900\",\n\t},\n\tgoogle_calendar: {\n\t\ticon: \"calendar\",\n\t\tlabel: \"Google Calendar\",\n\t\ticonBackground: \"bg-[#1A73E8]/10 text-[#1A73E8]\",\n\t},\n\tgoogle_meet: {\n\t\ticon: \"video\",\n\t\tlabel: \"Google Meet\",\n\t\ticonBackground: \"bg-[#0F9D58]/10 text-[#0F9D58]\",\n\t},\n\tinstagram: {\n\t\ticon: \"instagram\",\n\t\tlabel: \"Instagram\",\n\t\ticonBackground: \"bg-gradient-to-r from-[#F58529]/20 via-[#DD2A7B]/20 to-[#8134AF]/20 text-[#DD2A7B]\",\n\t},\n\tasana: {\n\t\ticon: \"circle_check\",\n\t\tlabel: \"Asana\",\n\t\ticonBackground: \"bg-[#06B7D2]/10 text-[#06B7D2]\",\n\t},\n\tjira: {\n\t\ticon: \"ticket\",\n\t\tlabel: \"Jira\",\n\t\ticonBackground: \"bg-[#0052CC]/10 text-[#0052CC]\",\n\t},\n\tlinear: {\n\t\ticon: \"zap\",\n\t\tlabel: \"Linear\",\n\t\ticonBackground: \"bg-[#5E6AD2]/10 text-[#5E6AD2]\",\n\t},\n\timessage: {\n\t\ticon: \"apple\",\n\t\tlabel: \"iMessage\",\n\t\ticonBackground: \"bg-[#007AFF]/10 text-[#007AFF]\",\n\t},\n\tfeishu: {\n\t\ticon: \"chat-smile\",\n\t\tlabel: \"Lark/Feishu\",\n\t\ticonBackground: \"bg-[#3370FF]/10 text-[#3370FF]\",\n\t},\n\tdingtalk: {\n\t\ticon: \"chat-smile\",\n\t\tlabel: \"DingTalk\",\n\t\ticonBackground: \"bg-[#0089FF]/10 text-[#0089FF]\",\n\t},\n\tqqbot: {\n\t\ticon: \"qq\",\n\t\tlabel: \"QQ\",\n\t\ticonBackground: \"bg-[#12B7F5]/10 text-[#12B7F5]\",\n\t},\n\tweixin: {\n\t\ticon: \"chat-smile\",\n\t\tlabel: \"Weixin\",\n\t\ticonBackground: \"bg-[#07C160]/10 text-[#07C160]\",\n\t},\n};\n\nconst PLATFORM_CONNECT_CARD_THEMES: Record<IntegrationId, PlatformConnectCardTheme> = {\n\tdiscord: {\n\t\tcardBackground: \"#EEF0FF\",\n\t\tbuttonBackground: \"#5865F2\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tslack: {\n\t\tcardBackground: \"#F8EAF8\",\n\t\tbuttonBackground: \"#4A154B\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tgmail: {\n\t\tcardBackground: \"#EDEEF3\",\n\t\tbuttonBackground: \"#000000\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\timessage: {\n\t\tcardBackground: \"#E6FBE9\",\n\t\tbuttonBackground: \"#05C334\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tdingtalk: {\n\t\tcardBackground: \"#E5F3FF\",\n\t\tbuttonBackground: \"#2F9DFF\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tweixin: {\n\t\tcardBackground: \"#E4FBE8\",\n\t\tbuttonBackground: \"#14C900\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\thubspot: {\n\t\tcardBackground: \"#FDEDEA\",\n\t\tbuttonBackground: \"#FF5638\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tgoogle_meet: {\n\t\tcardBackground: \"#E8F5EE\",\n\t\tbuttonBackground: \"#0F9D58\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tnotion: {\n\t\tcardBackground: \"#EFEFF4\",\n\t\tbuttonBackground: \"#000000\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\ttelegram: {\n\t\tcardBackground: \"#E5F5FC\",\n\t\tbuttonBackground: \"#29A9E1\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\twhatsapp: {\n\t\tcardBackground: \"#E6FBE9\",\n\t\tbuttonBackground: \"#05C334\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\toutlook: {\n\t\tcardBackground: \"#E5F3FF\",\n\t\tbuttonBackground: \"#0A6EC7\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tfeishu: {\n\t\tcardBackground: \"#E5F1FF\",\n\t\tbuttonBackground: \"#0B74FF\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tqqbot: {\n\t\tcardBackground: \"#E5F3FF\",\n\t\tbuttonBackground: \"#2F9DFF\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\ttwitter: {\n\t\tcardBackground: \"#EFEFF4\",\n\t\tbuttonBackground: \"#000000\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tlinkedin: {\n\t\tcardBackground: \"#E5F3FF\",\n\t\tbuttonBackground: \"#0A66C2\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tgoogle_drive: {\n\t\tcardBackground: \"#E8F1FE\",\n\t\tbuttonBackground: \"#1A73E8\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tgoogle_docs: {\n\t\tcardBackground: \"#E8F1FE\",\n\t\tbuttonBackground: \"#1A73E8\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tgoogle_calendar: {\n\t\tcardBackground: \"#E8F1FE\",\n\t\tbuttonBackground: \"#1A73E8\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\toutlook_calendar: {\n\t\tcardBackground: \"#E5F3FF\",\n\t\tbuttonBackground: \"#0F7BFF\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tteams: {\n\t\tcardBackground: \"#EEEEFA\",\n\t\tbuttonBackground: \"#6264A7\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tfacebook_messenger: {\n\t\tcardBackground: \"#E5F3FF\",\n\t\tbuttonBackground: \"#0084FF\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tgithub: {\n\t\tcardBackground: \"#EFEFF4\",\n\t\tbuttonBackground: \"#000000\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tinstagram: {\n\t\tcardBackground: \"#FCEAF3\",\n\t\tbuttonBackground: \"#DD2A7B\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tasana: {\n\t\tcardBackground: \"#E6F8FB\",\n\t\tbuttonBackground: \"#06B7D2\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tjira: {\n\t\tcardBackground: \"#E8F1FF\",\n\t\tbuttonBackground: \"#0052CC\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n\tlinear: {\n\t\tcardBackground: \"#EEEEFB\",\n\t\tbuttonBackground: \"#5E6AD2\",\n\t\tbuttonText: \"#FFFFFF\",\n\t},\n};\n\nexport function resolvePlatformLogo(platformId: IntegrationId): string | null {\n\treturn PLATFORM_LOGOS[platformId] ?? null;\n}\n\nexport function getPlatformDisplayInfo(platformId: IntegrationId, t?: TFunction): PlatformDisplayInfo {\n\tconst info = PLATFORM_DISPLAY_INFO[platformId];\n\tif (!info) {\n\t\treturn {\n\t\t\ticon: \"ticket\",\n\t\t\tlabel: platformId.charAt(0).toUpperCase() + platformId.slice(1),\n\t\t\ticonBackground: \"bg-gray-500/10 text-gray-500\",\n\t\t};\n\t}\n\n\treturn {\n\t\t...info,\n\t\tlabel: platformId === \"weixin\" ? (t?.(\"platform.weixin\") ?? info.label) : info.label,\n\t};\n}\n\nexport function getPlatformConnectCardTheme(platformId: IntegrationId): PlatformConnectCardTheme {\n\treturn (\n\t\tPLATFORM_CONNECT_CARD_THEMES[platformId] ?? {\n\t\t\tcardBackground: \"#EFEFF4\",\n\t\t\tbuttonBackground: \"#000000\",\n\t\t\tbuttonText: \"#FFFFFF\",\n\t\t}\n\t);\n}\n","import type { IntegrationId } from \"@melandlabs/contracts/integration-id\";\n\nconst ALL_INTEGRATION_PLATFORMS: IntegrationId[] = [\n\t\"telegram\",\n\t\"whatsapp\",\n\t\"slack\",\n\t\"discord\",\n\t\"gmail\",\n\t\"outlook\",\n\t\"linkedin\",\n\t\"instagram\",\n\t\"twitter\",\n\t\"google_calendar\",\n\t\"google_meet\",\n\t\"outlook_calendar\",\n\t\"teams\",\n\t\"facebook_messenger\",\n\t\"google_drive\",\n\t\"google_docs\",\n\t\"hubspot\",\n\t\"notion\",\n\t\"github\",\n\t\"asana\",\n\t\"jira\",\n\t\"linear\",\n\t\"imessage\",\n\t\"feishu\",\n\t\"dingtalk\",\n\t\"qqbot\",\n\t\"weixin\",\n];\n\nconst COMING_SOON_PLATFORMS = new Set<IntegrationId>([\n\t\"github\",\n\t\"instagram\",\n\t\"facebook_messenger\",\n\t\"teams\",\n\t\"asana\",\n\t\"jira\",\n\t\"linear\",\n]);\n\nconst HIDDEN_CONNECTOR_PLATFORMS = new Set<IntegrationId>([\n\t// Google Meet's Composio toolkit is retained as a low-level future hook\n\t// for Meet spaces/artifacts, but it is not a user-facing connector today:\n\t// it cannot represent \"meetings I attended\" or schedule meetings by itself.\n\t// Calendar remains the user-facing connector for meeting schedules.\n\t\"google_meet\",\n]);\n\nexport function isIntegrationPlatformConnectable(platform: IntegrationId) {\n\tif (HIDDEN_CONNECTOR_PLATFORMS.has(platform)) return false;\n\tif (COMING_SOON_PLATFORMS.has(platform)) return false;\n\n\tswitch (platform) {\n\t\tcase \"outlook_calendar\":\n\t\t\treturn process.env.NEXT_PUBLIC_OUTLOOK_CALENDAR_ENABLED === \"true\";\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nexport function getConnectableIntegrationPlatforms(): IntegrationId[] {\n\treturn ALL_INTEGRATION_PLATFORMS.filter((platform) => isIntegrationPlatformConnectable(platform));\n}\n\n/**\n * Whether a platform should be surfaced in the main integration grid.\n *\n * Connectability (\"may a new connection be initiated?\") is not the same\n * gate as visibility. A coming-soon platform with no accounts stays in\n * the \"coming soon\" group; one with existing accounts must remain\n * visible so legacy / beta-path connections stay manageable instead of\n * disappearing from the UI.\n */\nexport function isIntegrationPlatformVisible(\n\tplatform: IntegrationId,\n\toptions: { hasConnectedAccounts: boolean } = { hasConnectedAccounts: false },\n): boolean {\n\tif (HIDDEN_CONNECTOR_PLATFORMS.has(platform)) return false;\n\tif (isIntegrationPlatformConnectable(platform)) return true;\n\treturn options.hasConnectedAccounts;\n}\n","import type { IntegrationId } from \"@melandlabs/contracts/integration-id\";\n\nexport type InferredTaskSource = {\n\ttype: \"channel\";\n\tname: string;\n};\n\nexport type InferredTaskIntegrationRequirements = {\n\tsources: InferredTaskSource[];\n\tnotificationChannels: string[];\n};\n\ntype PlatformRule = {\n\tplatform: IntegrationId;\n\tlabel: string;\n\tpatterns: RegExp[];\n\tlabelPatterns?: string[];\n};\n\nconst SOURCE_PLATFORM_RULES: PlatformRule[] = [\n\t{\n\t\tplatform: \"gmail\",\n\t\tlabel: \"Gmail\",\n\t\tpatterns: [\n\t\t\t/\\bgmail\\b/i,\n\t\t\t/谷歌邮箱/i,\n\t\t\t/google\\s*mail/i,\n\t\t\t/(?:我的|从|读取|拉取|整理|分析|监控|检查|查看).{0,12}(?:邮箱|邮件)/i,\n\t\t\t/(?:邮箱|邮件).{0,12}(?:拉取|读取|整理|分析|监控|检查|查看)/i,\n\t\t],\n\t},\n\t{\n\t\tplatform: \"outlook\",\n\t\tlabel: \"Outlook\",\n\t\tpatterns: [/\\boutlook\\b/i, /微软邮箱/i],\n\t},\n\t{\n\t\tplatform: \"slack\",\n\t\tlabel: \"Slack\",\n\t\tpatterns: [/\\bslack\\b/i],\n\t},\n\t{\n\t\tplatform: \"telegram\",\n\t\tlabel: \"Telegram\",\n\t\tpatterns: [/\\btelegram\\b/i, /\\btg\\b/i],\n\t},\n\t{\n\t\tplatform: \"discord\",\n\t\tlabel: \"Discord\",\n\t\tpatterns: [/\\bdiscord\\b/i],\n\t},\n\t{\n\t\tplatform: \"notion\",\n\t\tlabel: \"Notion\",\n\t\tpatterns: [/\\bnotion\\b/i],\n\t},\n\t{\n\t\tplatform: \"twitter\",\n\t\tlabel: \"X/Twitter\",\n\t\tlabelPatterns: [\"推特\", \"tweets?\"],\n\t\tpatterns: [\n\t\t\t/\\btwitter\\b/i,\n\t\t\t/\\btweet(?:s)?\\b/i,\n\t\t\t/推特/i,\n\t\t\t/(?:从|读取|拉取|整理|分析|监控|检查|查看).{0,12}(?:推文|提及|私信)/i,\n\t\t\t/(?:推文|提及|私信).{0,12}(?:读取|拉取|整理|分析|监控|检查|查看)/i,\n\t\t],\n\t},\n];\n\n/** Email platforms can serve as both data sources and notification channels. */\nconst EMAIL_PLATFORMS = new Set<IntegrationId>([\"gmail\", \"outlook\"]);\n\nconst NOTIFICATION_INTENT_PATTERN = /(?:发送|发到|推送|通知|同步|send|notify|push|post|发给).{0,20}/i;\n\n/** Patterns that strongly indicate a source (read/pull) intent for email platforms. */\nconst EMAIL_SOURCE_STRONG_PATTERNS: RegExp[] = [\n\t/(?:从|读取|拉取|整理|分析|监控|检查|查看).{0,12}(?:邮箱|邮件|收件箱|inbox|email)/i,\n\t/(?:邮箱|邮件|收件箱|inbox).{0,12}(?:拉取|读取|整理|分析|监控|检查|查看)/i,\n];\n\n/** Patterns that strongly indicate a notification (send/push) intent for email platforms. */\nconst EMAIL_NOTIFICATION_STRONG_PATTERNS: RegExp[] = [\n\t/(?:通过|用|使用).{0,10}(?:gmail|outlook|邮箱|邮件|email).{0,10}(?:发送|发到|通知|推送|发给|send|notify|push)/i,\n\t/(?:发送|发到|通知|推送|发给).{0,10}(?:gmail|outlook|邮箱|邮件|email)/i,\n\t/(?:邮件|email).{0,6}(?:发送|发到|通知|推送|发给|send|notify|push)/i,\n];\n\nfunction hasAnyPattern(text: string, patterns: RegExp[]) {\n\treturn patterns.some((pattern) => pattern.test(text));\n}\n\nfunction isNotificationIntent(text: string, platform: IntegrationId) {\n\tif (EMAIL_PLATFORMS.has(platform)) {\n\t\t// For email platforms, check both brand name and generic email terms\n\t\tconst platformPattern = new RegExp(platform.replace(\"_\", \"[_\\\\s-]?\"), \"i\");\n\t\tconst hasPlatformMention = platformPattern.test(text) || /(?:邮箱|邮件|email)/i.test(text);\n\t\tif (!hasPlatformMention) return false;\n\n\t\treturn EMAIL_NOTIFICATION_STRONG_PATTERNS.some((p) => p.test(text));\n\t}\n\n\tconst platformPattern = new RegExp(platform.replace(\"_\", \"[_\\\\s-]?\"), \"i\");\n\tif (!platformPattern.test(text)) return false;\n\n\treturn NOTIFICATION_INTENT_PATTERN.test(text);\n}\n\nfunction escapeRegex(s: string) {\n\treturn s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction isSourceIntent(text: string, rule: PlatformRule) {\n\tif (!hasAnyPattern(text, rule.patterns)) return false;\n\n\tif (EMAIL_PLATFORMS.has(rule.platform)) {\n\t\t// If there is explicit source intent (read/pull patterns), always include\n\t\tif (EMAIL_SOURCE_STRONG_PATTERNS.some((p) => p.test(text))) {\n\t\t\treturn true;\n\t\t}\n\t\t// If notification intent is detected but no explicit source intent,\n\t\t// this platform is used purely for notification → don't classify as source\n\t\tif (EMAIL_NOTIFICATION_STRONG_PATTERNS.some((p) => p.test(text))) {\n\t\t\treturn false;\n\t\t}\n\t\t// Mentioning email/gmail without clear send or read intent → default to source\n\t\t// (\"分析邮件\", \"检查邮箱\" etc. are already matched by rule.patterns)\n\t\treturn true;\n\t}\n\n\tconst escapedLabels = new Set([rule.label, ...rule.label.split(\"/\"), rule.platform]);\n\tconst labelAlt = [...Array.from(escapedLabels).map(escapeRegex), ...(rule.labelPatterns ?? [])].join(\"|\");\n\n\treturn new RegExp(\n\t\t`(?:从|读取|拉取|整理|分析|监控|检查|查看)\\\\s*(?:我的)?\\\\s*(?:${labelAlt})|(?:${labelAlt}).{0,16}(?:读取|拉取|整理|分析|监控|检查|查看|消息|频道|channel|messages)`,\n\t\t\"i\",\n\t).test(text);\n}\n\nexport function inferTaskIntegrationRequirementsFromText(text: string): InferredTaskIntegrationRequirements {\n\tconst trimmed = text.trim();\n\tif (!trimmed) {\n\t\treturn { sources: [], notificationChannels: [] };\n\t}\n\n\tconst sourcePlatforms = SOURCE_PLATFORM_RULES.filter((rule) => isSourceIntent(trimmed, rule));\n\tconst notificationPlatforms = SOURCE_PLATFORM_RULES.filter((rule) =>\n\t\tisNotificationIntent(trimmed, rule.platform),\n\t);\n\n\treturn {\n\t\tsources: sourcePlatforms.map((rule) => ({\n\t\t\ttype: \"channel\",\n\t\t\tname: `${rule.platform}:__required__::${rule.label}`,\n\t\t})),\n\t\tnotificationChannels: notificationPlatforms.map((rule) => `${rule.platform}:__required__`),\n\t};\n}\n","/**\n * Serialize a value for embedding inside an inline `<script>` tag.\n *\n * `JSON.stringify` alone does not escape `</`, so an attacker-controlled\n * string containing `</script>` can break out of the surrounding script\n * block. Use this helper instead of raw `JSON.stringify` whenever the\n * output is interpolated into a `<script>...</script>` body in OAuth\n * callback HTML responses.\n */\nexport function jsonForScript(value: unknown) {\n\tconst serialized = JSON.stringify(value);\n\tif (serialized === undefined) return serialized;\n\treturn serialized.replace(/</g, \"\\\\u003c\");\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Serialize a value for embedding inside an inline `<script>` tag.
3
+ *
4
+ * `JSON.stringify` alone does not escape `</`, so an attacker-controlled
5
+ * string containing `</script>` can break out of the surrounding script
6
+ * block. Use this helper instead of raw `JSON.stringify` whenever the
7
+ * output is interpolated into a `<script>...</script>` body in OAuth
8
+ * callback HTML responses.
9
+ */
10
+ declare function jsonForScript(value: unknown): string;
11
+
12
+ export { jsonForScript };
@@ -0,0 +1,10 @@
1
+ // src/oauth-callback-script.ts
2
+ function jsonForScript(value) {
3
+ const serialized = JSON.stringify(value);
4
+ if (serialized === void 0) return serialized;
5
+ return serialized.replace(/</g, "\\u003c");
6
+ }
7
+
8
+ export { jsonForScript };
9
+ //# sourceMappingURL=oauth-callback-script.js.map
10
+ //# sourceMappingURL=oauth-callback-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/oauth-callback-script.ts"],"names":[],"mappings":";AASO,SAAS,cAAc,KAAA,EAAgB;AAC7C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACvC,EAAA,IAAI,UAAA,KAAe,QAAW,OAAO,UAAA;AACrC,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,IAAA,EAAM,SAAS,CAAA;AAC1C","file":"oauth-callback-script.js","sourcesContent":["/**\n * Serialize a value for embedding inside an inline `<script>` tag.\n *\n * `JSON.stringify` alone does not escape `</`, so an attacker-controlled\n * string containing `</script>` can break out of the surrounding script\n * block. Use this helper instead of raw `JSON.stringify` whenever the\n * output is interpolated into a `<script>...</script>` body in OAuth\n * callback HTML responses.\n */\nexport function jsonForScript(value: unknown) {\n\tconst serialized = JSON.stringify(value);\n\tif (serialized === undefined) return serialized;\n\treturn serialized.replace(/</g, \"\\\\u003c\");\n}\n"]}