@tangle-network/agent-integrations 0.49.0 → 0.50.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.
@@ -0,0 +1,432 @@
1
+ import "../chunk-PZ5AY32C.js";
2
+
3
+ // src/conversation-events/index.ts
4
+ var MICROSOFT_TEAMS_PROVIDER_ID = "microsoft-teams";
5
+ var MICROSOFT_TEAMS_MESSAGE_EVENT = "teams.message";
6
+ var MICROSOFT_TEAMS_TRIGGER_EVENT_CATALOG = {
7
+ namespace: "teams.",
8
+ closed: true,
9
+ events: [{ id: MICROSOFT_TEAMS_MESSAGE_EVENT }]
10
+ };
11
+ var MAX_BODY_LENGTH = 1e6;
12
+ var MAX_ATTACHMENTS = 50;
13
+ var MAX_INLINE_ATTACHMENT_LENGTH = 11e5;
14
+ var MAX_ATTACHMENT_SIZE = 20 * 1024 * 1024;
15
+ var MAX_HEADERS = 200;
16
+ function normalizeConversationEvent(value) {
17
+ if (!isRecord(value) || typeof value.provider !== "string" || typeof value.type !== "string" || value.deliveryId !== void 0 && typeof value.deliveryId !== "string" || !Object.prototype.hasOwnProperty.call(value, "payload")) {
18
+ return invalidPayload(
19
+ "Provider conversation event requires provider, type, and payload"
20
+ );
21
+ }
22
+ const input = {
23
+ provider: value.provider,
24
+ type: value.type,
25
+ ...typeof value.deliveryId === "string" ? { deliveryId: value.deliveryId } : {},
26
+ payload: value.payload
27
+ };
28
+ if (input.provider === "email") {
29
+ if (input.type !== "email.received") {
30
+ return unsupportedEvent(input.provider, input.type);
31
+ }
32
+ return normalizeEmail(input);
33
+ }
34
+ if (input.provider === "slack") {
35
+ if (input.type !== "slack.message" && input.type !== "slack.app_mention") {
36
+ return unsupportedEvent(input.provider, input.type);
37
+ }
38
+ return normalizeSlack(input);
39
+ }
40
+ if (input.provider === MICROSOFT_TEAMS_PROVIDER_ID) {
41
+ if (input.type !== MICROSOFT_TEAMS_MESSAGE_EVENT) {
42
+ return unsupportedEvent(input.provider, input.type);
43
+ }
44
+ return normalizeMicrosoftTeams(input);
45
+ }
46
+ return {
47
+ ok: false,
48
+ code: "unsupported_provider",
49
+ message: `Conversation events do not support provider ${input.provider}`
50
+ };
51
+ }
52
+ function normalizeMicrosoftTeams(input) {
53
+ const activity = input.payload;
54
+ if (!isRecord(activity) || activity.type !== "message") {
55
+ return invalidPayload("Teams payload requires a message activity");
56
+ }
57
+ if (activity.channelId !== void 0 && activity.channelId !== "msteams") {
58
+ return invalidPayload("Teams activity came from an unsupported channel");
59
+ }
60
+ const text = optionalString(activity.text, MAX_BODY_LENGTH);
61
+ if (text === void 0) {
62
+ return invalidPayload("Teams message text is invalid");
63
+ }
64
+ const conversation = isRecord(activity.conversation) ? activity.conversation : null;
65
+ const conversationId = normalizeNullableString(conversation?.id, 2e3);
66
+ if (!conversationId) {
67
+ return invalidPayload("Teams message requires a conversation id");
68
+ }
69
+ const channelData = isRecord(activity.channelData) ? activity.channelData : null;
70
+ const tenant = resolveMicrosoftTeamsTenantId(activity);
71
+ if (!tenant.ok) return invalidPayload(tenant.message);
72
+ const tenantId = tenant.tenantId;
73
+ const from = isRecord(activity.from) ? activity.from : null;
74
+ const channel = isRecord(channelData?.channel) ? channelData.channel : null;
75
+ const team = isRecord(channelData?.team) ? channelData.team : null;
76
+ const channelId = normalizeNullableString(channel?.id, 2e3);
77
+ const channelName = normalizeNullableString(channel?.name, 300);
78
+ const teamId = normalizeNullableString(team?.id, 2e3);
79
+ const replyToId = normalizeNullableString(activity.replyToId, 2e3);
80
+ const eventId = normalizeNullableString(activity.id, 2e3) ?? normalizeNullableString(input.deliveryId, 2e3);
81
+ const attachments = normalizeTeamsAttachments(activity.attachments);
82
+ if (!attachments.ok) return attachments;
83
+ const timestamp = normalizeTeamsTimestamp(
84
+ activity.timestamp ?? activity.localTimestamp
85
+ );
86
+ if (timestamp === void 0) {
87
+ return invalidPayload("Teams message timestamp is invalid");
88
+ }
89
+ return {
90
+ ok: true,
91
+ event: {
92
+ version: 1,
93
+ provider: "teams",
94
+ eventType: input.type,
95
+ operation: "created",
96
+ eventId,
97
+ conversationId: `${tenantId}:${conversationId}`,
98
+ parentEventIds: replyToId ? [replyToId] : [],
99
+ sender: {
100
+ id: normalizeNullableString(from?.aadObjectId, 300) ?? normalizeNullableString(from?.id, 2e3),
101
+ address: null,
102
+ displayName: normalizeNullableString(from?.name, 300)
103
+ },
104
+ destinations: [
105
+ {
106
+ kind: channelId ? "channel" : "chat",
107
+ id: channelId ?? conversationId,
108
+ address: null,
109
+ displayName: channelName
110
+ },
111
+ ...teamId ? [
112
+ {
113
+ kind: "channel",
114
+ id: teamId,
115
+ address: null,
116
+ displayName: normalizeNullableString(team?.name, 300)
117
+ }
118
+ ] : []
119
+ ],
120
+ subject: null,
121
+ text: text ?? null,
122
+ html: null,
123
+ attachments: attachments.value,
124
+ occurredAt: timestamp ?? null
125
+ }
126
+ };
127
+ }
128
+ function resolveMicrosoftTeamsTenantId(payload) {
129
+ if (!isRecord(payload)) {
130
+ return { ok: false, message: "Teams payload requires an activity object" };
131
+ }
132
+ const conversation = isRecord(payload.conversation) ? payload.conversation : null;
133
+ const channelData = isRecord(payload.channelData) ? payload.channelData : null;
134
+ const channelDataTenant = isRecord(channelData?.tenant) ? normalizeNullableString(channelData.tenant.id, 300) : null;
135
+ const conversationTenant = normalizeNullableString(
136
+ conversation?.tenantId,
137
+ 300
138
+ );
139
+ if (channelDataTenant && conversationTenant && channelDataTenant !== conversationTenant) {
140
+ return {
141
+ ok: false,
142
+ message: "Teams activity contains conflicting tenant ids"
143
+ };
144
+ }
145
+ const tenantId = channelDataTenant ?? conversationTenant;
146
+ return tenantId ? { ok: true, tenantId } : { ok: false, message: "Teams message requires a tenant id" };
147
+ }
148
+ function normalizeEmail(input) {
149
+ const payload = input.payload;
150
+ if (!isRecord(payload)) return invalidPayload("Email payload must be an object");
151
+ const from = optionalString(payload.from, 320);
152
+ const to = optionalString(payload.to, 320);
153
+ if (from === void 0 || from === null || to === void 0 || to === null || !from.trim() || !to.trim()) {
154
+ return invalidPayload("Email payload requires non-empty string from and to");
155
+ }
156
+ const messageId = optionalString(payload.messageId, 1e3);
157
+ const subject = optionalString(payload.subject, 2e3);
158
+ const text = optionalString(payload.text, MAX_BODY_LENGTH);
159
+ const html = optionalString(payload.html, MAX_BODY_LENGTH);
160
+ if (messageId === void 0 || subject === void 0 || text === void 0 || html === void 0) {
161
+ return invalidPayload("Email payload contains an invalid string field");
162
+ }
163
+ const receivedAt = optionalFiniteNumber(payload.receivedAt, 0);
164
+ if (receivedAt === void 0) {
165
+ return invalidPayload("Email receivedAt must be a non-negative number");
166
+ }
167
+ const headers = normalizeHeaders(payload.headers);
168
+ if (!headers.ok) return headers;
169
+ const attachments = normalizeEmailAttachments(payload.attachments);
170
+ if (!attachments.ok) return attachments;
171
+ return {
172
+ ok: true,
173
+ event: {
174
+ version: 1,
175
+ provider: "email",
176
+ eventType: input.type,
177
+ operation: "created",
178
+ eventId: normalizeMessageId(messageId) ?? normalizeNullableString(input.deliveryId, 1e3),
179
+ conversationId: null,
180
+ parentEventIds: referencedMessageIds(headers.value),
181
+ sender: {
182
+ id: null,
183
+ address: normalizeNullableString(from, 320),
184
+ displayName: null
185
+ },
186
+ destinations: [
187
+ {
188
+ kind: "mailbox",
189
+ id: null,
190
+ address: normalizeMailbox(to),
191
+ displayName: null
192
+ }
193
+ ],
194
+ subject: normalizeNullableString(subject, 2e3),
195
+ text: text ?? null,
196
+ html: html ?? null,
197
+ attachments: attachments.value,
198
+ occurredAt: receivedAt ?? null
199
+ }
200
+ };
201
+ }
202
+ function normalizeSlack(input) {
203
+ const wrapper = input.payload;
204
+ if (!isRecord(wrapper) || !isRecord(wrapper.event)) {
205
+ return invalidPayload("Slack payload requires an Events API event object");
206
+ }
207
+ const outerEvent = wrapper.event;
208
+ const changedMessage = outerEvent.subtype === "message_changed" && isRecord(outerEvent.message) ? outerEvent.message : null;
209
+ const deletedMessage = outerEvent.subtype === "message_deleted" && isRecord(outerEvent.previous_message) ? outerEvent.previous_message : null;
210
+ const message = changedMessage ?? deletedMessage ?? outerEvent;
211
+ if (message.type !== "message" && input.type !== "slack.app_mention") {
212
+ return invalidPayload("Slack event does not contain a message");
213
+ }
214
+ const text = optionalString(message.text, MAX_BODY_LENGTH);
215
+ if (text === void 0) {
216
+ return invalidPayload("Slack message text is invalid");
217
+ }
218
+ const channel = normalizeNullableString(outerEvent.channel, 300) ?? normalizeNullableString(message.channel, 300);
219
+ if (!channel) return invalidPayload("Slack message requires a channel");
220
+ const timestamp = normalizeNullableString(message.ts, 100) ?? normalizeNullableString(outerEvent.event_ts, 100);
221
+ const threadTimestamp = normalizeNullableString(message.thread_ts, 100);
222
+ const team = normalizeNullableString(wrapper.team_id, 300) ?? normalizeNullableString(wrapper.context_team_id, 300);
223
+ const rootTimestamp = threadTimestamp ?? timestamp;
224
+ const files = normalizeSlackFiles(message.files);
225
+ if (!files.ok) return files;
226
+ const subtype = normalizeNullableString(outerEvent.subtype, 100);
227
+ return {
228
+ ok: true,
229
+ event: {
230
+ version: 1,
231
+ provider: "slack",
232
+ eventType: input.type,
233
+ operation: subtype === "message_deleted" ? "deleted" : subtype === "message_changed" ? "updated" : "created",
234
+ eventId: normalizeNullableString(wrapper.event_id, 300) ?? normalizeNullableString(message.client_msg_id, 300) ?? normalizeNullableString(input.deliveryId, 300) ?? timestamp,
235
+ conversationId: rootTimestamp ? [team, channel, rootTimestamp].filter(Boolean).join(":") : null,
236
+ parentEventIds: threadTimestamp && timestamp && threadTimestamp !== timestamp ? [threadTimestamp] : [],
237
+ sender: {
238
+ id: normalizeNullableString(message.user, 300) ?? normalizeNullableString(message.bot_id, 300),
239
+ address: null,
240
+ displayName: normalizeNullableString(message.username, 300) ?? (isRecord(message.user_profile) ? normalizeNullableString(
241
+ message.user_profile.display_name,
242
+ 300
243
+ ) : null)
244
+ },
245
+ destinations: [
246
+ {
247
+ kind: "channel",
248
+ id: channel,
249
+ address: null,
250
+ displayName: null
251
+ }
252
+ ],
253
+ subject: null,
254
+ text: text ?? null,
255
+ html: null,
256
+ attachments: files.value,
257
+ occurredAt: slackTimestampMs(timestamp) ?? epochSecondsMs(wrapper.event_time) ?? null
258
+ }
259
+ };
260
+ }
261
+ function normalizeHeaders(value) {
262
+ if (value === void 0) return { ok: true, value: {} };
263
+ if (!isRecord(value) || Object.keys(value).length > MAX_HEADERS) {
264
+ return invalidPayload("Email headers must be a bounded string record");
265
+ }
266
+ const headers = {};
267
+ for (const [key, entry] of Object.entries(value)) {
268
+ if (key.length === 0 || key.length > 200 || typeof entry !== "string" || entry.length > 4e3) {
269
+ return invalidPayload("Email headers must be a bounded string record");
270
+ }
271
+ headers[key.toLowerCase()] = entry;
272
+ }
273
+ return { ok: true, value: headers };
274
+ }
275
+ function normalizeEmailAttachments(value) {
276
+ if (value === void 0) return { ok: true, value: [] };
277
+ if (!Array.isArray(value) || value.length > MAX_ATTACHMENTS) {
278
+ return invalidPayload("Email attachments exceed the supported limit");
279
+ }
280
+ const attachments = [];
281
+ for (const entry of value) {
282
+ if (!isRecord(entry)) {
283
+ return invalidPayload("Email attachment must be an object");
284
+ }
285
+ const name = optionalString(entry.filename, 240);
286
+ const contentType = optionalString(entry.contentType, 200);
287
+ const contentBase64 = optionalString(
288
+ entry.contentBase64,
289
+ MAX_INLINE_ATTACHMENT_LENGTH
290
+ );
291
+ const url = optionalString(entry.url, 2048);
292
+ const size = optionalFiniteNumber(entry.size, 0, MAX_ATTACHMENT_SIZE, true);
293
+ if (name === void 0 || contentType === void 0 || contentBase64 === void 0 || url === void 0 || size === void 0) {
294
+ return invalidPayload("Email attachment contains an invalid field");
295
+ }
296
+ attachments.push({
297
+ id: null,
298
+ name: name ?? null,
299
+ contentType: contentType ?? null,
300
+ size: size ?? null,
301
+ contentBase64: contentBase64 ?? null,
302
+ url: url ?? null
303
+ });
304
+ }
305
+ return { ok: true, value: attachments };
306
+ }
307
+ function normalizeSlackFiles(value) {
308
+ if (value === void 0) return { ok: true, value: [] };
309
+ if (!Array.isArray(value) || value.length > MAX_ATTACHMENTS) {
310
+ return invalidPayload("Slack files exceed the supported limit");
311
+ }
312
+ const files = [];
313
+ for (const entry of value) {
314
+ if (!isRecord(entry)) return invalidPayload("Slack file must be an object");
315
+ const size = optionalFiniteNumber(entry.size, 0, MAX_ATTACHMENT_SIZE, true);
316
+ if (size === void 0) return invalidPayload("Slack file size is invalid");
317
+ files.push({
318
+ id: normalizeNullableString(entry.id, 300),
319
+ name: normalizeNullableString(entry.name, 240) ?? normalizeNullableString(entry.title, 240),
320
+ contentType: normalizeNullableString(entry.mimetype, 200),
321
+ size: size ?? null,
322
+ contentBase64: null,
323
+ // Slack file URLs require the workspace bot token. Products use the
324
+ // `slack.download_file` Hub action with this file id; exposing a private
325
+ // URL here would make downstream runtimes attempt an unauthenticated fetch.
326
+ url: null
327
+ });
328
+ }
329
+ return { ok: true, value: files };
330
+ }
331
+ function normalizeTeamsAttachments(value) {
332
+ if (value === void 0) return { ok: true, value: [] };
333
+ if (!Array.isArray(value) || value.length > MAX_ATTACHMENTS) {
334
+ return invalidPayload("Teams attachments exceed the supported limit");
335
+ }
336
+ const attachments = [];
337
+ for (const entry of value) {
338
+ if (!isRecord(entry)) {
339
+ return invalidPayload("Teams attachment must be an object");
340
+ }
341
+ const id = optionalString(entry.id, 300);
342
+ const name = optionalString(entry.name, 240);
343
+ const contentType = optionalString(entry.contentType, 200);
344
+ if (id === void 0 || name === void 0 || contentType === void 0) {
345
+ return invalidPayload("Teams attachment contains an invalid field");
346
+ }
347
+ attachments.push({
348
+ id: normalizeNullableString(id, 300),
349
+ name: normalizeNullableString(name, 240),
350
+ contentType: normalizeNullableString(contentType, 200),
351
+ size: null,
352
+ contentBase64: null,
353
+ // Bot attachment URLs require Microsoft authorization. The receiver
354
+ // keeps that credential inside Hub; products only receive stable metadata.
355
+ url: null
356
+ });
357
+ }
358
+ return { ok: true, value: attachments };
359
+ }
360
+ function normalizeTeamsTimestamp(value) {
361
+ if (value === void 0 || value === null) return null;
362
+ if (typeof value !== "string" || value.length > 100) return void 0;
363
+ const timestamp = Date.parse(value);
364
+ return Number.isFinite(timestamp) && timestamp >= 0 ? timestamp : void 0;
365
+ }
366
+ function referencedMessageIds(headers) {
367
+ const values = [headers["in-reply-to"], headers.references].filter(
368
+ (value) => Boolean(value?.trim())
369
+ );
370
+ const ids = [];
371
+ for (const value of values) {
372
+ const bracketed = value.match(/<[^<>]{1,1000}>/g);
373
+ const candidates = bracketed ?? value.split(/\s+/);
374
+ for (const candidate of candidates) {
375
+ const normalized = normalizeMessageId(candidate);
376
+ if (normalized && !ids.includes(normalized)) ids.push(normalized);
377
+ }
378
+ }
379
+ return ids.slice(0, 50);
380
+ }
381
+ function normalizeMessageId(value) {
382
+ if (!value) return null;
383
+ const trimmed = value.trim();
384
+ if (!trimmed) return null;
385
+ return trimmed.startsWith("<") && trimmed.endsWith(">") ? trimmed.slice(1, -1).trim() || null : trimmed;
386
+ }
387
+ function normalizeMailbox(value) {
388
+ return value.trim().toLowerCase();
389
+ }
390
+ function normalizeNullableString(value, maxLength) {
391
+ return typeof value === "string" && value.length <= maxLength ? value.trim() || null : null;
392
+ }
393
+ function optionalString(value, maxLength) {
394
+ if (value === void 0) return null;
395
+ return typeof value === "string" && value.length <= maxLength ? value : void 0;
396
+ }
397
+ function optionalFiniteNumber(value, minimum, maximum = Number.MAX_SAFE_INTEGER, integer = false) {
398
+ if (value === void 0) return null;
399
+ if (typeof value !== "number" || !Number.isFinite(value) || value < minimum || value > maximum || integer && !Number.isInteger(value)) {
400
+ return void 0;
401
+ }
402
+ return value;
403
+ }
404
+ function slackTimestampMs(value) {
405
+ if (!value || !/^\d{1,12}(?:\.\d{1,9})?$/.test(value)) return null;
406
+ const seconds = Number(value);
407
+ return Number.isFinite(seconds) ? Math.round(seconds * 1e3) : null;
408
+ }
409
+ function epochSecondsMs(value) {
410
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.round(value * 1e3) : null;
411
+ }
412
+ function unsupportedEvent(provider, type) {
413
+ return {
414
+ ok: false,
415
+ code: "unsupported_event",
416
+ message: `Conversation events do not support ${provider} event ${type}`
417
+ };
418
+ }
419
+ function invalidPayload(message) {
420
+ return { ok: false, code: "invalid_payload", message };
421
+ }
422
+ function isRecord(value) {
423
+ return typeof value === "object" && value !== null && !Array.isArray(value);
424
+ }
425
+ export {
426
+ MICROSOFT_TEAMS_MESSAGE_EVENT,
427
+ MICROSOFT_TEAMS_PROVIDER_ID,
428
+ MICROSOFT_TEAMS_TRIGGER_EVENT_CATALOG,
429
+ normalizeConversationEvent,
430
+ resolveMicrosoftTeamsTenantId
431
+ };
432
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/conversation-events/index.ts"],"sourcesContent":["import type { TriggerEventCatalog } from '../webhooks/router.js'\n\nexport const MICROSOFT_TEAMS_PROVIDER_ID = 'microsoft-teams' as const\nexport const MICROSOFT_TEAMS_MESSAGE_EVENT = 'teams.message' as const\n\nexport const MICROSOFT_TEAMS_TRIGGER_EVENT_CATALOG = {\n namespace: 'teams.',\n closed: true,\n events: [{ id: MICROSOFT_TEAMS_MESSAGE_EVENT }],\n} as const satisfies TriggerEventCatalog\n\nexport interface InboundEmailAttachment {\n filename?: string\n contentType?: string\n contentBase64?: string\n url?: string\n size?: number\n}\n\n/** Payload emitted by Tangle's verified inbound-email receiver. */\nexport interface InboundEmailPayload {\n messageId?: string\n from: string\n to: string\n subject?: string\n text?: string\n html?: string\n headers?: Record<string, string>\n attachments?: InboundEmailAttachment[]\n receivedAt?: number\n}\n\nexport interface ProviderConversationEvent {\n provider: string\n type: string\n deliveryId?: string\n payload: unknown\n}\n\nexport interface ConversationParticipant {\n id: string | null\n address: string | null\n displayName: string | null\n}\n\nexport interface ConversationDestination {\n kind: 'mailbox' | 'channel' | 'chat' | 'user'\n id: string | null\n address: string | null\n displayName: string | null\n}\n\nexport interface ConversationAttachment {\n id: string | null\n name: string | null\n contentType: string | null\n size: number | null\n contentBase64: string | null\n url: string | null\n}\n\n/**\n * Provider-neutral message data for product ingestion.\n *\n * The signed Hub delivery remains the audit record. This projection contains\n * only the stable fields products need for threading, prompts, and files.\n */\nexport interface ConversationEvent {\n version: 1\n provider: 'email' | 'slack' | 'teams'\n eventType: string\n operation: 'created' | 'updated' | 'deleted'\n eventId: string | null\n conversationId: string | null\n parentEventIds: string[]\n sender: ConversationParticipant\n destinations: ConversationDestination[]\n subject: string | null\n text: string | null\n html: string | null\n attachments: ConversationAttachment[]\n occurredAt: number | null\n}\n\nexport type ConversationEventNormalizationErrorCode =\n | 'unsupported_provider'\n | 'unsupported_event'\n | 'invalid_payload'\n\nexport type ConversationEventNormalizationResult =\n | { ok: true; event: ConversationEvent }\n | {\n ok: false\n code: ConversationEventNormalizationErrorCode\n message: string\n }\n\nconst MAX_BODY_LENGTH = 1_000_000\nconst MAX_ATTACHMENTS = 50\nconst MAX_INLINE_ATTACHMENT_LENGTH = 1_100_000\nconst MAX_ATTACHMENT_SIZE = 20 * 1024 * 1024\nconst MAX_HEADERS = 200\n\nexport function normalizeConversationEvent(\n value: unknown,\n): ConversationEventNormalizationResult {\n if (\n !isRecord(value) ||\n typeof value.provider !== 'string' ||\n typeof value.type !== 'string' ||\n (value.deliveryId !== undefined &&\n typeof value.deliveryId !== 'string') ||\n !Object.prototype.hasOwnProperty.call(value, 'payload')\n ) {\n return invalidPayload(\n 'Provider conversation event requires provider, type, and payload',\n )\n }\n const input: ProviderConversationEvent = {\n provider: value.provider,\n type: value.type,\n ...(typeof value.deliveryId === 'string'\n ? { deliveryId: value.deliveryId }\n : {}),\n payload: value.payload,\n }\n if (input.provider === 'email') {\n if (input.type !== 'email.received') {\n return unsupportedEvent(input.provider, input.type)\n }\n return normalizeEmail(input)\n }\n if (input.provider === 'slack') {\n if (input.type !== 'slack.message' && input.type !== 'slack.app_mention') {\n return unsupportedEvent(input.provider, input.type)\n }\n return normalizeSlack(input)\n }\n if (input.provider === MICROSOFT_TEAMS_PROVIDER_ID) {\n if (input.type !== MICROSOFT_TEAMS_MESSAGE_EVENT) {\n return unsupportedEvent(input.provider, input.type)\n }\n return normalizeMicrosoftTeams(input)\n }\n return {\n ok: false,\n code: 'unsupported_provider',\n message: `Conversation events do not support provider ${input.provider}`,\n }\n}\n\nfunction normalizeMicrosoftTeams(\n input: ProviderConversationEvent,\n): ConversationEventNormalizationResult {\n const activity = input.payload\n if (!isRecord(activity) || activity.type !== 'message') {\n return invalidPayload('Teams payload requires a message activity')\n }\n if (\n activity.channelId !== undefined &&\n activity.channelId !== 'msteams'\n ) {\n return invalidPayload('Teams activity came from an unsupported channel')\n }\n const text = optionalString(activity.text, MAX_BODY_LENGTH)\n if (text === undefined) {\n return invalidPayload('Teams message text is invalid')\n }\n const conversation = isRecord(activity.conversation)\n ? activity.conversation\n : null\n const conversationId = normalizeNullableString(conversation?.id, 2_000)\n if (!conversationId) {\n return invalidPayload('Teams message requires a conversation id')\n }\n const channelData = isRecord(activity.channelData)\n ? activity.channelData\n : null\n const tenant = resolveMicrosoftTeamsTenantId(activity)\n if (!tenant.ok) return invalidPayload(tenant.message)\n const tenantId = tenant.tenantId\n const from = isRecord(activity.from) ? activity.from : null\n const channel = isRecord(channelData?.channel)\n ? channelData.channel\n : null\n const team = isRecord(channelData?.team) ? channelData.team : null\n const channelId = normalizeNullableString(channel?.id, 2_000)\n const channelName = normalizeNullableString(channel?.name, 300)\n const teamId = normalizeNullableString(team?.id, 2_000)\n const replyToId = normalizeNullableString(activity.replyToId, 2_000)\n const eventId =\n normalizeNullableString(activity.id, 2_000) ??\n normalizeNullableString(input.deliveryId, 2_000)\n const attachments = normalizeTeamsAttachments(activity.attachments)\n if (!attachments.ok) return attachments\n const timestamp = normalizeTeamsTimestamp(\n activity.timestamp ?? activity.localTimestamp,\n )\n if (timestamp === undefined) {\n return invalidPayload('Teams message timestamp is invalid')\n }\n\n return {\n ok: true,\n event: {\n version: 1,\n provider: 'teams',\n eventType: input.type,\n operation: 'created',\n eventId,\n conversationId: `${tenantId}:${conversationId}`,\n parentEventIds: replyToId ? [replyToId] : [],\n sender: {\n id:\n normalizeNullableString(from?.aadObjectId, 300) ??\n normalizeNullableString(from?.id, 2_000),\n address: null,\n displayName: normalizeNullableString(from?.name, 300),\n },\n destinations: [\n {\n kind: channelId ? 'channel' : 'chat',\n id: channelId ?? conversationId,\n address: null,\n displayName: channelName,\n },\n ...(teamId\n ? [\n {\n kind: 'channel' as const,\n id: teamId,\n address: null,\n displayName: normalizeNullableString(team?.name, 300),\n },\n ]\n : []),\n ],\n subject: null,\n text: text ?? null,\n html: null,\n attachments: attachments.value,\n occurredAt: timestamp ?? null,\n },\n }\n}\n\nexport type MicrosoftTeamsTenantResolution =\n | { ok: true; tenantId: string }\n | { ok: false; message: string }\n\n/**\n * Resolve the authenticated Teams tenant identity shared by the platform\n * receiver and product normalizer. Teams may repeat it in both\n * `channelData.tenant.id` and `conversation.tenantId`; disagreement is\n * rejected so an event can never be attributed to a guessed tenant.\n */\nexport function resolveMicrosoftTeamsTenantId(\n payload: unknown,\n): MicrosoftTeamsTenantResolution {\n if (!isRecord(payload)) {\n return { ok: false, message: 'Teams payload requires an activity object' }\n }\n const conversation = isRecord(payload.conversation)\n ? payload.conversation\n : null\n const channelData = isRecord(payload.channelData)\n ? payload.channelData\n : null\n const channelDataTenant = isRecord(channelData?.tenant)\n ? normalizeNullableString(channelData.tenant.id, 300)\n : null\n const conversationTenant = normalizeNullableString(\n conversation?.tenantId,\n 300,\n )\n if (\n channelDataTenant &&\n conversationTenant &&\n channelDataTenant !== conversationTenant\n ) {\n return {\n ok: false,\n message: 'Teams activity contains conflicting tenant ids',\n }\n }\n const tenantId = channelDataTenant ?? conversationTenant\n return tenantId\n ? { ok: true, tenantId }\n : { ok: false, message: 'Teams message requires a tenant id' }\n}\n\nfunction normalizeEmail(\n input: ProviderConversationEvent,\n): ConversationEventNormalizationResult {\n const payload = input.payload\n if (!isRecord(payload)) return invalidPayload('Email payload must be an object')\n const from = optionalString(payload.from, 320)\n const to = optionalString(payload.to, 320)\n if (\n from === undefined ||\n from === null ||\n to === undefined ||\n to === null ||\n !from.trim() ||\n !to.trim()\n ) {\n return invalidPayload('Email payload requires non-empty string from and to')\n }\n const messageId = optionalString(payload.messageId, 1_000)\n const subject = optionalString(payload.subject, 2_000)\n const text = optionalString(payload.text, MAX_BODY_LENGTH)\n const html = optionalString(payload.html, MAX_BODY_LENGTH)\n if (\n messageId === undefined ||\n subject === undefined ||\n text === undefined ||\n html === undefined\n ) {\n return invalidPayload('Email payload contains an invalid string field')\n }\n const receivedAt = optionalFiniteNumber(payload.receivedAt, 0)\n if (receivedAt === undefined) {\n return invalidPayload('Email receivedAt must be a non-negative number')\n }\n const headers = normalizeHeaders(payload.headers)\n if (!headers.ok) return headers\n const attachments = normalizeEmailAttachments(payload.attachments)\n if (!attachments.ok) return attachments\n\n return {\n ok: true,\n event: {\n version: 1,\n provider: 'email',\n eventType: input.type,\n operation: 'created',\n eventId:\n normalizeMessageId(messageId) ??\n normalizeNullableString(input.deliveryId, 1_000),\n conversationId: null,\n parentEventIds: referencedMessageIds(headers.value),\n sender: {\n id: null,\n address: normalizeNullableString(from, 320),\n displayName: null,\n },\n destinations: [\n {\n kind: 'mailbox',\n id: null,\n address: normalizeMailbox(to),\n displayName: null,\n },\n ],\n subject: normalizeNullableString(subject, 2_000),\n text: text ?? null,\n html: html ?? null,\n attachments: attachments.value,\n occurredAt: receivedAt ?? null,\n },\n }\n}\n\nfunction normalizeSlack(\n input: ProviderConversationEvent,\n): ConversationEventNormalizationResult {\n const wrapper = input.payload\n if (!isRecord(wrapper) || !isRecord(wrapper.event)) {\n return invalidPayload('Slack payload requires an Events API event object')\n }\n const outerEvent = wrapper.event\n const changedMessage =\n outerEvent.subtype === 'message_changed' && isRecord(outerEvent.message)\n ? outerEvent.message\n : null\n const deletedMessage =\n outerEvent.subtype === 'message_deleted' &&\n isRecord(outerEvent.previous_message)\n ? outerEvent.previous_message\n : null\n const message = changedMessage ?? deletedMessage ?? outerEvent\n if (\n message.type !== 'message' &&\n input.type !== 'slack.app_mention'\n ) {\n return invalidPayload('Slack event does not contain a message')\n }\n const text = optionalString(message.text, MAX_BODY_LENGTH)\n if (text === undefined) {\n return invalidPayload('Slack message text is invalid')\n }\n const channel =\n normalizeNullableString(outerEvent.channel, 300) ??\n normalizeNullableString(message.channel, 300)\n if (!channel) return invalidPayload('Slack message requires a channel')\n const timestamp =\n normalizeNullableString(message.ts, 100) ??\n normalizeNullableString(outerEvent.event_ts, 100)\n const threadTimestamp = normalizeNullableString(message.thread_ts, 100)\n const team =\n normalizeNullableString(wrapper.team_id, 300) ??\n normalizeNullableString(wrapper.context_team_id, 300)\n const rootTimestamp = threadTimestamp ?? timestamp\n const files = normalizeSlackFiles(message.files)\n if (!files.ok) return files\n const subtype = normalizeNullableString(outerEvent.subtype, 100)\n\n return {\n ok: true,\n event: {\n version: 1,\n provider: 'slack',\n eventType: input.type,\n operation:\n subtype === 'message_deleted'\n ? 'deleted'\n : subtype === 'message_changed'\n ? 'updated'\n : 'created',\n eventId:\n normalizeNullableString(wrapper.event_id, 300) ??\n normalizeNullableString(message.client_msg_id, 300) ??\n normalizeNullableString(input.deliveryId, 300) ??\n timestamp,\n conversationId: rootTimestamp\n ? [team, channel, rootTimestamp].filter(Boolean).join(':')\n : null,\n parentEventIds:\n threadTimestamp && timestamp && threadTimestamp !== timestamp\n ? [threadTimestamp]\n : [],\n sender: {\n id:\n normalizeNullableString(message.user, 300) ??\n normalizeNullableString(message.bot_id, 300),\n address: null,\n displayName:\n normalizeNullableString(message.username, 300) ??\n (isRecord(message.user_profile)\n ? normalizeNullableString(\n message.user_profile.display_name,\n 300,\n )\n : null),\n },\n destinations: [\n {\n kind: 'channel',\n id: channel,\n address: null,\n displayName: null,\n },\n ],\n subject: null,\n text: text ?? null,\n html: null,\n attachments: files.value,\n occurredAt:\n slackTimestampMs(timestamp) ??\n epochSecondsMs(wrapper.event_time) ??\n null,\n },\n }\n}\n\nfunction normalizeHeaders(\n value: unknown,\n):\n | { ok: true; value: Record<string, string> }\n | {\n ok: false\n code: 'invalid_payload'\n message: string\n } {\n if (value === undefined) return { ok: true, value: {} }\n if (!isRecord(value) || Object.keys(value).length > MAX_HEADERS) {\n return invalidPayload('Email headers must be a bounded string record')\n }\n const headers: Record<string, string> = {}\n for (const [key, entry] of Object.entries(value)) {\n if (\n key.length === 0 ||\n key.length > 200 ||\n typeof entry !== 'string' ||\n entry.length > 4_000\n ) {\n return invalidPayload('Email headers must be a bounded string record')\n }\n headers[key.toLowerCase()] = entry\n }\n return { ok: true, value: headers }\n}\n\nfunction normalizeEmailAttachments(\n value: unknown,\n):\n | { ok: true; value: ConversationAttachment[] }\n | {\n ok: false\n code: 'invalid_payload'\n message: string\n } {\n if (value === undefined) return { ok: true, value: [] }\n if (!Array.isArray(value) || value.length > MAX_ATTACHMENTS) {\n return invalidPayload('Email attachments exceed the supported limit')\n }\n const attachments: ConversationAttachment[] = []\n for (const entry of value) {\n if (!isRecord(entry)) {\n return invalidPayload('Email attachment must be an object')\n }\n const name = optionalString(entry.filename, 240)\n const contentType = optionalString(entry.contentType, 200)\n const contentBase64 = optionalString(\n entry.contentBase64,\n MAX_INLINE_ATTACHMENT_LENGTH,\n )\n const url = optionalString(entry.url, 2_048)\n const size = optionalFiniteNumber(entry.size, 0, MAX_ATTACHMENT_SIZE, true)\n if (\n name === undefined ||\n contentType === undefined ||\n contentBase64 === undefined ||\n url === undefined ||\n size === undefined\n ) {\n return invalidPayload('Email attachment contains an invalid field')\n }\n attachments.push({\n id: null,\n name: name ?? null,\n contentType: contentType ?? null,\n size: size ?? null,\n contentBase64: contentBase64 ?? null,\n url: url ?? null,\n })\n }\n return { ok: true, value: attachments }\n}\n\nfunction normalizeSlackFiles(\n value: unknown,\n):\n | { ok: true; value: ConversationAttachment[] }\n | {\n ok: false\n code: 'invalid_payload'\n message: string\n } {\n if (value === undefined) return { ok: true, value: [] }\n if (!Array.isArray(value) || value.length > MAX_ATTACHMENTS) {\n return invalidPayload('Slack files exceed the supported limit')\n }\n const files: ConversationAttachment[] = []\n for (const entry of value) {\n if (!isRecord(entry)) return invalidPayload('Slack file must be an object')\n const size = optionalFiniteNumber(entry.size, 0, MAX_ATTACHMENT_SIZE, true)\n if (size === undefined) return invalidPayload('Slack file size is invalid')\n files.push({\n id: normalizeNullableString(entry.id, 300),\n name:\n normalizeNullableString(entry.name, 240) ??\n normalizeNullableString(entry.title, 240),\n contentType: normalizeNullableString(entry.mimetype, 200),\n size: size ?? null,\n contentBase64: null,\n // Slack file URLs require the workspace bot token. Products use the\n // `slack.download_file` Hub action with this file id; exposing a private\n // URL here would make downstream runtimes attempt an unauthenticated fetch.\n url: null,\n })\n }\n return { ok: true, value: files }\n}\n\nfunction normalizeTeamsAttachments(\n value: unknown,\n):\n | { ok: true; value: ConversationAttachment[] }\n | {\n ok: false\n code: 'invalid_payload'\n message: string\n } {\n if (value === undefined) return { ok: true, value: [] }\n if (!Array.isArray(value) || value.length > MAX_ATTACHMENTS) {\n return invalidPayload('Teams attachments exceed the supported limit')\n }\n const attachments: ConversationAttachment[] = []\n for (const entry of value) {\n if (!isRecord(entry)) {\n return invalidPayload('Teams attachment must be an object')\n }\n const id = optionalString(entry.id, 300)\n const name = optionalString(entry.name, 240)\n const contentType = optionalString(entry.contentType, 200)\n if (\n id === undefined ||\n name === undefined ||\n contentType === undefined\n ) {\n return invalidPayload('Teams attachment contains an invalid field')\n }\n attachments.push({\n id: normalizeNullableString(id, 300),\n name: normalizeNullableString(name, 240),\n contentType: normalizeNullableString(contentType, 200),\n size: null,\n contentBase64: null,\n // Bot attachment URLs require Microsoft authorization. The receiver\n // keeps that credential inside Hub; products only receive stable metadata.\n url: null,\n })\n }\n return { ok: true, value: attachments }\n}\n\nfunction normalizeTeamsTimestamp(value: unknown): number | null | undefined {\n if (value === undefined || value === null) return null\n if (typeof value !== 'string' || value.length > 100) return undefined\n const timestamp = Date.parse(value)\n return Number.isFinite(timestamp) && timestamp >= 0\n ? timestamp\n : undefined\n}\n\nfunction referencedMessageIds(headers: Record<string, string>): string[] {\n const values = [headers['in-reply-to'], headers.references].filter(\n (value): value is string => Boolean(value?.trim()),\n )\n const ids: string[] = []\n for (const value of values) {\n const bracketed = value.match(/<[^<>]{1,1000}>/g)\n const candidates = bracketed ?? value.split(/\\s+/)\n for (const candidate of candidates) {\n const normalized = normalizeMessageId(candidate)\n if (normalized && !ids.includes(normalized)) ids.push(normalized)\n }\n }\n return ids.slice(0, 50)\n}\n\nfunction normalizeMessageId(value: string | null | undefined): string | null {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed) return null\n return trimmed.startsWith('<') && trimmed.endsWith('>')\n ? trimmed.slice(1, -1).trim() || null\n : trimmed\n}\n\nfunction normalizeMailbox(value: string): string {\n return value.trim().toLowerCase()\n}\n\nfunction normalizeNullableString(\n value: unknown,\n maxLength: number,\n): string | null {\n return typeof value === 'string' && value.length <= maxLength\n ? value.trim() || null\n : null\n}\n\n/**\n * Undefined means invalid; null means the optional field was absent.\n */\nfunction optionalString(\n value: unknown,\n maxLength: number,\n): string | null | undefined {\n if (value === undefined) return null\n return typeof value === 'string' && value.length <= maxLength\n ? value\n : undefined\n}\n\n/**\n * Undefined means invalid; null means the optional field was absent.\n */\nfunction optionalFiniteNumber(\n value: unknown,\n minimum: number,\n maximum = Number.MAX_SAFE_INTEGER,\n integer = false,\n): number | null | undefined {\n if (value === undefined) return null\n if (\n typeof value !== 'number' ||\n !Number.isFinite(value) ||\n value < minimum ||\n value > maximum ||\n (integer && !Number.isInteger(value))\n ) {\n return undefined\n }\n return value\n}\n\nfunction slackTimestampMs(value: string | null): number | null {\n if (!value || !/^\\d{1,12}(?:\\.\\d{1,9})?$/.test(value)) return null\n const seconds = Number(value)\n return Number.isFinite(seconds) ? Math.round(seconds * 1_000) : null\n}\n\nfunction epochSecondsMs(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n ? Math.round(value * 1_000)\n : null\n}\n\nfunction unsupportedEvent(\n provider: string,\n type: string,\n): ConversationEventNormalizationResult {\n return {\n ok: false,\n code: 'unsupported_event',\n message: `Conversation events do not support ${provider} event ${type}`,\n }\n}\n\nfunction invalidPayload(\n message: string,\n): {\n ok: false\n code: 'invalid_payload'\n message: string\n} {\n return { ok: false, code: 'invalid_payload', message }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@ export { b as IntegrationErrorCode, I as IntegrationRuntimeError, a as Integrati
12
12
  export { ConnectFlowOptions, FinishConnectInput, FinishConnectOutput, InMemoryConnectStateStore, StartConnectInput, StartConnectOutput, finishConnectFlow, revokeConnectFlow, startConnectFlow } from './connect/index.js';
13
13
  export { ExpressLikeRequest, ExpressLikeResponse, HonoLikeContext, RequireTangleAuthOptions, TangleAuthContext, TangleAuthOutcome, TangleAuthReason, expressTangleAuthMiddleware, extractToken, honoTangleAuthMiddleware, requireTangleAuth } from './middleware/index.js';
14
14
  export { DEFAULT_SIGNATURE_TOLERANCE_SECONDS, EmailVerifyOptions, ExchangeCodeInput, GenericHmacVerifyOptions, InMemoryOAuthFlowStore, OAuthFlowStore, OAuthTokens, ParsedStripeSignatureHeader, PendingOAuthFlow, RefreshInput, SlackVerifyOptions, StartOAuthInput, StartOAuthOutput, StripeVerifyOptions, TwilioVerifyOptions, _resetPendingFlowsForTests, consumePendingFlow, exchangeAuthorizationCode, firstHeader, parseStripeSignatureHeader, refreshAccessToken, startOAuthFlow, verifyEmailSignature, verifyHmacSignature, verifySlackSignature, verifyStripeSignature, verifyTwilioSignature } from './connectors/index.js';
15
- export { DocuSealOptions, EtsyOptions, GmailOptions, GoogleCalendarOptions, GoogleDocsOptions, GoogleDriveOptions, GoogleErrorClass, GoogleFormsOptions, GoogleSheetsOptions, HelloSignOptions, HubSpotOptions, MicrosoftCalendarOptions, MicrosoftGraphOptions, MicrosoftTeamsOptions, NotionOptions, OneDriveOptions, OutlookMailOptions, PandaDocOptions, RestConnectorSpec, RestCredentialPlacement, RestOperationSpec, RestRequestSpec, SharePointOptions, SlackOptions, TELEGRAM_FILE_DOWNLOAD_ROOT, TwitterOptions, WhatsappBusinessOptions, activecampaignConnector, acumbamailConnector, adobeCreativeCloudConnector, adpConnector, afforaiConnector, agentxConnector, aidbaseConnector, aipriseConnector, airOpsConnector, aircallConnector, airtableConnector, airtopConnector, alaiConnector, altTextAiConnector, alttextifyConnector, amazonBedrockConnector, amazonSecretsManagerConnector, amazonSesConnector, amazonSnsConnector, amazonSqsConnector, amazonTextractConnector, aminosConnector, ampecoConnector, amplemarketConnector, anthropicConnector, apitableConnector, apitemplateIoConnector, apolloConnector, appfollowConnector, asanaConnector, ashbyConnector, asknewsConnector, assemblyaiConnector, attioConnector, auth0Connector, autoboundConnector, autocallsConnector, avianConnector, avomaConnector, azureAdConnector, azureCommunicationServicesConnector, azureOpenaiConnector, backblazeConnector, bamboohrConnector, barcodeLookupConnector, baremetricsConnector, basecampConnector, beamerConnector, bettercontactConnector, bettermodeConnector, bexioConnector, bigcommerceConnector, biginByZohoConnector, billplzConnector, bitlyConnector, blandAiConnector, blueskyConnector, bolnaConnector, bonjoroConnector, bookedinConnector, boxConnector, braveSearchConnector, brazeConnector, brightdataConnector, brilliantDirectoriesConnector, browseAiConnector, builtwithConnector, calComConnector, calendlyConnector, campaignMonitorConnector, cannyConnector, canvaConnector, capsuleCrmConnector, captainDataConnector, cashfreePaymentsConnector, certopusConnector, chainalysisApiConnector, chargebeeConnector, chargekeepConnector, chartlyConnector, chatDataConnector, chatbaseConnector, chatlingConnector, chatnodeConnector, chatwootConnector, checkoutConnector, circleConnector, classifyGoogleError, classifyGoogleReason, clayConnector, clearoutConnector, clicdataConnector, clickupConnector, clioConnector, clockifyConnector, clockodoConnector, closeConnector, cloudconvertConnector, cloudinaryConnector, cloutlyConnector, codaConnector, cognismConnector, cognitoFormsConnector, cohereConnector, cometapiConnector, comfyicuConnector, commonRoomConnector, confluenceConnector, constantContactConnector, contactoutConnector, contentfulConnector, convertkitConnector, copperConnector, copyAiConnector, crispConnector, crustdataConnector, cryptolensConnector, customerIoConnector, customgptConnector, dashworksConnector, datadogConnector, datafuelConnector, datocmsConnector, declarativeRestConnector, deepseekConnector, demandbaseConnector, denserAiConnector, descriptConnector, devinConnector, dialpadConnector, discordConnector, dittofeedConnector, doctlyConnector, documentproConnector, documergeConnector, docuseal, docusignConnector, dropboxConnector, dubConnector, dumplingAiConnector, dustConnector, easyPeasyAiConnector, ebayConnector, edenAiConnector, elasticEmailConnector, emailitConnector, emailoctopusConnector, enrichlayerConnector, esignaturesConnector, etsyConnector, exaConnector, facebookLeadsConnector, facebookPagesConnector, factorsAiConnector, fathomAnalyticsConnector, fathomConnector, figjamConnector, figmaConnector, filloutFormsConnector, findymailConnector, firebaseConnector, fireberryConnector, firecrawlConnector, firefliesAiConnector, flipandoConnector, flowiseConnector, flowluConnector, folkConnector, foreplayCoConnector, formbricksConnector, formstackConnector, fountainConnector, fragmentConnector, frameConnector, freeAgentConnector, freshsalesConnector, freshserviceConnector, frontConnector, fullenrichConnector, gameballConnector, geminiConnector, getresponseConnector, ghostcmsConnector, gistlyConnector, giteaConnector, githubConnector, gitlabConnector, glideConnector, gmail, gongConnector, googleAnalyticsConnector, googleApiError, googleBigqueryConnector, googleCalendar, googleCloudStorageConnector, googleContactsConnector, googleDocs, googleDrive, googleErrorReason, googleForms, googleGeminiConnector, googleMeetConnector, googleMyBusinessConnector, googleSearchConnector, googleSearchConsoleConnector, googleSheets, googleSlidesConnector, googleTasksConnector, googleTestFailureReason, googleVertexaiConnector, googlechatConnector, gorgiasConnector, gotifyConnector, gptzeroDetectAiConnector, granolaConnector, greenhouseConnector, greenptConnector, greipConnector, griptapeConnector, gristConnector, guideliteConnector, gustoConnector, harvestConnector, hashiCorpVaultConnector, hastewireConnector, heartbeatConnector, hedyConnector, hellosign, helpscoutConnector, heygenConnector, heymarketSmsConnector, heyreachConnector, hightouchConnector, housecallProConnector, hubspot, huggingFaceConnector, huggingfaceConnector, humeAiConnector, hunterConnector, hystructConnector, ibmCognoseConnector, imageRouterConnector, imapConnector, influencersClubConnector, insightlyConnector, insightoAiConnector, instaChartsConnector, instantlyAiConnector, instasentConnector, intercomConnector, invoiceninjaConnector, jinaAiConnector, jiraCloudConnector, jiraDataCenterConnector, joggAiConnector, jotformConnector, justInvoiceConnector, justcallConnector, kallabotAiConnector, kapsoConnector, kimaiConnector, kissflowConnector, kizeoFormsConnector, klaviyoConnector, klentyConnector, knackConnector, knockConnector, koFiConnector, kommoConnector, kudosityConnector, kustomerConnector, lagrowthmachineConnector, leadConnectorConnector, leadfeederConnector, leadmagicConnector, leapAiConnector, leexiConnector, lemlistConnector, lemonSqueezyConnector, letsCalendarConnector, lettaConnector, leverConnector, lightfunnelsConnector, linearConnector, linkaConnector, linkupConnector, llmrailsConnector, lobstermailConnector, localaiConnector, loftyConnector, logrocketConnector, logsnagConnector, lokaliseConnector, loopsConnector, lucidyaConnector, lushaConnector, luxuryPresenceConnector, magicalApiConnector, mailchainConnector, mailchimpConnector, mailerLiteConnector, mailercheckConnector, mailerooConnector, mailgunConnector, makeConnector, manychatConnector, marketoConnector, mastodonConnector, matomoConnector, matrixConnector, mattermostConnector, mauticConnector, medullarConnector, meetgeekAiConnector, memConnector, messagebirdConnector, metabaseConnector, microsoft365PeopleConnector, microsoft365PlannerConnector, microsoftCalendar, microsoftDynamics365BusinessCentralConnector, microsoftDynamicsCrmConnector, microsoftExcel365Connector, microsoftGraph, microsoftOnenoteConnector, microsoftPowerBiConnector, microsoftTeams, microsoftTodoConnector, millionverifierConnector, mindStudioConnector, mindeeConnector, miroConnector, missiveConnector, mixmaxConnector, mixpanelConnector, modjoConnector, mollieConnector, mondayConnector, mongodbConnector, n8nConnector, netlifyConnector, niftyConnector, ninjapipeConnector, nocodbConnector, nooksConnector, notion, notionConnector, ntfyConnector, oceanIoConnector, odooConnector, omniCoConnector, omnihrConnector, oneDrive, openPhoneConnector, openRouterConnector, openaiConnector, openmicAiConnector, opnformConnector, opportifyConnector, opsgenieConnector, oracleDatabaseConnector, orimonConnector, outlookMail, outreachConnector, paddleConnector, pagerdutyConnector, pandadoc, paperformConnector, parseurConnector, pastefyConnector, paychexConnector, paywhirlConnector, pdfmonkeyConnector, peekshotConnector, perplexityAiConnector, personalAiConnector, phantombusterConnector, phonyConnector, pinchPaymentsConnector, pineconeConnector, pipedreamConnector, pipedriveConnector, placidConnector, plausibleConnector, pocketbaseConnector, pollybotAiConnector, polytomicConnector, postgresConnector, posthogConnector, postizConnector, postmarkConnector, predictLeadsConnector, productboardConnector, proxycurlConnector, pushbulletConnector, pushoverConnector, qawafelConnector, qdrantConnector, quadernoConnector, quickbooksConnector, quickzuConnector, raiaAiConnector, rapidtextAiConnector, reachinboxConnector, recallAiConnector, redditConnector, reoonVerifierConnector, replyIoConnector, retableConnector, retellAiConnector, ringcentralConnector, ripplingConnector, robollyConnector, runwareConnector, saasticConnector, saleorConnector, salesforceConnector, saleshandyConnector, salesloftConnector, sanityConnector, sardisConnector, savvycalConnector, scrapegraphaiConnector, scrapelessConnector, seamlessAiConnector, seekTableConnector, semrushConnector, sendgridConnector, sendinblueConnector, sendpulseConnector, senjaConnector, sentryConnector, serperConnector, serpstatConnector, serviceNowConnector, sharepoint, shippoConnector, shopifyConnector, shortIoConnector, signNowConnector, signrequestConnector, signwellConnector, similarwebConnector, simplirouteConnector, simplybookmeConnector, skyprepConnector, slack, slackEventsConnector, smartleadConnector, smartsheetConnector, smartsuiteConnector, smooveConnector, smsmodeConnector, snovIoConnector, snowflakeConnector, socialkitConnector, squareConnector, stripeConnector, stripePackConnector, stripeWebhookReceiverConnector, supabaseConnector, supadataConnector, swarmnodeConnector, systemeIoConnector, tableauConnector, talkableConnector, tallyConnector, teableConnector, telegramConnector, telnyxConnector, tenzoConnector, textcortexAiConnector, theirstackConnector, ticktickConnector, timeOpsConnector, timelinesAiConnector, tlDvConnector, todoistConnector, togglTrackConnector, totalcmsConnector, trelloConnector, twentyConnector, twilioConnector, twilioSmsConnector, twinLabsConnector, twitter, twitterConnector, typeformConnector, typefullyConnector, umamiConnector, upgradechatConnector, uscreenConnector, usergemsConnector, validatedmailsConnector, vapiConnector, vboutConnector, vercelConnector, videoaskConnector, vidlab7Connector, vlmRunConnector, voucheryIoConnector, vtexConnector, vtigerConnector, wafeqConnector, warmlyConnector, weaviateConnector, webflowConnector, webhookConnector, webscrapingAiConnector, whatConvertsConnector, whatsappBusiness, whatsappConnector, whatsscaleConnector, wizaConnector, wonderchatConnector, woocommerceConnector, woodpeckerConnector, wootricConnector, wordpressConnector, workableConnector, workdayConnector, wrikeConnector, writesonicBulkConnector, wufooConnector, xeroConnector, youcanbookmeConnector, youtubeDataConnector, zagomailConnector, zapierConnector, zendeskConnector, zendeskSellConnector, zenrowsConnector, zeplinConnector, zerobounceConnector, zohoBookingsConnector, zohoCrmConnector, zohoDeskConnector, zoominfoConnector, zuoraConnector } from './connectors/adapters/index.js';
15
+ export { CONNECTOR_ADAPTER_FACTORIES, ConnectorAdapterFactoryDefinition, ConnectorAdapterFactoryEnvNames, DocuSealOptions, EtsyOptions, GmailOptions, GoogleCalendarOptions, GoogleDocsOptions, GoogleDriveOptions, GoogleErrorClass, GoogleFormsOptions, GoogleSheetsOptions, HelloSignOptions, HubSpotOptions, MicrosoftCalendarOptions, MicrosoftGraphOptions, MicrosoftTeamsOptions, NotionOptions, OneDriveOptions, OutlookMailOptions, PandaDocOptions, RestConnectorSpec, RestCredentialPlacement, RestOperationSpec, RestRequestSpec, SharePointOptions, SlackOptions, TELEGRAM_FILE_DOWNLOAD_ROOT, TwitterOptions, WhatsappBusinessOptions, activecampaignConnector, acumbamailConnector, adobeCreativeCloudConnector, adpConnector, afforaiConnector, agentxConnector, aidbaseConnector, aipriseConnector, airOpsConnector, aircallConnector, airtableConnector, airtopConnector, alaiConnector, altTextAiConnector, alttextifyConnector, amazonBedrockConnector, amazonSecretsManagerConnector, amazonSesConnector, amazonSnsConnector, amazonSqsConnector, amazonTextractConnector, aminosConnector, ampecoConnector, amplemarketConnector, anthropicConnector, apitableConnector, apitemplateIoConnector, apolloConnector, appfollowConnector, asanaConnector, ashbyConnector, asknewsConnector, assemblyaiConnector, attioConnector, auth0Connector, autoboundConnector, autocallsConnector, avianConnector, avomaConnector, azureAdConnector, azureCommunicationServicesConnector, azureOpenaiConnector, backblazeConnector, bamboohrConnector, barcodeLookupConnector, baremetricsConnector, basecampConnector, beamerConnector, bettercontactConnector, bettermodeConnector, bexioConnector, bigcommerceConnector, biginByZohoConnector, billplzConnector, bitlyConnector, blandAiConnector, blueskyConnector, bolnaConnector, bonjoroConnector, bookedinConnector, boxConnector, braveSearchConnector, brazeConnector, brightdataConnector, brilliantDirectoriesConnector, browseAiConnector, builtwithConnector, calComConnector, calendlyConnector, campaignMonitorConnector, cannyConnector, canvaConnector, capsuleCrmConnector, captainDataConnector, cashfreePaymentsConnector, certopusConnector, chainalysisApiConnector, chargebeeConnector, chargekeepConnector, chartlyConnector, chatDataConnector, chatbaseConnector, chatlingConnector, chatnodeConnector, chatwootConnector, checkoutConnector, circleConnector, classifyGoogleError, classifyGoogleReason, clayConnector, clearoutConnector, clicdataConnector, clickupConnector, clioConnector, clockifyConnector, clockodoConnector, closeConnector, cloudconvertConnector, cloudinaryConnector, cloutlyConnector, codaConnector, cognismConnector, cognitoFormsConnector, cohereConnector, cometapiConnector, comfyicuConnector, commonRoomConnector, confluenceConnector, constantContactConnector, contactoutConnector, contentfulConnector, convertkitConnector, copperConnector, copyAiConnector, crispConnector, crustdataConnector, cryptolensConnector, customerIoConnector, customgptConnector, dashworksConnector, datadogConnector, datafuelConnector, datocmsConnector, declarativeRestConnector, deepseekConnector, demandbaseConnector, denserAiConnector, descriptConnector, devinConnector, dialpadConnector, discordConnector, dittofeedConnector, doctlyConnector, documentproConnector, documergeConnector, docuseal, docusignConnector, dropboxConnector, dubConnector, dumplingAiConnector, dustConnector, easyPeasyAiConnector, ebayConnector, edenAiConnector, elasticEmailConnector, emailitConnector, emailoctopusConnector, enrichlayerConnector, esignaturesConnector, etsyConnector, exaConnector, facebookLeadsConnector, facebookPagesConnector, factorsAiConnector, fathomAnalyticsConnector, fathomConnector, figjamConnector, figmaConnector, filloutFormsConnector, findymailConnector, firebaseConnector, fireberryConnector, firecrawlConnector, firefliesAiConnector, flipandoConnector, flowiseConnector, flowluConnector, folkConnector, foreplayCoConnector, formbricksConnector, formstackConnector, fountainConnector, fragmentConnector, frameConnector, freeAgentConnector, freshsalesConnector, freshserviceConnector, frontConnector, fullenrichConnector, gameballConnector, geminiConnector, getresponseConnector, ghostcmsConnector, gistlyConnector, giteaConnector, githubConnector, gitlabConnector, glideConnector, gmail, gongConnector, googleAnalyticsConnector, googleApiError, googleBigqueryConnector, googleCalendar, googleCloudStorageConnector, googleContactsConnector, googleDocs, googleDrive, googleErrorReason, googleForms, googleGeminiConnector, googleMeetConnector, googleMyBusinessConnector, googleSearchConnector, googleSearchConsoleConnector, googleSheets, googleSlidesConnector, googleTasksConnector, googleTestFailureReason, googleVertexaiConnector, googlechatConnector, gorgiasConnector, gotifyConnector, gptzeroDetectAiConnector, granolaConnector, greenhouseConnector, greenptConnector, greipConnector, griptapeConnector, gristConnector, guideliteConnector, gustoConnector, harvestConnector, hashiCorpVaultConnector, hastewireConnector, heartbeatConnector, hedyConnector, hellosign, helpscoutConnector, heygenConnector, heymarketSmsConnector, heyreachConnector, hightouchConnector, housecallProConnector, hubspot, huggingFaceConnector, huggingfaceConnector, humeAiConnector, hunterConnector, hystructConnector, ibmCognoseConnector, imageRouterConnector, imapConnector, influencersClubConnector, insightlyConnector, insightoAiConnector, instaChartsConnector, instantlyAiConnector, instasentConnector, intercomConnector, invoiceninjaConnector, jinaAiConnector, jiraCloudConnector, jiraDataCenterConnector, joggAiConnector, jotformConnector, justInvoiceConnector, justcallConnector, kallabotAiConnector, kapsoConnector, kimaiConnector, kissflowConnector, kizeoFormsConnector, klaviyoConnector, klentyConnector, knackConnector, knockConnector, koFiConnector, kommoConnector, kudosityConnector, kustomerConnector, lagrowthmachineConnector, leadConnectorConnector, leadfeederConnector, leadmagicConnector, leapAiConnector, leexiConnector, lemlistConnector, lemonSqueezyConnector, letsCalendarConnector, lettaConnector, leverConnector, lightfunnelsConnector, linearConnector, linkaConnector, linkupConnector, llmrailsConnector, lobstermailConnector, localaiConnector, loftyConnector, logrocketConnector, logsnagConnector, lokaliseConnector, loopsConnector, lucidyaConnector, lushaConnector, luxuryPresenceConnector, magicalApiConnector, mailchainConnector, mailchimpConnector, mailerLiteConnector, mailercheckConnector, mailerooConnector, mailgunConnector, makeConnector, manychatConnector, marketoConnector, mastodonConnector, matomoConnector, matrixConnector, mattermostConnector, mauticConnector, medullarConnector, meetgeekAiConnector, memConnector, messagebirdConnector, metabaseConnector, microsoft365PeopleConnector, microsoft365PlannerConnector, microsoftCalendar, microsoftDynamics365BusinessCentralConnector, microsoftDynamicsCrmConnector, microsoftExcel365Connector, microsoftGraph, microsoftOnenoteConnector, microsoftPowerBiConnector, microsoftTeams, microsoftTodoConnector, millionverifierConnector, mindStudioConnector, mindeeConnector, miroConnector, missiveConnector, mixmaxConnector, mixpanelConnector, modjoConnector, mollieConnector, mondayConnector, mongodbConnector, n8nConnector, netlifyConnector, niftyConnector, ninjapipeConnector, nocodbConnector, nooksConnector, notion, notionConnector, ntfyConnector, oceanIoConnector, odooConnector, omniCoConnector, omnihrConnector, oneDrive, openPhoneConnector, openRouterConnector, openaiConnector, openmicAiConnector, opnformConnector, opportifyConnector, opsgenieConnector, oracleDatabaseConnector, orimonConnector, outlookMail, outreachConnector, paddleConnector, pagerdutyConnector, pandadoc, paperformConnector, parseurConnector, pastefyConnector, paychexConnector, paywhirlConnector, pdfmonkeyConnector, peekshotConnector, perplexityAiConnector, personalAiConnector, phantombusterConnector, phonyConnector, pinchPaymentsConnector, pineconeConnector, pipedreamConnector, pipedriveConnector, placidConnector, plausibleConnector, pocketbaseConnector, pollybotAiConnector, polytomicConnector, postgresConnector, posthogConnector, postizConnector, postmarkConnector, predictLeadsConnector, productboardConnector, proxycurlConnector, pushbulletConnector, pushoverConnector, qawafelConnector, qdrantConnector, quadernoConnector, quickbooksConnector, quickzuConnector, raiaAiConnector, rapidtextAiConnector, reachinboxConnector, recallAiConnector, redditConnector, reoonVerifierConnector, replyIoConnector, resolveConnectorAdapterFactoryOptions, retableConnector, retellAiConnector, ringcentralConnector, ripplingConnector, robollyConnector, runwareConnector, saasticConnector, saleorConnector, salesforceConnector, saleshandyConnector, salesloftConnector, sanityConnector, sardisConnector, savvycalConnector, scrapegraphaiConnector, scrapelessConnector, seamlessAiConnector, seekTableConnector, semrushConnector, sendgridConnector, sendinblueConnector, sendpulseConnector, senjaConnector, sentryConnector, serperConnector, serpstatConnector, serviceNowConnector, sharepoint, shippoConnector, shopifyConnector, shortIoConnector, signNowConnector, signrequestConnector, signwellConnector, similarwebConnector, simplirouteConnector, simplybookmeConnector, skyprepConnector, slack, slackEventsConnector, smartleadConnector, smartsheetConnector, smartsuiteConnector, smooveConnector, smsmodeConnector, snovIoConnector, snowflakeConnector, socialkitConnector, squareConnector, stripeConnector, stripePackConnector, stripeWebhookReceiverConnector, supabaseConnector, supadataConnector, swarmnodeConnector, systemeIoConnector, tableauConnector, talkableConnector, tallyConnector, teableConnector, telegramConnector, telnyxConnector, tenzoConnector, textcortexAiConnector, theirstackConnector, ticktickConnector, timeOpsConnector, timelinesAiConnector, tlDvConnector, todoistConnector, togglTrackConnector, totalcmsConnector, trelloConnector, twentyConnector, twilioConnector, twilioSmsConnector, twinLabsConnector, twitter, twitterConnector, typeformConnector, typefullyConnector, umamiConnector, upgradechatConnector, uscreenConnector, usergemsConnector, validatedmailsConnector, vapiConnector, vboutConnector, vercelConnector, videoaskConnector, vidlab7Connector, vlmRunConnector, voucheryIoConnector, vtexConnector, vtigerConnector, wafeqConnector, warmlyConnector, weaviateConnector, webflowConnector, webhookConnector, webscrapingAiConnector, whatConvertsConnector, whatsappBusiness, whatsappConnector, whatsscaleConnector, wizaConnector, wonderchatConnector, woocommerceConnector, woodpeckerConnector, wootricConnector, wordpressConnector, workableConnector, workdayConnector, wrikeConnector, writesonicBulkConnector, wufooConnector, xeroConnector, youcanbookmeConnector, youtubeDataConnector, zagomailConnector, zapierConnector, zendeskConnector, zendeskSellConnector, zenrowsConnector, zeplinConnector, zerobounceConnector, zohoBookingsConnector, zohoCrmConnector, zohoDeskConnector, zoominfoConnector, zuoraConnector } from './connectors/adapters/index.js';
16
16
  export { D as DEFAULT_TANGLE_PLATFORM_URL, d as TANGLE_API_KEY_PREFIX, e as TANGLE_SERVICE_TOKEN_PREFIX, b as TangleIdentityClient, T as TangleIdentityOptions, f as TangleIdentityUnreachableError, c as TangleTokenVerifyFailure, g as TangleTokenVerifyResult, a as TangleUserSummary, h as TangleWorkspaceSummary, i as createTangleIdentityClient, t as tangleIdentity } from './tangle-id-_uZ3ywCF.js';
17
17
  export { IntegrationCatalogView, IntegrationToolDefinition, IntegrationToolSearchFilters, IntegrationToolSearchResult, McpToolDefinition, buildIntegrationCatalogView, buildIntegrationToolCatalog, describeIntegrationTool, flattenIntegrationToolDefinition, integrationToolName, parseIntegrationToolName, searchIntegrationTools, toMcpTools } from './catalog.js';
18
18
  export { G as GraphqlOperationSpec, I as ImportCatalogOptions, a as McpCatalog, M as McpCatalogTool, O as OpenApiDocument, b as OpenApiOperation, i as importGraphqlConnector, c as importMcpConnector, d as importOpenApiConnector } from './importers-6Beu0SQ9.js';
package/dist/index.js CHANGED
@@ -119,7 +119,7 @@ import {
119
119
  validateIntegrationManifest,
120
120
  validateProviderPassthroughRequest,
121
121
  verifyCapabilityToken
122
- } from "./chunk-XECSOZRL.js";
122
+ } from "./chunk-AJ67SDTL.js";
123
123
  import {
124
124
  InMemoryConnectStateStore,
125
125
  finishConnectFlow,
@@ -168,6 +168,7 @@ import {
168
168
  } from "./chunk-7P2LN4VT.js";
169
169
  import "./chunk-376UBTNB.js";
170
170
  import {
171
+ CONNECTOR_ADAPTER_FACTORIES,
171
172
  InMemoryOAuthFlowStore,
172
173
  TELEGRAM_FILE_DOWNLOAD_ROOT,
173
174
  _resetPendingFlowsForTests,
@@ -582,6 +583,7 @@ import {
582
583
  refreshAccessToken,
583
584
  reoonVerifierConnector,
584
585
  replyIoConnector,
586
+ resolveConnectorAdapterFactoryOptions,
585
587
  retableConnector,
586
588
  retellAiConnector,
587
589
  ringcentralConnector,
@@ -714,7 +716,7 @@ import {
714
716
  zohoDeskConnector,
715
717
  zoominfoConnector,
716
718
  zuoraConnector
717
- } from "./chunk-EV7PFUCM.js";
719
+ } from "./chunk-RM6JJK4Q.js";
718
720
  import {
719
721
  DEFAULT_SIGNATURE_TOLERANCE_SECONDS,
720
722
  firstHeader,
@@ -745,6 +747,7 @@ export {
745
747
  ACTIVEPIECES_PUBLIC_CATALOG_URL,
746
748
  ApprovalBackedPolicyEngine,
747
749
  CANONICAL_INTEGRATION_ACTIONS,
750
+ CONNECTOR_ADAPTER_FACTORIES,
748
751
  CredentialsExpired,
749
752
  DEFAULT_INTEGRATION_BRIDGE_ENV,
750
753
  DEFAULT_SIGNATURE_TOLERANCE_SECONDS,
@@ -1299,6 +1302,7 @@ export {
1299
1302
  replyIoConnector,
1300
1303
  requireTangleAuth,
1301
1304
  resolveConnectionCredentials,
1305
+ resolveConnectorAdapterFactoryOptions,
1302
1306
  resolveConnectorAuthSpec,
1303
1307
  resolveIntegrationApproval,
1304
1308
  retableConnector,
package/dist/mcp.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  IntegrationError,
3
3
  createCatalogExecutorProvider,
4
4
  importMcpConnector
5
- } from "./chunk-XECSOZRL.js";
5
+ } from "./chunk-AJ67SDTL.js";
6
6
  import "./chunk-S2BUASSV.js";
7
7
  import "./chunk-LA76XB7M.js";
8
8
  import "./chunk-H4XYLS7T.js";
@@ -10,7 +10,7 @@ import "./chunk-VLVSP7SP.js";
10
10
  import "./chunk-IA5GCKM6.js";
11
11
  import "./chunk-7P2LN4VT.js";
12
12
  import "./chunk-376UBTNB.js";
13
- import "./chunk-EV7PFUCM.js";
13
+ import "./chunk-RM6JJK4Q.js";
14
14
  import "./chunk-XC54EOUQ.js";
15
15
  import "./chunk-UWF33ESC.js";
16
16
  import "./chunk-PZ5AY32C.js";
package/dist/registry.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  composeIntegrationRegistry,
6
6
  inferIntegrationSupportTier,
7
7
  summarizeIntegrationRegistry
8
- } from "./chunk-XECSOZRL.js";
8
+ } from "./chunk-AJ67SDTL.js";
9
9
  import "./chunk-S2BUASSV.js";
10
10
  import "./chunk-LA76XB7M.js";
11
11
  import "./chunk-H4XYLS7T.js";
@@ -13,7 +13,7 @@ import "./chunk-VLVSP7SP.js";
13
13
  import "./chunk-IA5GCKM6.js";
14
14
  import "./chunk-7P2LN4VT.js";
15
15
  import "./chunk-376UBTNB.js";
16
- import "./chunk-EV7PFUCM.js";
16
+ import "./chunk-RM6JJK4Q.js";
17
17
  import "./chunk-XC54EOUQ.js";
18
18
  import "./chunk-UWF33ESC.js";
19
19
  import "./chunk-PZ5AY32C.js";