@automate.ax/integration-contracts 0.95.4 → 0.97.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/close/schemas.d.ts +1 -1
- package/dist/close/schemas.js +1 -1
- package/dist/slack/event-schemas.d.ts +42126 -0
- package/dist/slack/event-schemas.js +714 -0
- package/dist/slack/index.d.ts +22401 -25
- package/dist/slack/index.js +78 -5
- package/dist/slack/schemas.d.ts +85 -291
- package/dist/slack/schemas.js +68 -185
- package/package.json +2 -2
- package/src/close/schemas.ts +1 -1
- package/src/slack/event-schemas.ts +792 -0
- package/src/slack/index.ts +100 -8
- package/src/slack/schemas.ts +71 -216
|
@@ -0,0 +1,714 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { SLACK_MEMBER_SCHEMA, SLACK_MESSAGE_SCHEMA, SLACK_PROVIDER_MEMBER_SCHEMA, SLACK_PROVIDER_MESSAGE_SCHEMA, SLACK_REACTION_ITEM_SCHEMA, toSlackMember, toSlackMessage, } from "./schemas.js";
|
|
3
|
+
export const SLACK_CONVERSATION_TYPE_SCHEMA = z.enum([
|
|
4
|
+
"channel",
|
|
5
|
+
"group",
|
|
6
|
+
"im",
|
|
7
|
+
"mpim",
|
|
8
|
+
]);
|
|
9
|
+
const SLACK_EVENT_TIMESTAMP_SCHEMA = z.string();
|
|
10
|
+
export const SLACK_PROVIDER_MESSAGE_EVENT_SCHEMA = SLACK_PROVIDER_MESSAGE_SCHEMA.extend({
|
|
11
|
+
channel: z.string(),
|
|
12
|
+
channel_type: SLACK_CONVERSATION_TYPE_SCHEMA.optional(),
|
|
13
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
14
|
+
type: z.literal("message"),
|
|
15
|
+
});
|
|
16
|
+
export const SLACK_PROVIDER_ORDINARY_MESSAGE_EVENT_SCHEMA = SLACK_PROVIDER_MESSAGE_EVENT_SCHEMA.extend({
|
|
17
|
+
app_id: z.undefined().optional(),
|
|
18
|
+
bot_id: z.undefined().optional(),
|
|
19
|
+
channel_type: SLACK_CONVERSATION_TYPE_SCHEMA,
|
|
20
|
+
hidden: z.literal(false).optional(),
|
|
21
|
+
subtype: z.undefined().optional(),
|
|
22
|
+
type: z.literal("message"),
|
|
23
|
+
user: z.string(),
|
|
24
|
+
});
|
|
25
|
+
export const SLACK_PROVIDER_APP_MENTION_EVENT_SCHEMA = SLACK_PROVIDER_MESSAGE_EVENT_SCHEMA.extend({
|
|
26
|
+
text: z.string(),
|
|
27
|
+
type: z.literal("app_mention"),
|
|
28
|
+
user: z.string().optional(),
|
|
29
|
+
});
|
|
30
|
+
export const SLACK_PROVIDER_MESSAGE_CHANGED_EVENT_SCHEMA = z
|
|
31
|
+
.object({
|
|
32
|
+
channel: z.string(),
|
|
33
|
+
channel_type: SLACK_CONVERSATION_TYPE_SCHEMA,
|
|
34
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
35
|
+
hidden: z.literal(true),
|
|
36
|
+
message: SLACK_PROVIDER_MESSAGE_SCHEMA,
|
|
37
|
+
previous_message: SLACK_PROVIDER_MESSAGE_SCHEMA,
|
|
38
|
+
subtype: z.literal("message_changed"),
|
|
39
|
+
ts: z.string(),
|
|
40
|
+
type: z.literal("message"),
|
|
41
|
+
})
|
|
42
|
+
.catchall(z.json());
|
|
43
|
+
export const SLACK_PROVIDER_MESSAGE_DELETED_EVENT_SCHEMA = z
|
|
44
|
+
.object({
|
|
45
|
+
channel: z.string(),
|
|
46
|
+
channel_type: SLACK_CONVERSATION_TYPE_SCHEMA,
|
|
47
|
+
deleted_ts: z.string(),
|
|
48
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
49
|
+
hidden: z.literal(true),
|
|
50
|
+
previous_message: SLACK_PROVIDER_MESSAGE_SCHEMA.optional(),
|
|
51
|
+
subtype: z.literal("message_deleted"),
|
|
52
|
+
ts: z.string(),
|
|
53
|
+
type: z.literal("message"),
|
|
54
|
+
})
|
|
55
|
+
.catchall(z.json());
|
|
56
|
+
const SLACK_PROVIDER_REACTION_ITEM_SCHEMA = z.discriminatedUnion("type", [
|
|
57
|
+
z
|
|
58
|
+
.object({
|
|
59
|
+
channel: z.string(),
|
|
60
|
+
channel_type: SLACK_CONVERSATION_TYPE_SCHEMA.optional(),
|
|
61
|
+
ts: z.string(),
|
|
62
|
+
type: z.literal("message"),
|
|
63
|
+
})
|
|
64
|
+
.catchall(z.json()),
|
|
65
|
+
z.object({ file: z.string(), type: z.literal("file") }).catchall(z.json()),
|
|
66
|
+
z
|
|
67
|
+
.object({
|
|
68
|
+
file: z.string(),
|
|
69
|
+
file_comment: z.string(),
|
|
70
|
+
type: z.literal("file_comment"),
|
|
71
|
+
})
|
|
72
|
+
.catchall(z.json()),
|
|
73
|
+
]);
|
|
74
|
+
const SLACK_PROVIDER_REACTION_EVENT_BASE_SCHEMA = z
|
|
75
|
+
.object({
|
|
76
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
77
|
+
item: SLACK_PROVIDER_REACTION_ITEM_SCHEMA,
|
|
78
|
+
item_user: z.string().optional(),
|
|
79
|
+
reaction: z.string(),
|
|
80
|
+
user: z.string(),
|
|
81
|
+
})
|
|
82
|
+
.catchall(z.json());
|
|
83
|
+
export const SLACK_PROVIDER_REACTION_ADDED_EVENT_SCHEMA = SLACK_PROVIDER_REACTION_EVENT_BASE_SCHEMA.extend({
|
|
84
|
+
type: z.literal("reaction_added"),
|
|
85
|
+
});
|
|
86
|
+
export const SLACK_PROVIDER_REACTION_REMOVED_EVENT_SCHEMA = SLACK_PROVIDER_REACTION_EVENT_BASE_SCHEMA.extend({
|
|
87
|
+
type: z.literal("reaction_removed"),
|
|
88
|
+
});
|
|
89
|
+
export const SLACK_MEMBERSHIP_CONVERSATION_TYPE_CODE_SCHEMA = z.enum(["C", "G"]);
|
|
90
|
+
const SLACK_PROVIDER_CHANNEL_MEMBERSHIP_EVENT_BASE_SCHEMA = z
|
|
91
|
+
.object({
|
|
92
|
+
channel: z.string(),
|
|
93
|
+
channel_type: SLACK_MEMBERSHIP_CONVERSATION_TYPE_CODE_SCHEMA,
|
|
94
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
95
|
+
team: z.string(),
|
|
96
|
+
user: z.string(),
|
|
97
|
+
})
|
|
98
|
+
.catchall(z.json());
|
|
99
|
+
export const SLACK_PROVIDER_MEMBER_JOINED_CHANNEL_EVENT_SCHEMA = SLACK_PROVIDER_CHANNEL_MEMBERSHIP_EVENT_BASE_SCHEMA.extend({
|
|
100
|
+
enterprise: z.string().optional(),
|
|
101
|
+
inviter: z.string().optional(),
|
|
102
|
+
type: z.literal("member_joined_channel"),
|
|
103
|
+
});
|
|
104
|
+
export const SLACK_PROVIDER_MEMBER_LEFT_CHANNEL_EVENT_SCHEMA = SLACK_PROVIDER_CHANNEL_MEMBERSHIP_EVENT_BASE_SCHEMA.extend({
|
|
105
|
+
type: z.literal("member_left_channel"),
|
|
106
|
+
});
|
|
107
|
+
const SLACK_PROVIDER_FILE_EVENT_BASE_SCHEMA = z
|
|
108
|
+
.object({
|
|
109
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
110
|
+
file_id: z.string(),
|
|
111
|
+
})
|
|
112
|
+
.catchall(z.json());
|
|
113
|
+
const SLACK_PROVIDER_FILE_REFERENCE_SCHEMA = z
|
|
114
|
+
.object({ id: z.string() })
|
|
115
|
+
.catchall(z.json());
|
|
116
|
+
export const SLACK_PROVIDER_FILE_CREATED_EVENT_SCHEMA = SLACK_PROVIDER_FILE_EVENT_BASE_SCHEMA.extend({
|
|
117
|
+
file: SLACK_PROVIDER_FILE_REFERENCE_SCHEMA,
|
|
118
|
+
type: z.literal("file_created"),
|
|
119
|
+
user_id: z.string(),
|
|
120
|
+
});
|
|
121
|
+
export const SLACK_PROVIDER_FILE_SHARED_EVENT_SCHEMA = SLACK_PROVIDER_FILE_EVENT_BASE_SCHEMA.extend({
|
|
122
|
+
channel_id: z.string(),
|
|
123
|
+
file: SLACK_PROVIDER_FILE_REFERENCE_SCHEMA,
|
|
124
|
+
type: z.literal("file_shared"),
|
|
125
|
+
user_id: z.string(),
|
|
126
|
+
});
|
|
127
|
+
export const SLACK_PROVIDER_FILE_DELETED_EVENT_SCHEMA = SLACK_PROVIDER_FILE_EVENT_BASE_SCHEMA.extend({
|
|
128
|
+
type: z.literal("file_deleted"),
|
|
129
|
+
});
|
|
130
|
+
export const SLACK_PROVIDER_TEAM_JOIN_EVENT_SCHEMA = z
|
|
131
|
+
.object({
|
|
132
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
133
|
+
type: z.literal("team_join"),
|
|
134
|
+
user: SLACK_PROVIDER_MEMBER_SCHEMA,
|
|
135
|
+
})
|
|
136
|
+
.catchall(z.json());
|
|
137
|
+
export const SLACK_PROVIDER_USER_CHANGE_EVENT_SCHEMA = z
|
|
138
|
+
.object({
|
|
139
|
+
cache_ts: z.number().int().nonnegative().optional(),
|
|
140
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
141
|
+
type: z.literal("user_change"),
|
|
142
|
+
user: SLACK_PROVIDER_MEMBER_SCHEMA,
|
|
143
|
+
})
|
|
144
|
+
.catchall(z.json());
|
|
145
|
+
const SLACK_PROVIDER_CHANNEL_SCHEMA = z
|
|
146
|
+
.object({
|
|
147
|
+
created: z.number().int().nonnegative(),
|
|
148
|
+
id: z.string(),
|
|
149
|
+
is_channel: z.boolean().optional(),
|
|
150
|
+
is_mpim: z.boolean().optional(),
|
|
151
|
+
name: z.string(),
|
|
152
|
+
name_normalized: z.string().optional(),
|
|
153
|
+
})
|
|
154
|
+
.catchall(z.json());
|
|
155
|
+
export const SLACK_PROVIDER_CHANNEL_CREATED_EVENT_SCHEMA = z
|
|
156
|
+
.object({
|
|
157
|
+
channel: SLACK_PROVIDER_CHANNEL_SCHEMA.extend({
|
|
158
|
+
context_team_id: z.string().optional(),
|
|
159
|
+
creator: z.string(),
|
|
160
|
+
is_archived: z.boolean().optional(),
|
|
161
|
+
is_ext_shared: z.boolean().optional(),
|
|
162
|
+
is_frozen: z.boolean().optional(),
|
|
163
|
+
is_general: z.boolean().optional(),
|
|
164
|
+
is_group: z.boolean().optional(),
|
|
165
|
+
is_im: z.boolean().optional(),
|
|
166
|
+
is_org_shared: z.boolean().optional(),
|
|
167
|
+
is_pending_ext_shared: z.boolean().optional(),
|
|
168
|
+
is_private: z.boolean().optional(),
|
|
169
|
+
is_shared: z.boolean().optional(),
|
|
170
|
+
}),
|
|
171
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
172
|
+
type: z.literal("channel_created"),
|
|
173
|
+
})
|
|
174
|
+
.catchall(z.json());
|
|
175
|
+
export const SLACK_PROVIDER_CHANNEL_RENAME_EVENT_SCHEMA = z
|
|
176
|
+
.object({
|
|
177
|
+
channel: SLACK_PROVIDER_CHANNEL_SCHEMA,
|
|
178
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
179
|
+
type: z.literal("channel_rename"),
|
|
180
|
+
})
|
|
181
|
+
.catchall(z.json());
|
|
182
|
+
export const SLACK_PROVIDER_CHANNEL_SHARED_EVENT_SCHEMA = z
|
|
183
|
+
.object({
|
|
184
|
+
channel: z.string(),
|
|
185
|
+
connected_team_id: z.string(),
|
|
186
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
187
|
+
type: z.literal("channel_shared"),
|
|
188
|
+
})
|
|
189
|
+
.catchall(z.json());
|
|
190
|
+
export const SLACK_PROVIDER_CHANNEL_UNSHARED_EVENT_SCHEMA = z
|
|
191
|
+
.object({
|
|
192
|
+
channel: z.string(),
|
|
193
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
194
|
+
is_ext_shared: z.boolean(),
|
|
195
|
+
previously_connected_team_id: z.string(),
|
|
196
|
+
type: z.literal("channel_unshared"),
|
|
197
|
+
})
|
|
198
|
+
.catchall(z.json());
|
|
199
|
+
const SLACK_PROVIDER_PINNED_MESSAGE_SCHEMA = SLACK_PROVIDER_MESSAGE_SCHEMA.extend({
|
|
200
|
+
permalink: z.string().optional(),
|
|
201
|
+
user: z.string(),
|
|
202
|
+
});
|
|
203
|
+
const SLACK_PROVIDER_PIN_ITEM_SCHEMA = z
|
|
204
|
+
.object({
|
|
205
|
+
channel: z.string(),
|
|
206
|
+
created: z.number().optional(),
|
|
207
|
+
created_by: z.string().optional(),
|
|
208
|
+
file: SLACK_PROVIDER_FILE_REFERENCE_SCHEMA.optional(),
|
|
209
|
+
message: SLACK_PROVIDER_PINNED_MESSAGE_SCHEMA.optional(),
|
|
210
|
+
type: z.string(),
|
|
211
|
+
})
|
|
212
|
+
.catchall(z.json());
|
|
213
|
+
const SLACK_PROVIDER_PINNED_INFO_SCHEMA = z
|
|
214
|
+
.object({
|
|
215
|
+
channel: z.string(),
|
|
216
|
+
pinned_by: z.string(),
|
|
217
|
+
pinned_ts: z.number(),
|
|
218
|
+
})
|
|
219
|
+
.catchall(z.json());
|
|
220
|
+
const SLACK_PROVIDER_PIN_EVENT_BASE_SCHEMA = z
|
|
221
|
+
.object({
|
|
222
|
+
channel_id: z.string(),
|
|
223
|
+
event_ts: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
224
|
+
item: SLACK_PROVIDER_PIN_ITEM_SCHEMA,
|
|
225
|
+
item_user: z.string().optional(),
|
|
226
|
+
pin_count: z.string().optional(),
|
|
227
|
+
pinned_info: SLACK_PROVIDER_PINNED_INFO_SCHEMA.optional(),
|
|
228
|
+
user: z.string(),
|
|
229
|
+
})
|
|
230
|
+
.catchall(z.json());
|
|
231
|
+
export const SLACK_PROVIDER_PIN_ADDED_EVENT_SCHEMA = SLACK_PROVIDER_PIN_EVENT_BASE_SCHEMA.extend({ type: z.literal("pin_added") });
|
|
232
|
+
export const SLACK_PROVIDER_PIN_REMOVED_EVENT_SCHEMA = SLACK_PROVIDER_PIN_EVENT_BASE_SCHEMA.extend({
|
|
233
|
+
has_pins: z.boolean().optional(),
|
|
234
|
+
type: z.literal("pin_removed"),
|
|
235
|
+
});
|
|
236
|
+
export const SLACK_SUPPORTED_PROVIDER_EVENT_SCHEMA = z.union([
|
|
237
|
+
SLACK_PROVIDER_APP_MENTION_EVENT_SCHEMA,
|
|
238
|
+
SLACK_PROVIDER_MESSAGE_CHANGED_EVENT_SCHEMA,
|
|
239
|
+
SLACK_PROVIDER_MESSAGE_DELETED_EVENT_SCHEMA,
|
|
240
|
+
SLACK_PROVIDER_ORDINARY_MESSAGE_EVENT_SCHEMA,
|
|
241
|
+
SLACK_PROVIDER_REACTION_ADDED_EVENT_SCHEMA,
|
|
242
|
+
SLACK_PROVIDER_REACTION_REMOVED_EVENT_SCHEMA,
|
|
243
|
+
SLACK_PROVIDER_MEMBER_JOINED_CHANNEL_EVENT_SCHEMA,
|
|
244
|
+
SLACK_PROVIDER_MEMBER_LEFT_CHANNEL_EVENT_SCHEMA,
|
|
245
|
+
SLACK_PROVIDER_FILE_CREATED_EVENT_SCHEMA,
|
|
246
|
+
SLACK_PROVIDER_FILE_SHARED_EVENT_SCHEMA,
|
|
247
|
+
SLACK_PROVIDER_FILE_DELETED_EVENT_SCHEMA,
|
|
248
|
+
SLACK_PROVIDER_TEAM_JOIN_EVENT_SCHEMA,
|
|
249
|
+
SLACK_PROVIDER_USER_CHANGE_EVENT_SCHEMA,
|
|
250
|
+
SLACK_PROVIDER_CHANNEL_CREATED_EVENT_SCHEMA,
|
|
251
|
+
SLACK_PROVIDER_CHANNEL_RENAME_EVENT_SCHEMA,
|
|
252
|
+
SLACK_PROVIDER_CHANNEL_SHARED_EVENT_SCHEMA,
|
|
253
|
+
SLACK_PROVIDER_CHANNEL_UNSHARED_EVENT_SCHEMA,
|
|
254
|
+
SLACK_PROVIDER_PIN_ADDED_EVENT_SCHEMA,
|
|
255
|
+
SLACK_PROVIDER_PIN_REMOVED_EVENT_SCHEMA,
|
|
256
|
+
SLACK_PROVIDER_MESSAGE_EVENT_SCHEMA,
|
|
257
|
+
]);
|
|
258
|
+
export const SLACK_EVENT_AUTHORIZATION_SCHEMA = z
|
|
259
|
+
.object({
|
|
260
|
+
enterprise_id: z.string().nullable().optional(),
|
|
261
|
+
is_bot: z.boolean(),
|
|
262
|
+
is_enterprise_install: z.boolean().optional(),
|
|
263
|
+
team_id: z.string().nullable().optional(),
|
|
264
|
+
user_id: z.string().nullable().optional(),
|
|
265
|
+
})
|
|
266
|
+
.catchall(z.json());
|
|
267
|
+
export const SLACK_EVENT_CALLBACK_SCHEMA = z
|
|
268
|
+
.object({
|
|
269
|
+
api_app_id: z.string(),
|
|
270
|
+
authorizations: SLACK_EVENT_AUTHORIZATION_SCHEMA.array().optional(),
|
|
271
|
+
context_enterprise_id: z.string().nullable().optional(),
|
|
272
|
+
context_team_id: z.string().optional(),
|
|
273
|
+
event: SLACK_SUPPORTED_PROVIDER_EVENT_SCHEMA,
|
|
274
|
+
event_context: z.string().optional(),
|
|
275
|
+
event_id: z.string(),
|
|
276
|
+
event_time: z.number().int().nonnegative(),
|
|
277
|
+
is_ext_shared_channel: z.boolean().optional(),
|
|
278
|
+
team_id: z.string(),
|
|
279
|
+
type: z.literal("event_callback"),
|
|
280
|
+
})
|
|
281
|
+
.catchall(z.json());
|
|
282
|
+
const slackEventPayloadSchema = z
|
|
283
|
+
.object({
|
|
284
|
+
envelope: SLACK_EVENT_CALLBACK_SCHEMA,
|
|
285
|
+
event: SLACK_SUPPORTED_PROVIDER_EVENT_SCHEMA,
|
|
286
|
+
eventTimestamp: SLACK_EVENT_TIMESTAMP_SCHEMA,
|
|
287
|
+
workspaceId: z.string(),
|
|
288
|
+
})
|
|
289
|
+
.catchall(z.json());
|
|
290
|
+
const SLACK_MESSAGE_EVENT_BASE_SCHEMA = slackEventPayloadSchema.extend({
|
|
291
|
+
...SLACK_MESSAGE_SCHEMA.shape,
|
|
292
|
+
conversationId: z.string(),
|
|
293
|
+
conversationType: SLACK_CONVERSATION_TYPE_SCHEMA.optional(),
|
|
294
|
+
});
|
|
295
|
+
export const SLACK_APP_MENTION_CALLBACK_EVENT_SCHEMA = SLACK_MESSAGE_EVENT_BASE_SCHEMA.extend({
|
|
296
|
+
event: SLACK_PROVIDER_APP_MENTION_EVENT_SCHEMA,
|
|
297
|
+
type: z.literal("app_mention"),
|
|
298
|
+
});
|
|
299
|
+
export const SLACK_MESSAGE_POSTED_CALLBACK_EVENT_SCHEMA = SLACK_MESSAGE_EVENT_BASE_SCHEMA.extend({
|
|
300
|
+
conversationType: SLACK_CONVERSATION_TYPE_SCHEMA,
|
|
301
|
+
event: SLACK_PROVIDER_ORDINARY_MESSAGE_EVENT_SCHEMA,
|
|
302
|
+
threadTimestamp: z.undefined().optional(),
|
|
303
|
+
type: z.literal("message"),
|
|
304
|
+
});
|
|
305
|
+
export const SLACK_THREAD_REPLY_POSTED_EVENT_SCHEMA = SLACK_MESSAGE_EVENT_BASE_SCHEMA.extend({
|
|
306
|
+
conversationType: SLACK_CONVERSATION_TYPE_SCHEMA,
|
|
307
|
+
event: SLACK_PROVIDER_ORDINARY_MESSAGE_EVENT_SCHEMA,
|
|
308
|
+
threadTimestamp: z.string(),
|
|
309
|
+
type: z.literal("message"),
|
|
310
|
+
});
|
|
311
|
+
export const SLACK_MESSAGE_CHANGED_EVENT_SCHEMA = slackEventPayloadSchema.extend({
|
|
312
|
+
conversationId: z.string(),
|
|
313
|
+
conversationType: SLACK_CONVERSATION_TYPE_SCHEMA,
|
|
314
|
+
event: SLACK_PROVIDER_MESSAGE_CHANGED_EVENT_SCHEMA,
|
|
315
|
+
message: SLACK_PROVIDER_MESSAGE_SCHEMA,
|
|
316
|
+
previousMessage: SLACK_PROVIDER_MESSAGE_SCHEMA,
|
|
317
|
+
});
|
|
318
|
+
export const SLACK_MESSAGE_DELETED_EVENT_SCHEMA = slackEventPayloadSchema.extend({
|
|
319
|
+
conversationId: z.string(),
|
|
320
|
+
conversationType: SLACK_CONVERSATION_TYPE_SCHEMA,
|
|
321
|
+
deletedTimestamp: z.string(),
|
|
322
|
+
event: SLACK_PROVIDER_MESSAGE_DELETED_EVENT_SCHEMA,
|
|
323
|
+
previousMessage: SLACK_PROVIDER_MESSAGE_SCHEMA.optional(),
|
|
324
|
+
});
|
|
325
|
+
export const SLACK_REACTION_CALLBACK_EVENT_SCHEMA = slackEventPayloadSchema.extend({
|
|
326
|
+
event: z.union([
|
|
327
|
+
SLACK_PROVIDER_REACTION_ADDED_EVENT_SCHEMA,
|
|
328
|
+
SLACK_PROVIDER_REACTION_REMOVED_EVENT_SCHEMA,
|
|
329
|
+
]),
|
|
330
|
+
item: SLACK_REACTION_ITEM_SCHEMA,
|
|
331
|
+
itemUserId: z.string().optional(),
|
|
332
|
+
reaction: z.string(),
|
|
333
|
+
userId: z.string(),
|
|
334
|
+
});
|
|
335
|
+
export const SLACK_CHANNEL_MEMBER_EVENT_SCHEMA = slackEventPayloadSchema.extend({
|
|
336
|
+
conversationId: z.string(),
|
|
337
|
+
conversationTypeCode: SLACK_MEMBERSHIP_CONVERSATION_TYPE_CODE_SCHEMA,
|
|
338
|
+
enterpriseId: z.string().optional(),
|
|
339
|
+
inviterId: z.string().optional(),
|
|
340
|
+
userId: z.string(),
|
|
341
|
+
});
|
|
342
|
+
export const SLACK_FILE_EVENT_SCHEMA = slackEventPayloadSchema.extend({
|
|
343
|
+
channelId: z.string().optional(),
|
|
344
|
+
fileId: z.string(),
|
|
345
|
+
userId: z.string().optional(),
|
|
346
|
+
});
|
|
347
|
+
export const SLACK_WORKSPACE_MEMBER_EVENT_SCHEMA = slackEventPayloadSchema.extend({ member: SLACK_MEMBER_SCHEMA });
|
|
348
|
+
export const SLACK_CHANNEL_EVENT_SCHEMA = slackEventPayloadSchema.extend({
|
|
349
|
+
channelId: z.string(),
|
|
350
|
+
connectedWorkspaceId: z.string().optional(),
|
|
351
|
+
createdAt: z.number().int().nonnegative().optional(),
|
|
352
|
+
creatorId: z.string().optional(),
|
|
353
|
+
isExternallyShared: z.boolean().optional(),
|
|
354
|
+
name: z.string().optional(),
|
|
355
|
+
previouslyConnectedWorkspaceId: z.string().optional(),
|
|
356
|
+
});
|
|
357
|
+
export const SLACK_PIN_EVENT_SCHEMA = slackEventPayloadSchema.extend({
|
|
358
|
+
conversationId: z.string(),
|
|
359
|
+
hasPins: z.boolean().optional(),
|
|
360
|
+
item: SLACK_PROVIDER_PIN_ITEM_SCHEMA,
|
|
361
|
+
userId: z.string(),
|
|
362
|
+
});
|
|
363
|
+
export const SLACK_CHANNEL_CREATED_EVENT_SCHEMA = SLACK_CHANNEL_EVENT_SCHEMA.extend({
|
|
364
|
+
createdAt: z.number().int().nonnegative(),
|
|
365
|
+
creatorId: z.string(),
|
|
366
|
+
event: SLACK_PROVIDER_CHANNEL_CREATED_EVENT_SCHEMA,
|
|
367
|
+
name: z.string(),
|
|
368
|
+
});
|
|
369
|
+
export const SLACK_CHANNEL_RENAMED_EVENT_SCHEMA = SLACK_CHANNEL_EVENT_SCHEMA.extend({
|
|
370
|
+
createdAt: z.number().int().nonnegative(),
|
|
371
|
+
event: SLACK_PROVIDER_CHANNEL_RENAME_EVENT_SCHEMA,
|
|
372
|
+
name: z.string(),
|
|
373
|
+
});
|
|
374
|
+
export const SLACK_CHANNEL_SHARED_EVENT_SCHEMA = SLACK_CHANNEL_EVENT_SCHEMA.extend({
|
|
375
|
+
connectedWorkspaceId: z.string(),
|
|
376
|
+
event: SLACK_PROVIDER_CHANNEL_SHARED_EVENT_SCHEMA,
|
|
377
|
+
});
|
|
378
|
+
export const SLACK_CHANNEL_UNSHARED_EVENT_SCHEMA = SLACK_CHANNEL_EVENT_SCHEMA.extend({
|
|
379
|
+
event: SLACK_PROVIDER_CHANNEL_UNSHARED_EVENT_SCHEMA,
|
|
380
|
+
isExternallyShared: z.boolean(),
|
|
381
|
+
previouslyConnectedWorkspaceId: z.string(),
|
|
382
|
+
});
|
|
383
|
+
export const SLACK_CHANNEL_MEMBER_JOINED_EVENT_SCHEMA = SLACK_CHANNEL_MEMBER_EVENT_SCHEMA.extend({
|
|
384
|
+
event: SLACK_PROVIDER_MEMBER_JOINED_CHANNEL_EVENT_SCHEMA,
|
|
385
|
+
});
|
|
386
|
+
export const SLACK_CHANNEL_MEMBER_LEFT_EVENT_SCHEMA = SLACK_CHANNEL_MEMBER_EVENT_SCHEMA.extend({
|
|
387
|
+
event: SLACK_PROVIDER_MEMBER_LEFT_CHANNEL_EVENT_SCHEMA,
|
|
388
|
+
});
|
|
389
|
+
export const SLACK_FILE_CREATED_EVENT_SCHEMA = SLACK_FILE_EVENT_SCHEMA.extend({
|
|
390
|
+
event: SLACK_PROVIDER_FILE_CREATED_EVENT_SCHEMA,
|
|
391
|
+
userId: z.string(),
|
|
392
|
+
});
|
|
393
|
+
export const SLACK_FILE_SHARED_EVENT_SCHEMA = SLACK_FILE_EVENT_SCHEMA.extend({
|
|
394
|
+
channelId: z.string(),
|
|
395
|
+
event: SLACK_PROVIDER_FILE_SHARED_EVENT_SCHEMA,
|
|
396
|
+
userId: z.string(),
|
|
397
|
+
});
|
|
398
|
+
export const SLACK_FILE_DELETED_EVENT_SCHEMA = SLACK_FILE_EVENT_SCHEMA.extend({
|
|
399
|
+
event: SLACK_PROVIDER_FILE_DELETED_EVENT_SCHEMA,
|
|
400
|
+
});
|
|
401
|
+
export const SLACK_PIN_ADDED_EVENT_SCHEMA = SLACK_PIN_EVENT_SCHEMA.extend({
|
|
402
|
+
event: SLACK_PROVIDER_PIN_ADDED_EVENT_SCHEMA,
|
|
403
|
+
});
|
|
404
|
+
export const SLACK_PIN_REMOVED_EVENT_SCHEMA = SLACK_PIN_EVENT_SCHEMA.extend({
|
|
405
|
+
event: SLACK_PROVIDER_PIN_REMOVED_EVENT_SCHEMA,
|
|
406
|
+
hasPins: z.boolean().optional(),
|
|
407
|
+
});
|
|
408
|
+
export const SLACK_REACTION_ADDED_CALLBACK_EVENT_SCHEMA = SLACK_REACTION_CALLBACK_EVENT_SCHEMA.extend({
|
|
409
|
+
event: SLACK_PROVIDER_REACTION_ADDED_EVENT_SCHEMA,
|
|
410
|
+
});
|
|
411
|
+
export const SLACK_REACTION_REMOVED_CALLBACK_EVENT_SCHEMA = SLACK_REACTION_CALLBACK_EVENT_SCHEMA.extend({
|
|
412
|
+
event: SLACK_PROVIDER_REACTION_REMOVED_EVENT_SCHEMA,
|
|
413
|
+
});
|
|
414
|
+
export const SLACK_WORKSPACE_MEMBER_JOINED_EVENT_SCHEMA = SLACK_WORKSPACE_MEMBER_EVENT_SCHEMA.extend({
|
|
415
|
+
event: SLACK_PROVIDER_TEAM_JOIN_EVENT_SCHEMA,
|
|
416
|
+
});
|
|
417
|
+
export const SLACK_WORKSPACE_MEMBER_CHANGED_EVENT_SCHEMA = SLACK_WORKSPACE_MEMBER_EVENT_SCHEMA.extend({
|
|
418
|
+
event: SLACK_PROVIDER_USER_CHANGE_EVENT_SCHEMA,
|
|
419
|
+
});
|
|
420
|
+
/** Typed union emitted by the broad Slack event trigger. */
|
|
421
|
+
export const SLACK_EVENT_SCHEMA = z.union([
|
|
422
|
+
SLACK_APP_MENTION_CALLBACK_EVENT_SCHEMA,
|
|
423
|
+
SLACK_MESSAGE_POSTED_CALLBACK_EVENT_SCHEMA,
|
|
424
|
+
SLACK_THREAD_REPLY_POSTED_EVENT_SCHEMA,
|
|
425
|
+
SLACK_MESSAGE_CHANGED_EVENT_SCHEMA,
|
|
426
|
+
SLACK_MESSAGE_DELETED_EVENT_SCHEMA,
|
|
427
|
+
SLACK_REACTION_CALLBACK_EVENT_SCHEMA,
|
|
428
|
+
SLACK_CHANNEL_MEMBER_EVENT_SCHEMA,
|
|
429
|
+
SLACK_FILE_EVENT_SCHEMA,
|
|
430
|
+
SLACK_WORKSPACE_MEMBER_EVENT_SCHEMA,
|
|
431
|
+
SLACK_CHANNEL_EVENT_SCHEMA,
|
|
432
|
+
SLACK_PIN_EVENT_SCHEMA,
|
|
433
|
+
slackEventPayloadSchema,
|
|
434
|
+
]);
|
|
435
|
+
export const SLACK_RETRY_NUMBER_SCHEMA = z.coerce.number().int().min(1).max(3);
|
|
436
|
+
export const SLACK_RETRY_REASON_SCHEMA = z.enum([
|
|
437
|
+
"http_error",
|
|
438
|
+
"connection_failed",
|
|
439
|
+
"ssl_error",
|
|
440
|
+
"http_timeout",
|
|
441
|
+
"too_many_redirects",
|
|
442
|
+
"unknown_error",
|
|
443
|
+
]);
|
|
444
|
+
/**
|
|
445
|
+
* Parses retry metadata sent by Slack for a repeated Events API delivery.
|
|
446
|
+
*
|
|
447
|
+
* @param headers - Signed Slack request headers.
|
|
448
|
+
*/
|
|
449
|
+
export function parseSlackRetryHeaders(headers) {
|
|
450
|
+
const number = headers.get("x-slack-retry-num");
|
|
451
|
+
const reason = headers.get("x-slack-retry-reason");
|
|
452
|
+
if (number === null && reason === null)
|
|
453
|
+
return;
|
|
454
|
+
return {
|
|
455
|
+
number: SLACK_RETRY_NUMBER_SCHEMA.parse(number),
|
|
456
|
+
reason: SLACK_RETRY_REASON_SCHEMA.parse(reason),
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Converts one typed Slack callback into its broad and semantic events.
|
|
461
|
+
*
|
|
462
|
+
* @param input - Provider-native Events API callback envelope.
|
|
463
|
+
* @throws When the callback is not a supported Slack Events API envelope.
|
|
464
|
+
*/
|
|
465
|
+
export function normalizeSlackEventCallback(input) {
|
|
466
|
+
const envelope = SLACK_EVENT_CALLBACK_SCHEMA.parse(input);
|
|
467
|
+
const event = envelope.event;
|
|
468
|
+
const base = {
|
|
469
|
+
envelope,
|
|
470
|
+
event,
|
|
471
|
+
eventTimestamp: event.event_ts,
|
|
472
|
+
workspaceId: envelope.team_id,
|
|
473
|
+
};
|
|
474
|
+
switch (event.type) {
|
|
475
|
+
case "app_mention":
|
|
476
|
+
return {
|
|
477
|
+
eventTypes: ["slack.app.mentioned", "slack.event.received"],
|
|
478
|
+
payload: {
|
|
479
|
+
...base,
|
|
480
|
+
...toSlackMessage(event),
|
|
481
|
+
conversationId: event.channel,
|
|
482
|
+
conversationType: event.channel_type,
|
|
483
|
+
},
|
|
484
|
+
};
|
|
485
|
+
case "message": {
|
|
486
|
+
if (event.subtype === "message_changed") {
|
|
487
|
+
return {
|
|
488
|
+
eventTypes: [
|
|
489
|
+
"slack.message.changed",
|
|
490
|
+
"slack.event.received",
|
|
491
|
+
],
|
|
492
|
+
payload: {
|
|
493
|
+
...base,
|
|
494
|
+
conversationId: event.channel,
|
|
495
|
+
conversationType: event.channel_type,
|
|
496
|
+
message: event.message,
|
|
497
|
+
previousMessage: event.previous_message,
|
|
498
|
+
},
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
if (event.subtype === "message_deleted") {
|
|
502
|
+
return {
|
|
503
|
+
eventTypes: [
|
|
504
|
+
"slack.message.deleted",
|
|
505
|
+
"slack.event.received",
|
|
506
|
+
],
|
|
507
|
+
payload: {
|
|
508
|
+
...base,
|
|
509
|
+
conversationId: event.channel,
|
|
510
|
+
conversationType: event.channel_type,
|
|
511
|
+
deletedTimestamp: event.deleted_ts,
|
|
512
|
+
previousMessage: event.previous_message,
|
|
513
|
+
},
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
if (event.subtype !== undefined ||
|
|
517
|
+
event.hidden === true ||
|
|
518
|
+
event.bot_id !== undefined ||
|
|
519
|
+
event.app_id !== undefined ||
|
|
520
|
+
event.user === undefined) {
|
|
521
|
+
return {
|
|
522
|
+
eventTypes: ["slack.event.received"],
|
|
523
|
+
payload: base,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
const message = {
|
|
527
|
+
...base,
|
|
528
|
+
...toSlackMessage(event),
|
|
529
|
+
conversationId: event.channel,
|
|
530
|
+
conversationType: event.channel_type,
|
|
531
|
+
};
|
|
532
|
+
return event.thread_ts && event.thread_ts !== event.ts
|
|
533
|
+
? {
|
|
534
|
+
eventTypes: [
|
|
535
|
+
"slack.thread.reply.posted",
|
|
536
|
+
"slack.event.received",
|
|
537
|
+
],
|
|
538
|
+
payload: message,
|
|
539
|
+
}
|
|
540
|
+
: {
|
|
541
|
+
eventTypes: [
|
|
542
|
+
"slack.message.posted",
|
|
543
|
+
"slack.event.received",
|
|
544
|
+
],
|
|
545
|
+
payload: { ...message, threadTimestamp: undefined },
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
case "reaction_added":
|
|
549
|
+
case "reaction_removed": {
|
|
550
|
+
const reactionEvent = z
|
|
551
|
+
.union([
|
|
552
|
+
SLACK_PROVIDER_REACTION_ADDED_EVENT_SCHEMA,
|
|
553
|
+
SLACK_PROVIDER_REACTION_REMOVED_EVENT_SCHEMA,
|
|
554
|
+
])
|
|
555
|
+
.parse(event);
|
|
556
|
+
return {
|
|
557
|
+
eventTypes: [
|
|
558
|
+
reactionEvent.type === "reaction_added"
|
|
559
|
+
? "slack.reaction.added"
|
|
560
|
+
: "slack.reaction.removed",
|
|
561
|
+
"slack.reaction.event",
|
|
562
|
+
"slack.event.received",
|
|
563
|
+
],
|
|
564
|
+
payload: {
|
|
565
|
+
...base,
|
|
566
|
+
item: normalizeReactionItem(reactionEvent.item),
|
|
567
|
+
itemUserId: reactionEvent.item_user,
|
|
568
|
+
reaction: reactionEvent.reaction,
|
|
569
|
+
userId: reactionEvent.user,
|
|
570
|
+
},
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
case "member_joined_channel":
|
|
574
|
+
case "member_left_channel":
|
|
575
|
+
return {
|
|
576
|
+
eventTypes: [
|
|
577
|
+
event.type === "member_joined_channel"
|
|
578
|
+
? "slack.channel.member.joined"
|
|
579
|
+
: "slack.channel.member.left",
|
|
580
|
+
"slack.event.received",
|
|
581
|
+
],
|
|
582
|
+
payload: {
|
|
583
|
+
...base,
|
|
584
|
+
conversationId: event.channel,
|
|
585
|
+
conversationTypeCode: event.channel_type,
|
|
586
|
+
enterpriseId: "enterprise" in event ? event.enterprise : undefined,
|
|
587
|
+
inviterId: "inviter" in event ? event.inviter : undefined,
|
|
588
|
+
userId: event.user,
|
|
589
|
+
},
|
|
590
|
+
};
|
|
591
|
+
case "file_created":
|
|
592
|
+
case "file_shared":
|
|
593
|
+
case "file_deleted":
|
|
594
|
+
return {
|
|
595
|
+
eventTypes: [
|
|
596
|
+
event.type === "file_created"
|
|
597
|
+
? "slack.file.created"
|
|
598
|
+
: event.type === "file_shared"
|
|
599
|
+
? "slack.file.shared"
|
|
600
|
+
: "slack.file.deleted",
|
|
601
|
+
"slack.event.received",
|
|
602
|
+
],
|
|
603
|
+
payload: {
|
|
604
|
+
...base,
|
|
605
|
+
channelId: "channel_id" in event ? event.channel_id : undefined,
|
|
606
|
+
fileId: event.file_id,
|
|
607
|
+
userId: "user_id" in event ? event.user_id : undefined,
|
|
608
|
+
},
|
|
609
|
+
};
|
|
610
|
+
case "team_join":
|
|
611
|
+
case "user_change": {
|
|
612
|
+
const memberEvent = z
|
|
613
|
+
.union([
|
|
614
|
+
SLACK_PROVIDER_TEAM_JOIN_EVENT_SCHEMA,
|
|
615
|
+
SLACK_PROVIDER_USER_CHANGE_EVENT_SCHEMA,
|
|
616
|
+
])
|
|
617
|
+
.parse(event);
|
|
618
|
+
return {
|
|
619
|
+
eventTypes: [
|
|
620
|
+
memberEvent.type === "team_join"
|
|
621
|
+
? "slack.workspace.member.joined"
|
|
622
|
+
: "slack.workspace.member.changed",
|
|
623
|
+
"slack.event.received",
|
|
624
|
+
],
|
|
625
|
+
payload: { ...base, member: toSlackMember(memberEvent.user) },
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
case "channel_created":
|
|
629
|
+
case "channel_rename": {
|
|
630
|
+
const channelEvent = z
|
|
631
|
+
.union([
|
|
632
|
+
SLACK_PROVIDER_CHANNEL_CREATED_EVENT_SCHEMA,
|
|
633
|
+
SLACK_PROVIDER_CHANNEL_RENAME_EVENT_SCHEMA,
|
|
634
|
+
])
|
|
635
|
+
.parse(event);
|
|
636
|
+
return {
|
|
637
|
+
eventTypes: [
|
|
638
|
+
channelEvent.type === "channel_created"
|
|
639
|
+
? "slack.channel.created"
|
|
640
|
+
: "slack.channel.renamed",
|
|
641
|
+
"slack.event.received",
|
|
642
|
+
],
|
|
643
|
+
payload: {
|
|
644
|
+
...base,
|
|
645
|
+
channelId: channelEvent.channel.id,
|
|
646
|
+
createdAt: channelEvent.channel.created,
|
|
647
|
+
creatorId: "creator" in channelEvent.channel
|
|
648
|
+
? channelEvent.channel.creator
|
|
649
|
+
: undefined,
|
|
650
|
+
name: channelEvent.channel.name,
|
|
651
|
+
},
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
case "channel_shared":
|
|
655
|
+
case "channel_unshared":
|
|
656
|
+
return {
|
|
657
|
+
eventTypes: [
|
|
658
|
+
event.type === "channel_shared"
|
|
659
|
+
? "slack.channel.shared"
|
|
660
|
+
: "slack.channel.unshared",
|
|
661
|
+
"slack.event.received",
|
|
662
|
+
],
|
|
663
|
+
payload: {
|
|
664
|
+
...base,
|
|
665
|
+
channelId: event.channel,
|
|
666
|
+
connectedWorkspaceId: "connected_team_id" in event ? event.connected_team_id : undefined,
|
|
667
|
+
isExternallyShared: "is_ext_shared" in event ? event.is_ext_shared : undefined,
|
|
668
|
+
previouslyConnectedWorkspaceId: "previously_connected_team_id" in event
|
|
669
|
+
? event.previously_connected_team_id
|
|
670
|
+
: undefined,
|
|
671
|
+
},
|
|
672
|
+
};
|
|
673
|
+
case "pin_added":
|
|
674
|
+
case "pin_removed":
|
|
675
|
+
return {
|
|
676
|
+
eventTypes: [
|
|
677
|
+
event.type === "pin_added" ? "slack.pin.added" : "slack.pin.removed",
|
|
678
|
+
"slack.event.received",
|
|
679
|
+
],
|
|
680
|
+
payload: {
|
|
681
|
+
...base,
|
|
682
|
+
conversationId: event.channel_id,
|
|
683
|
+
hasPins: "has_pins" in event ? event.has_pins : undefined,
|
|
684
|
+
item: event.item,
|
|
685
|
+
userId: event.user,
|
|
686
|
+
},
|
|
687
|
+
};
|
|
688
|
+
}
|
|
689
|
+
throw new Error("Unsupported Slack event type.");
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Maps a provider-native reaction target to the public discriminated union.
|
|
693
|
+
*
|
|
694
|
+
* @param item - Provider-native reaction target.
|
|
695
|
+
*/
|
|
696
|
+
function normalizeReactionItem(item) {
|
|
697
|
+
switch (item.type) {
|
|
698
|
+
case "message":
|
|
699
|
+
return {
|
|
700
|
+
conversationId: item.channel,
|
|
701
|
+
conversationType: item.channel_type,
|
|
702
|
+
messageTimestamp: item.ts,
|
|
703
|
+
type: "message",
|
|
704
|
+
};
|
|
705
|
+
case "file":
|
|
706
|
+
return { fileId: item.file, type: "file" };
|
|
707
|
+
case "file_comment":
|
|
708
|
+
return {
|
|
709
|
+
fileCommentId: item.file_comment,
|
|
710
|
+
fileId: item.file,
|
|
711
|
+
type: "fileComment",
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
}
|