@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.
- package/dist/catalog.js +2 -2
- package/dist/{chunk-XECSOZRL.js → chunk-AJ67SDTL.js} +8 -3
- package/dist/{chunk-XECSOZRL.js.map → chunk-AJ67SDTL.js.map} +1 -1
- package/dist/{chunk-EV7PFUCM.js → chunk-RM6JJK4Q.js} +33686 -33398
- package/dist/{chunk-EV7PFUCM.js.map → chunk-RM6JJK4Q.js.map} +1 -1
- package/dist/connectors/adapters/index.d.ts +16 -1
- package/dist/connectors/adapters/index.js +5 -1
- package/dist/connectors/index.d.ts +5 -1
- package/dist/connectors/index.js +5 -1
- package/dist/conversation-events/index.d.ts +101 -0
- package/dist/conversation-events/index.js +432 -0
- package/dist/conversation-events/index.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -2
- package/dist/mcp.js +2 -2
- package/dist/registry.js +2 -2
- package/dist/runtime.js +2 -2
- package/dist/webhooks/index.d.ts +2 -28
- package/dist/webhooks/index.js.map +1 -1
- package/docs/integration-execution-audit.md +21 -21
- package/docs/integration-execution-matrix.json +1684 -72
- package/package.json +13 -5
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
16
|
+
import "./chunk-RM6JJK4Q.js";
|
|
17
17
|
import "./chunk-XC54EOUQ.js";
|
|
18
18
|
import "./chunk-UWF33ESC.js";
|
|
19
19
|
import "./chunk-PZ5AY32C.js";
|