airbyte-agent-slack 0.1.6__py3-none-any.whl → 0.1.9__py3-none-any.whl

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.
@@ -27,7 +27,7 @@ from uuid import (
27
27
  SlackConnectorModel: ConnectorModel = ConnectorModel(
28
28
  id=UUID('c2281cee-86f9-4a86-bb48-d23286b4c7bd'),
29
29
  name='slack',
30
- version='0.1.1',
30
+ version='0.1.3',
31
31
  base_url='https://slack.com/api',
32
32
  auth=AuthConfig(
33
33
  options=[
@@ -47,6 +47,7 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
47
47
  ),
48
48
  },
49
49
  auth_mapping={'token': '${access_token}'},
50
+ replication_auth_key_mapping={'credentials.api_token': 'access_token'},
50
51
  ),
51
52
  ),
52
53
  AuthOption(
@@ -82,7 +83,7 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
82
83
  'client_secret': '${client_secret}',
83
84
  'access_token': '${access_token}',
84
85
  },
85
- replication_auth_key_mapping={'client_id': 'client_id', 'client_secret': 'client_secret'},
86
+ replication_auth_key_mapping={'credentials.client_id': 'client_id', 'credentials.client_secret': 'client_secret'},
86
87
  ),
87
88
  ),
88
89
  ],
@@ -599,7 +600,12 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
599
600
  EntityDefinition(
600
601
  name='channels',
601
602
  stream_name='channels',
602
- actions=[Action.LIST, Action.GET],
603
+ actions=[
604
+ Action.LIST,
605
+ Action.GET,
606
+ Action.CREATE,
607
+ Action.UPDATE,
608
+ ],
603
609
  endpoints={
604
610
  Action.LIST: EndpointDefinition(
605
611
  method='GET',
@@ -1017,265 +1023,1143 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
1017
1023
  },
1018
1024
  record_extractor='$.channel',
1019
1025
  ),
1020
- },
1021
- entity_schema={
1022
- 'type': 'object',
1023
- 'description': 'Slack channel object',
1024
- 'properties': {
1025
- 'id': {'type': 'string', 'description': 'Unique channel identifier'},
1026
- 'name': {
1027
- 'type': ['string', 'null'],
1028
- 'description': 'Channel name',
1029
- },
1030
- 'is_channel': {
1031
- 'type': ['boolean', 'null'],
1032
- 'description': 'Whether this is a channel',
1033
- },
1034
- 'is_group': {
1035
- 'type': ['boolean', 'null'],
1036
- 'description': 'Whether this is a group',
1037
- },
1038
- 'is_im': {
1039
- 'type': ['boolean', 'null'],
1040
- 'description': 'Whether this is a direct message',
1041
- },
1042
- 'is_mpim': {
1043
- 'type': ['boolean', 'null'],
1044
- 'description': 'Whether this is a multi-party direct message',
1045
- },
1046
- 'is_private': {
1047
- 'type': ['boolean', 'null'],
1048
- 'description': 'Whether the channel is private',
1049
- },
1050
- 'created': {
1051
- 'type': ['integer', 'null'],
1052
- 'description': 'Unix timestamp of channel creation',
1053
- },
1054
- 'is_archived': {
1055
- 'type': ['boolean', 'null'],
1056
- 'description': 'Whether the channel is archived',
1057
- },
1058
- 'is_general': {
1059
- 'type': ['boolean', 'null'],
1060
- 'description': 'Whether this is the general channel',
1061
- },
1062
- 'unlinked': {
1063
- 'type': ['integer', 'null'],
1064
- 'description': 'Unlinked timestamp',
1065
- },
1066
- 'name_normalized': {
1067
- 'type': ['string', 'null'],
1068
- 'description': 'Normalized channel name',
1069
- },
1070
- 'is_shared': {
1071
- 'type': ['boolean', 'null'],
1072
- 'description': 'Whether the channel is shared',
1073
- },
1074
- 'is_org_shared': {
1075
- 'type': ['boolean', 'null'],
1076
- 'description': 'Whether the channel is shared across the organization',
1077
- },
1078
- 'is_pending_ext_shared': {
1079
- 'type': ['boolean', 'null'],
1080
- 'description': 'Whether external sharing is pending',
1081
- },
1082
- 'pending_shared': {
1083
- 'type': ['array', 'null'],
1084
- 'items': {'type': 'string'},
1085
- 'description': 'Pending shared teams',
1086
- },
1087
- 'context_team_id': {
1088
- 'type': ['string', 'null'],
1089
- 'description': 'Context team ID',
1090
- },
1091
- 'updated': {
1092
- 'type': ['integer', 'null'],
1093
- 'description': 'Unix timestamp of last update',
1094
- },
1095
- 'creator': {
1096
- 'type': ['string', 'null'],
1097
- 'description': 'User ID of the channel creator',
1098
- },
1099
- 'is_ext_shared': {
1100
- 'type': ['boolean', 'null'],
1101
- 'description': 'Whether the channel is externally shared',
1102
- },
1103
- 'shared_team_ids': {
1104
- 'type': ['array', 'null'],
1105
- 'items': {'type': 'string'},
1106
- 'description': 'IDs of teams the channel is shared with',
1107
- },
1108
- 'pending_connected_team_ids': {
1109
- 'type': ['array', 'null'],
1110
- 'items': {'type': 'string'},
1111
- 'description': 'IDs of teams with pending connection',
1112
- },
1113
- 'is_member': {
1114
- 'type': ['boolean', 'null'],
1115
- 'description': 'Whether the authenticated user is a member',
1116
- },
1117
- 'topic': {
1118
- 'oneOf': [
1119
- {'$ref': '#/components/schemas/ChannelTopic'},
1120
- {'type': 'null'},
1121
- ],
1122
- 'description': 'Channel topic',
1123
- },
1124
- 'purpose': {
1125
- 'oneOf': [
1126
- {'$ref': '#/components/schemas/ChannelPurpose'},
1127
- {'type': 'null'},
1128
- ],
1129
- 'description': 'Channel purpose',
1130
- },
1131
- 'previous_names': {
1132
- 'type': ['array', 'null'],
1133
- 'items': {'type': 'string'},
1134
- 'description': 'Previous channel names',
1135
- },
1136
- 'num_members': {
1137
- 'type': ['integer', 'null'],
1138
- 'description': 'Number of members in the channel',
1139
- },
1140
- 'parent_conversation': {
1141
- 'type': ['string', 'null'],
1142
- 'description': 'Parent conversation ID if this is a thread',
1143
- },
1144
- 'properties': {
1145
- 'type': ['object', 'null'],
1146
- 'description': 'Additional channel properties',
1147
- },
1148
- 'is_thread_only': {
1149
- 'type': ['boolean', 'null'],
1150
- 'description': 'Whether the channel is thread-only',
1151
- },
1152
- 'is_read_only': {
1153
- 'type': ['boolean', 'null'],
1154
- 'description': 'Whether the channel is read-only',
1155
- },
1156
- },
1157
- 'x-airbyte-entity-name': 'channels',
1158
- 'x-airbyte-stream-name': 'channels',
1159
- },
1160
- ),
1161
- EntityDefinition(
1162
- name='channel_messages',
1163
- stream_name='channel_messages',
1164
- actions=[Action.LIST],
1165
- endpoints={
1166
- Action.LIST: EndpointDefinition(
1167
- method='GET',
1168
- path='/conversations.history',
1169
- action=Action.LIST,
1170
- description='Returns messages from a channel',
1171
- query_params=[
1172
- 'channel',
1173
- 'cursor',
1174
- 'limit',
1175
- 'oldest',
1176
- 'latest',
1177
- 'inclusive',
1178
- ],
1179
- query_params_schema={
1180
- 'channel': {'type': 'string', 'required': True},
1181
- 'cursor': {'type': 'string', 'required': False},
1182
- 'limit': {
1183
- 'type': 'integer',
1184
- 'required': False,
1185
- 'default': 100,
1186
- },
1187
- 'oldest': {'type': 'string', 'required': False},
1188
- 'latest': {'type': 'string', 'required': False},
1189
- 'inclusive': {
1190
- 'type': 'boolean',
1191
- 'required': False,
1192
- 'default': False,
1026
+ Action.CREATE: EndpointDefinition(
1027
+ method='POST',
1028
+ path='/conversations.create',
1029
+ action=Action.CREATE,
1030
+ description='Creates a new public or private channel',
1031
+ body_fields=['name', 'is_private'],
1032
+ request_schema={
1033
+ 'type': 'object',
1034
+ 'description': 'Parameters for creating a channel',
1035
+ 'properties': {
1036
+ 'name': {'type': 'string', 'description': 'Channel name (lowercase, no spaces, max 80 chars)'},
1037
+ 'is_private': {'type': 'boolean', 'description': 'Create a private channel instead of public'},
1193
1038
  },
1039
+ 'required': ['name'],
1194
1040
  },
1195
1041
  response_schema={
1196
1042
  'type': 'object',
1197
- 'description': 'Response containing list of messages',
1043
+ 'description': 'Response from creating a channel',
1198
1044
  'properties': {
1199
1045
  'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
1200
- 'messages': {
1201
- 'type': 'array',
1202
- 'items': {
1203
- 'type': 'object',
1204
- 'description': 'Slack message object',
1205
- 'properties': {
1206
- 'type': {
1207
- 'type': ['string', 'null'],
1208
- 'description': 'Message type',
1209
- },
1210
- 'subtype': {
1211
- 'type': ['string', 'null'],
1212
- 'description': 'Message subtype',
1213
- },
1214
- 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
1215
- 'user': {
1216
- 'type': ['string', 'null'],
1217
- 'description': 'User ID who sent the message',
1218
- },
1219
- 'text': {
1220
- 'type': ['string', 'null'],
1221
- 'description': 'Message text content',
1222
- },
1223
- 'thread_ts': {
1224
- 'type': ['string', 'null'],
1225
- 'description': 'Thread parent timestamp',
1226
- },
1227
- 'reply_count': {
1228
- 'type': ['integer', 'null'],
1229
- 'description': 'Number of replies in thread',
1230
- },
1231
- 'reply_users_count': {
1232
- 'type': ['integer', 'null'],
1233
- 'description': 'Number of unique users who replied',
1234
- },
1235
- 'latest_reply': {
1236
- 'type': ['string', 'null'],
1237
- 'description': 'Timestamp of latest reply',
1238
- },
1239
- 'reply_users': {
1240
- 'type': ['array', 'null'],
1241
- 'items': {'type': 'string'},
1242
- 'description': 'User IDs who replied to the thread',
1243
- },
1244
- 'is_locked': {
1245
- 'type': ['boolean', 'null'],
1246
- 'description': 'Whether the thread is locked',
1247
- },
1248
- 'subscribed': {
1249
- 'type': ['boolean', 'null'],
1250
- 'description': 'Whether the user is subscribed to the thread',
1251
- },
1252
- 'reactions': {
1253
- 'type': ['array', 'null'],
1254
- 'items': {
1255
- 'type': 'object',
1256
- 'description': 'Message reaction',
1257
- 'properties': {
1258
- 'name': {
1259
- 'type': ['string', 'null'],
1260
- 'description': 'Reaction emoji name',
1261
- },
1262
- 'users': {
1263
- 'type': ['array', 'null'],
1264
- 'items': {'type': 'string'},
1265
- 'description': 'User IDs who reacted',
1266
- },
1267
- 'count': {
1268
- 'type': ['integer', 'null'],
1269
- 'description': 'Number of reactions',
1270
- },
1271
- },
1272
- },
1273
- 'description': 'Reactions to the message',
1274
- },
1275
- 'attachments': {
1276
- 'type': ['array', 'null'],
1277
- 'items': {
1278
- 'type': 'object',
1046
+ 'channel': {
1047
+ 'type': 'object',
1048
+ 'description': 'Slack channel object',
1049
+ 'properties': {
1050
+ 'id': {'type': 'string', 'description': 'Unique channel identifier'},
1051
+ 'name': {
1052
+ 'type': ['string', 'null'],
1053
+ 'description': 'Channel name',
1054
+ },
1055
+ 'is_channel': {
1056
+ 'type': ['boolean', 'null'],
1057
+ 'description': 'Whether this is a channel',
1058
+ },
1059
+ 'is_group': {
1060
+ 'type': ['boolean', 'null'],
1061
+ 'description': 'Whether this is a group',
1062
+ },
1063
+ 'is_im': {
1064
+ 'type': ['boolean', 'null'],
1065
+ 'description': 'Whether this is a direct message',
1066
+ },
1067
+ 'is_mpim': {
1068
+ 'type': ['boolean', 'null'],
1069
+ 'description': 'Whether this is a multi-party direct message',
1070
+ },
1071
+ 'is_private': {
1072
+ 'type': ['boolean', 'null'],
1073
+ 'description': 'Whether the channel is private',
1074
+ },
1075
+ 'created': {
1076
+ 'type': ['integer', 'null'],
1077
+ 'description': 'Unix timestamp of channel creation',
1078
+ },
1079
+ 'is_archived': {
1080
+ 'type': ['boolean', 'null'],
1081
+ 'description': 'Whether the channel is archived',
1082
+ },
1083
+ 'is_general': {
1084
+ 'type': ['boolean', 'null'],
1085
+ 'description': 'Whether this is the general channel',
1086
+ },
1087
+ 'unlinked': {
1088
+ 'type': ['integer', 'null'],
1089
+ 'description': 'Unlinked timestamp',
1090
+ },
1091
+ 'name_normalized': {
1092
+ 'type': ['string', 'null'],
1093
+ 'description': 'Normalized channel name',
1094
+ },
1095
+ 'is_shared': {
1096
+ 'type': ['boolean', 'null'],
1097
+ 'description': 'Whether the channel is shared',
1098
+ },
1099
+ 'is_org_shared': {
1100
+ 'type': ['boolean', 'null'],
1101
+ 'description': 'Whether the channel is shared across the organization',
1102
+ },
1103
+ 'is_pending_ext_shared': {
1104
+ 'type': ['boolean', 'null'],
1105
+ 'description': 'Whether external sharing is pending',
1106
+ },
1107
+ 'pending_shared': {
1108
+ 'type': ['array', 'null'],
1109
+ 'items': {'type': 'string'},
1110
+ 'description': 'Pending shared teams',
1111
+ },
1112
+ 'context_team_id': {
1113
+ 'type': ['string', 'null'],
1114
+ 'description': 'Context team ID',
1115
+ },
1116
+ 'updated': {
1117
+ 'type': ['integer', 'null'],
1118
+ 'description': 'Unix timestamp of last update',
1119
+ },
1120
+ 'creator': {
1121
+ 'type': ['string', 'null'],
1122
+ 'description': 'User ID of the channel creator',
1123
+ },
1124
+ 'is_ext_shared': {
1125
+ 'type': ['boolean', 'null'],
1126
+ 'description': 'Whether the channel is externally shared',
1127
+ },
1128
+ 'shared_team_ids': {
1129
+ 'type': ['array', 'null'],
1130
+ 'items': {'type': 'string'},
1131
+ 'description': 'IDs of teams the channel is shared with',
1132
+ },
1133
+ 'pending_connected_team_ids': {
1134
+ 'type': ['array', 'null'],
1135
+ 'items': {'type': 'string'},
1136
+ 'description': 'IDs of teams with pending connection',
1137
+ },
1138
+ 'is_member': {
1139
+ 'type': ['boolean', 'null'],
1140
+ 'description': 'Whether the authenticated user is a member',
1141
+ },
1142
+ 'topic': {
1143
+ 'oneOf': [
1144
+ {
1145
+ 'type': 'object',
1146
+ 'description': 'Channel topic information',
1147
+ 'properties': {
1148
+ 'value': {
1149
+ 'type': ['string', 'null'],
1150
+ 'description': 'Topic text',
1151
+ },
1152
+ 'creator': {
1153
+ 'type': ['string', 'null'],
1154
+ 'description': 'User ID who set the topic',
1155
+ },
1156
+ 'last_set': {
1157
+ 'type': ['integer', 'null'],
1158
+ 'description': 'Unix timestamp when topic was last set',
1159
+ },
1160
+ },
1161
+ },
1162
+ {'type': 'null'},
1163
+ ],
1164
+ 'description': 'Channel topic',
1165
+ },
1166
+ 'purpose': {
1167
+ 'oneOf': [
1168
+ {
1169
+ 'type': 'object',
1170
+ 'description': 'Channel purpose information',
1171
+ 'properties': {
1172
+ 'value': {
1173
+ 'type': ['string', 'null'],
1174
+ 'description': 'Purpose text',
1175
+ },
1176
+ 'creator': {
1177
+ 'type': ['string', 'null'],
1178
+ 'description': 'User ID who set the purpose',
1179
+ },
1180
+ 'last_set': {
1181
+ 'type': ['integer', 'null'],
1182
+ 'description': 'Unix timestamp when purpose was last set',
1183
+ },
1184
+ },
1185
+ },
1186
+ {'type': 'null'},
1187
+ ],
1188
+ 'description': 'Channel purpose',
1189
+ },
1190
+ 'previous_names': {
1191
+ 'type': ['array', 'null'],
1192
+ 'items': {'type': 'string'},
1193
+ 'description': 'Previous channel names',
1194
+ },
1195
+ 'num_members': {
1196
+ 'type': ['integer', 'null'],
1197
+ 'description': 'Number of members in the channel',
1198
+ },
1199
+ 'parent_conversation': {
1200
+ 'type': ['string', 'null'],
1201
+ 'description': 'Parent conversation ID if this is a thread',
1202
+ },
1203
+ 'properties': {
1204
+ 'type': ['object', 'null'],
1205
+ 'description': 'Additional channel properties',
1206
+ },
1207
+ 'is_thread_only': {
1208
+ 'type': ['boolean', 'null'],
1209
+ 'description': 'Whether the channel is thread-only',
1210
+ },
1211
+ 'is_read_only': {
1212
+ 'type': ['boolean', 'null'],
1213
+ 'description': 'Whether the channel is read-only',
1214
+ },
1215
+ },
1216
+ 'x-airbyte-entity-name': 'channels',
1217
+ 'x-airbyte-stream-name': 'channels',
1218
+ },
1219
+ },
1220
+ },
1221
+ record_extractor='$.channel',
1222
+ ),
1223
+ Action.UPDATE: EndpointDefinition(
1224
+ method='POST',
1225
+ path='/conversations.rename',
1226
+ action=Action.UPDATE,
1227
+ description='Renames an existing channel',
1228
+ body_fields=['channel', 'name'],
1229
+ request_schema={
1230
+ 'type': 'object',
1231
+ 'description': 'Parameters for renaming a channel',
1232
+ 'properties': {
1233
+ 'channel': {'type': 'string', 'description': 'Channel ID to rename'},
1234
+ 'name': {'type': 'string', 'description': 'New channel name (lowercase, no spaces, max 80 chars)'},
1235
+ },
1236
+ 'required': ['channel', 'name'],
1237
+ },
1238
+ response_schema={
1239
+ 'type': 'object',
1240
+ 'description': 'Response from renaming a channel',
1241
+ 'properties': {
1242
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
1243
+ 'channel': {
1244
+ 'type': 'object',
1245
+ 'description': 'Slack channel object',
1246
+ 'properties': {
1247
+ 'id': {'type': 'string', 'description': 'Unique channel identifier'},
1248
+ 'name': {
1249
+ 'type': ['string', 'null'],
1250
+ 'description': 'Channel name',
1251
+ },
1252
+ 'is_channel': {
1253
+ 'type': ['boolean', 'null'],
1254
+ 'description': 'Whether this is a channel',
1255
+ },
1256
+ 'is_group': {
1257
+ 'type': ['boolean', 'null'],
1258
+ 'description': 'Whether this is a group',
1259
+ },
1260
+ 'is_im': {
1261
+ 'type': ['boolean', 'null'],
1262
+ 'description': 'Whether this is a direct message',
1263
+ },
1264
+ 'is_mpim': {
1265
+ 'type': ['boolean', 'null'],
1266
+ 'description': 'Whether this is a multi-party direct message',
1267
+ },
1268
+ 'is_private': {
1269
+ 'type': ['boolean', 'null'],
1270
+ 'description': 'Whether the channel is private',
1271
+ },
1272
+ 'created': {
1273
+ 'type': ['integer', 'null'],
1274
+ 'description': 'Unix timestamp of channel creation',
1275
+ },
1276
+ 'is_archived': {
1277
+ 'type': ['boolean', 'null'],
1278
+ 'description': 'Whether the channel is archived',
1279
+ },
1280
+ 'is_general': {
1281
+ 'type': ['boolean', 'null'],
1282
+ 'description': 'Whether this is the general channel',
1283
+ },
1284
+ 'unlinked': {
1285
+ 'type': ['integer', 'null'],
1286
+ 'description': 'Unlinked timestamp',
1287
+ },
1288
+ 'name_normalized': {
1289
+ 'type': ['string', 'null'],
1290
+ 'description': 'Normalized channel name',
1291
+ },
1292
+ 'is_shared': {
1293
+ 'type': ['boolean', 'null'],
1294
+ 'description': 'Whether the channel is shared',
1295
+ },
1296
+ 'is_org_shared': {
1297
+ 'type': ['boolean', 'null'],
1298
+ 'description': 'Whether the channel is shared across the organization',
1299
+ },
1300
+ 'is_pending_ext_shared': {
1301
+ 'type': ['boolean', 'null'],
1302
+ 'description': 'Whether external sharing is pending',
1303
+ },
1304
+ 'pending_shared': {
1305
+ 'type': ['array', 'null'],
1306
+ 'items': {'type': 'string'},
1307
+ 'description': 'Pending shared teams',
1308
+ },
1309
+ 'context_team_id': {
1310
+ 'type': ['string', 'null'],
1311
+ 'description': 'Context team ID',
1312
+ },
1313
+ 'updated': {
1314
+ 'type': ['integer', 'null'],
1315
+ 'description': 'Unix timestamp of last update',
1316
+ },
1317
+ 'creator': {
1318
+ 'type': ['string', 'null'],
1319
+ 'description': 'User ID of the channel creator',
1320
+ },
1321
+ 'is_ext_shared': {
1322
+ 'type': ['boolean', 'null'],
1323
+ 'description': 'Whether the channel is externally shared',
1324
+ },
1325
+ 'shared_team_ids': {
1326
+ 'type': ['array', 'null'],
1327
+ 'items': {'type': 'string'},
1328
+ 'description': 'IDs of teams the channel is shared with',
1329
+ },
1330
+ 'pending_connected_team_ids': {
1331
+ 'type': ['array', 'null'],
1332
+ 'items': {'type': 'string'},
1333
+ 'description': 'IDs of teams with pending connection',
1334
+ },
1335
+ 'is_member': {
1336
+ 'type': ['boolean', 'null'],
1337
+ 'description': 'Whether the authenticated user is a member',
1338
+ },
1339
+ 'topic': {
1340
+ 'oneOf': [
1341
+ {
1342
+ 'type': 'object',
1343
+ 'description': 'Channel topic information',
1344
+ 'properties': {
1345
+ 'value': {
1346
+ 'type': ['string', 'null'],
1347
+ 'description': 'Topic text',
1348
+ },
1349
+ 'creator': {
1350
+ 'type': ['string', 'null'],
1351
+ 'description': 'User ID who set the topic',
1352
+ },
1353
+ 'last_set': {
1354
+ 'type': ['integer', 'null'],
1355
+ 'description': 'Unix timestamp when topic was last set',
1356
+ },
1357
+ },
1358
+ },
1359
+ {'type': 'null'},
1360
+ ],
1361
+ 'description': 'Channel topic',
1362
+ },
1363
+ 'purpose': {
1364
+ 'oneOf': [
1365
+ {
1366
+ 'type': 'object',
1367
+ 'description': 'Channel purpose information',
1368
+ 'properties': {
1369
+ 'value': {
1370
+ 'type': ['string', 'null'],
1371
+ 'description': 'Purpose text',
1372
+ },
1373
+ 'creator': {
1374
+ 'type': ['string', 'null'],
1375
+ 'description': 'User ID who set the purpose',
1376
+ },
1377
+ 'last_set': {
1378
+ 'type': ['integer', 'null'],
1379
+ 'description': 'Unix timestamp when purpose was last set',
1380
+ },
1381
+ },
1382
+ },
1383
+ {'type': 'null'},
1384
+ ],
1385
+ 'description': 'Channel purpose',
1386
+ },
1387
+ 'previous_names': {
1388
+ 'type': ['array', 'null'],
1389
+ 'items': {'type': 'string'},
1390
+ 'description': 'Previous channel names',
1391
+ },
1392
+ 'num_members': {
1393
+ 'type': ['integer', 'null'],
1394
+ 'description': 'Number of members in the channel',
1395
+ },
1396
+ 'parent_conversation': {
1397
+ 'type': ['string', 'null'],
1398
+ 'description': 'Parent conversation ID if this is a thread',
1399
+ },
1400
+ 'properties': {
1401
+ 'type': ['object', 'null'],
1402
+ 'description': 'Additional channel properties',
1403
+ },
1404
+ 'is_thread_only': {
1405
+ 'type': ['boolean', 'null'],
1406
+ 'description': 'Whether the channel is thread-only',
1407
+ },
1408
+ 'is_read_only': {
1409
+ 'type': ['boolean', 'null'],
1410
+ 'description': 'Whether the channel is read-only',
1411
+ },
1412
+ },
1413
+ 'x-airbyte-entity-name': 'channels',
1414
+ 'x-airbyte-stream-name': 'channels',
1415
+ },
1416
+ },
1417
+ },
1418
+ record_extractor='$.channel',
1419
+ ),
1420
+ },
1421
+ entity_schema={
1422
+ 'type': 'object',
1423
+ 'description': 'Slack channel object',
1424
+ 'properties': {
1425
+ 'id': {'type': 'string', 'description': 'Unique channel identifier'},
1426
+ 'name': {
1427
+ 'type': ['string', 'null'],
1428
+ 'description': 'Channel name',
1429
+ },
1430
+ 'is_channel': {
1431
+ 'type': ['boolean', 'null'],
1432
+ 'description': 'Whether this is a channel',
1433
+ },
1434
+ 'is_group': {
1435
+ 'type': ['boolean', 'null'],
1436
+ 'description': 'Whether this is a group',
1437
+ },
1438
+ 'is_im': {
1439
+ 'type': ['boolean', 'null'],
1440
+ 'description': 'Whether this is a direct message',
1441
+ },
1442
+ 'is_mpim': {
1443
+ 'type': ['boolean', 'null'],
1444
+ 'description': 'Whether this is a multi-party direct message',
1445
+ },
1446
+ 'is_private': {
1447
+ 'type': ['boolean', 'null'],
1448
+ 'description': 'Whether the channel is private',
1449
+ },
1450
+ 'created': {
1451
+ 'type': ['integer', 'null'],
1452
+ 'description': 'Unix timestamp of channel creation',
1453
+ },
1454
+ 'is_archived': {
1455
+ 'type': ['boolean', 'null'],
1456
+ 'description': 'Whether the channel is archived',
1457
+ },
1458
+ 'is_general': {
1459
+ 'type': ['boolean', 'null'],
1460
+ 'description': 'Whether this is the general channel',
1461
+ },
1462
+ 'unlinked': {
1463
+ 'type': ['integer', 'null'],
1464
+ 'description': 'Unlinked timestamp',
1465
+ },
1466
+ 'name_normalized': {
1467
+ 'type': ['string', 'null'],
1468
+ 'description': 'Normalized channel name',
1469
+ },
1470
+ 'is_shared': {
1471
+ 'type': ['boolean', 'null'],
1472
+ 'description': 'Whether the channel is shared',
1473
+ },
1474
+ 'is_org_shared': {
1475
+ 'type': ['boolean', 'null'],
1476
+ 'description': 'Whether the channel is shared across the organization',
1477
+ },
1478
+ 'is_pending_ext_shared': {
1479
+ 'type': ['boolean', 'null'],
1480
+ 'description': 'Whether external sharing is pending',
1481
+ },
1482
+ 'pending_shared': {
1483
+ 'type': ['array', 'null'],
1484
+ 'items': {'type': 'string'},
1485
+ 'description': 'Pending shared teams',
1486
+ },
1487
+ 'context_team_id': {
1488
+ 'type': ['string', 'null'],
1489
+ 'description': 'Context team ID',
1490
+ },
1491
+ 'updated': {
1492
+ 'type': ['integer', 'null'],
1493
+ 'description': 'Unix timestamp of last update',
1494
+ },
1495
+ 'creator': {
1496
+ 'type': ['string', 'null'],
1497
+ 'description': 'User ID of the channel creator',
1498
+ },
1499
+ 'is_ext_shared': {
1500
+ 'type': ['boolean', 'null'],
1501
+ 'description': 'Whether the channel is externally shared',
1502
+ },
1503
+ 'shared_team_ids': {
1504
+ 'type': ['array', 'null'],
1505
+ 'items': {'type': 'string'},
1506
+ 'description': 'IDs of teams the channel is shared with',
1507
+ },
1508
+ 'pending_connected_team_ids': {
1509
+ 'type': ['array', 'null'],
1510
+ 'items': {'type': 'string'},
1511
+ 'description': 'IDs of teams with pending connection',
1512
+ },
1513
+ 'is_member': {
1514
+ 'type': ['boolean', 'null'],
1515
+ 'description': 'Whether the authenticated user is a member',
1516
+ },
1517
+ 'topic': {
1518
+ 'oneOf': [
1519
+ {'$ref': '#/components/schemas/ChannelTopic'},
1520
+ {'type': 'null'},
1521
+ ],
1522
+ 'description': 'Channel topic',
1523
+ },
1524
+ 'purpose': {
1525
+ 'oneOf': [
1526
+ {'$ref': '#/components/schemas/ChannelPurpose'},
1527
+ {'type': 'null'},
1528
+ ],
1529
+ 'description': 'Channel purpose',
1530
+ },
1531
+ 'previous_names': {
1532
+ 'type': ['array', 'null'],
1533
+ 'items': {'type': 'string'},
1534
+ 'description': 'Previous channel names',
1535
+ },
1536
+ 'num_members': {
1537
+ 'type': ['integer', 'null'],
1538
+ 'description': 'Number of members in the channel',
1539
+ },
1540
+ 'parent_conversation': {
1541
+ 'type': ['string', 'null'],
1542
+ 'description': 'Parent conversation ID if this is a thread',
1543
+ },
1544
+ 'properties': {
1545
+ 'type': ['object', 'null'],
1546
+ 'description': 'Additional channel properties',
1547
+ },
1548
+ 'is_thread_only': {
1549
+ 'type': ['boolean', 'null'],
1550
+ 'description': 'Whether the channel is thread-only',
1551
+ },
1552
+ 'is_read_only': {
1553
+ 'type': ['boolean', 'null'],
1554
+ 'description': 'Whether the channel is read-only',
1555
+ },
1556
+ },
1557
+ 'x-airbyte-entity-name': 'channels',
1558
+ 'x-airbyte-stream-name': 'channels',
1559
+ },
1560
+ ),
1561
+ EntityDefinition(
1562
+ name='channel_messages',
1563
+ stream_name='channel_messages',
1564
+ actions=[Action.LIST],
1565
+ endpoints={
1566
+ Action.LIST: EndpointDefinition(
1567
+ method='GET',
1568
+ path='/conversations.history',
1569
+ action=Action.LIST,
1570
+ description='Returns messages from a channel',
1571
+ query_params=[
1572
+ 'channel',
1573
+ 'cursor',
1574
+ 'limit',
1575
+ 'oldest',
1576
+ 'latest',
1577
+ 'inclusive',
1578
+ ],
1579
+ query_params_schema={
1580
+ 'channel': {'type': 'string', 'required': True},
1581
+ 'cursor': {'type': 'string', 'required': False},
1582
+ 'limit': {
1583
+ 'type': 'integer',
1584
+ 'required': False,
1585
+ 'default': 100,
1586
+ },
1587
+ 'oldest': {'type': 'string', 'required': False},
1588
+ 'latest': {'type': 'string', 'required': False},
1589
+ 'inclusive': {
1590
+ 'type': 'boolean',
1591
+ 'required': False,
1592
+ 'default': False,
1593
+ },
1594
+ },
1595
+ response_schema={
1596
+ 'type': 'object',
1597
+ 'description': 'Response containing list of messages',
1598
+ 'properties': {
1599
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
1600
+ 'messages': {
1601
+ 'type': 'array',
1602
+ 'items': {
1603
+ 'type': 'object',
1604
+ 'description': 'Slack message object',
1605
+ 'properties': {
1606
+ 'type': {
1607
+ 'type': ['string', 'null'],
1608
+ 'description': 'Message type',
1609
+ },
1610
+ 'subtype': {
1611
+ 'type': ['string', 'null'],
1612
+ 'description': 'Message subtype',
1613
+ },
1614
+ 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
1615
+ 'user': {
1616
+ 'type': ['string', 'null'],
1617
+ 'description': 'User ID who sent the message',
1618
+ },
1619
+ 'text': {
1620
+ 'type': ['string', 'null'],
1621
+ 'description': 'Message text content',
1622
+ },
1623
+ 'thread_ts': {
1624
+ 'type': ['string', 'null'],
1625
+ 'description': 'Thread parent timestamp',
1626
+ },
1627
+ 'reply_count': {
1628
+ 'type': ['integer', 'null'],
1629
+ 'description': 'Number of replies in thread',
1630
+ },
1631
+ 'reply_users_count': {
1632
+ 'type': ['integer', 'null'],
1633
+ 'description': 'Number of unique users who replied',
1634
+ },
1635
+ 'latest_reply': {
1636
+ 'type': ['string', 'null'],
1637
+ 'description': 'Timestamp of latest reply',
1638
+ },
1639
+ 'reply_users': {
1640
+ 'type': ['array', 'null'],
1641
+ 'items': {'type': 'string'},
1642
+ 'description': 'User IDs who replied to the thread',
1643
+ },
1644
+ 'is_locked': {
1645
+ 'type': ['boolean', 'null'],
1646
+ 'description': 'Whether the thread is locked',
1647
+ },
1648
+ 'subscribed': {
1649
+ 'type': ['boolean', 'null'],
1650
+ 'description': 'Whether the user is subscribed to the thread',
1651
+ },
1652
+ 'reactions': {
1653
+ 'type': ['array', 'null'],
1654
+ 'items': {
1655
+ 'type': 'object',
1656
+ 'description': 'Message reaction',
1657
+ 'properties': {
1658
+ 'name': {
1659
+ 'type': ['string', 'null'],
1660
+ 'description': 'Reaction emoji name',
1661
+ },
1662
+ 'users': {
1663
+ 'type': ['array', 'null'],
1664
+ 'items': {'type': 'string'},
1665
+ 'description': 'User IDs who reacted',
1666
+ },
1667
+ 'count': {
1668
+ 'type': ['integer', 'null'],
1669
+ 'description': 'Number of reactions',
1670
+ },
1671
+ },
1672
+ },
1673
+ 'description': 'Reactions to the message',
1674
+ },
1675
+ 'attachments': {
1676
+ 'type': ['array', 'null'],
1677
+ 'items': {
1678
+ 'type': 'object',
1679
+ 'description': 'Message attachment',
1680
+ 'properties': {
1681
+ 'id': {
1682
+ 'type': ['integer', 'null'],
1683
+ 'description': 'Attachment ID',
1684
+ },
1685
+ 'fallback': {
1686
+ 'type': ['string', 'null'],
1687
+ 'description': 'Fallback text',
1688
+ },
1689
+ 'color': {
1690
+ 'type': ['string', 'null'],
1691
+ 'description': 'Attachment color',
1692
+ },
1693
+ 'pretext': {
1694
+ 'type': ['string', 'null'],
1695
+ 'description': 'Pretext',
1696
+ },
1697
+ 'author_name': {
1698
+ 'type': ['string', 'null'],
1699
+ 'description': 'Author name',
1700
+ },
1701
+ 'author_link': {
1702
+ 'type': ['string', 'null'],
1703
+ 'description': 'Author link',
1704
+ },
1705
+ 'author_icon': {
1706
+ 'type': ['string', 'null'],
1707
+ 'description': 'Author icon URL',
1708
+ },
1709
+ 'title': {
1710
+ 'type': ['string', 'null'],
1711
+ 'description': 'Attachment title',
1712
+ },
1713
+ 'title_link': {
1714
+ 'type': ['string', 'null'],
1715
+ 'description': 'Title link',
1716
+ },
1717
+ 'text': {
1718
+ 'type': ['string', 'null'],
1719
+ 'description': 'Attachment text',
1720
+ },
1721
+ 'fields': {
1722
+ 'type': ['array', 'null'],
1723
+ 'items': {'type': 'object'},
1724
+ 'description': 'Attachment fields',
1725
+ },
1726
+ 'image_url': {
1727
+ 'type': ['string', 'null'],
1728
+ 'description': 'Image URL',
1729
+ },
1730
+ 'thumb_url': {
1731
+ 'type': ['string', 'null'],
1732
+ 'description': 'Thumbnail URL',
1733
+ },
1734
+ 'footer': {
1735
+ 'type': ['string', 'null'],
1736
+ 'description': 'Footer text',
1737
+ },
1738
+ 'footer_icon': {
1739
+ 'type': ['string', 'null'],
1740
+ 'description': 'Footer icon URL',
1741
+ },
1742
+ 'ts': {
1743
+ 'type': ['string', 'integer', 'null'],
1744
+ 'description': 'Timestamp',
1745
+ },
1746
+ },
1747
+ },
1748
+ 'description': 'Message attachments',
1749
+ },
1750
+ 'blocks': {
1751
+ 'type': ['array', 'null'],
1752
+ 'items': {'type': 'object'},
1753
+ 'description': 'Block kit blocks',
1754
+ },
1755
+ 'files': {
1756
+ 'type': ['array', 'null'],
1757
+ 'items': {
1758
+ 'type': 'object',
1759
+ 'description': 'File object',
1760
+ 'properties': {
1761
+ 'id': {
1762
+ 'type': ['string', 'null'],
1763
+ 'description': 'File ID',
1764
+ },
1765
+ 'name': {
1766
+ 'type': ['string', 'null'],
1767
+ 'description': 'File name',
1768
+ },
1769
+ 'title': {
1770
+ 'type': ['string', 'null'],
1771
+ 'description': 'File title',
1772
+ },
1773
+ 'mimetype': {
1774
+ 'type': ['string', 'null'],
1775
+ 'description': 'MIME type',
1776
+ },
1777
+ 'filetype': {
1778
+ 'type': ['string', 'null'],
1779
+ 'description': 'File type',
1780
+ },
1781
+ 'pretty_type': {
1782
+ 'type': ['string', 'null'],
1783
+ 'description': 'Human-readable file type',
1784
+ },
1785
+ 'user': {
1786
+ 'type': ['string', 'null'],
1787
+ 'description': 'User ID who uploaded the file',
1788
+ },
1789
+ 'size': {
1790
+ 'type': ['integer', 'null'],
1791
+ 'description': 'File size in bytes',
1792
+ },
1793
+ 'mode': {
1794
+ 'type': ['string', 'null'],
1795
+ 'description': 'File mode',
1796
+ },
1797
+ 'is_external': {
1798
+ 'type': ['boolean', 'null'],
1799
+ 'description': 'Whether the file is external',
1800
+ },
1801
+ 'external_type': {
1802
+ 'type': ['string', 'null'],
1803
+ 'description': 'External file type',
1804
+ },
1805
+ 'is_public': {
1806
+ 'type': ['boolean', 'null'],
1807
+ 'description': 'Whether the file is public',
1808
+ },
1809
+ 'public_url_shared': {
1810
+ 'type': ['boolean', 'null'],
1811
+ 'description': 'Whether the public URL is shared',
1812
+ },
1813
+ 'url_private': {
1814
+ 'type': ['string', 'null'],
1815
+ 'description': 'Private URL',
1816
+ },
1817
+ 'url_private_download': {
1818
+ 'type': ['string', 'null'],
1819
+ 'description': 'Private download URL',
1820
+ },
1821
+ 'permalink': {
1822
+ 'type': ['string', 'null'],
1823
+ 'description': 'Permalink',
1824
+ },
1825
+ 'permalink_public': {
1826
+ 'type': ['string', 'null'],
1827
+ 'description': 'Public permalink',
1828
+ },
1829
+ 'created': {
1830
+ 'type': ['integer', 'null'],
1831
+ 'description': 'Unix timestamp of creation',
1832
+ },
1833
+ 'timestamp': {
1834
+ 'type': ['integer', 'null'],
1835
+ 'description': 'Unix timestamp',
1836
+ },
1837
+ },
1838
+ },
1839
+ 'description': 'Files attached to the message',
1840
+ },
1841
+ 'edited': {
1842
+ 'oneOf': [
1843
+ {
1844
+ 'type': 'object',
1845
+ 'description': 'Message edit information',
1846
+ 'properties': {
1847
+ 'user': {
1848
+ 'type': ['string', 'null'],
1849
+ 'description': 'User ID who edited the message',
1850
+ },
1851
+ 'ts': {
1852
+ 'type': ['string', 'null'],
1853
+ 'description': 'Edit timestamp',
1854
+ },
1855
+ },
1856
+ },
1857
+ {'type': 'null'},
1858
+ ],
1859
+ 'description': 'Edit information',
1860
+ },
1861
+ 'bot_id': {
1862
+ 'type': ['string', 'null'],
1863
+ 'description': 'Bot ID if message was sent by a bot',
1864
+ },
1865
+ 'bot_profile': {
1866
+ 'oneOf': [
1867
+ {
1868
+ 'type': 'object',
1869
+ 'description': 'Bot profile information',
1870
+ 'properties': {
1871
+ 'id': {
1872
+ 'type': ['string', 'null'],
1873
+ 'description': 'Bot ID',
1874
+ },
1875
+ 'deleted': {
1876
+ 'type': ['boolean', 'null'],
1877
+ 'description': 'Whether the bot is deleted',
1878
+ },
1879
+ 'name': {
1880
+ 'type': ['string', 'null'],
1881
+ 'description': 'Bot name',
1882
+ },
1883
+ 'updated': {
1884
+ 'type': ['integer', 'null'],
1885
+ 'description': 'Unix timestamp of last update',
1886
+ },
1887
+ 'app_id': {
1888
+ 'type': ['string', 'null'],
1889
+ 'description': 'App ID',
1890
+ },
1891
+ 'team_id': {
1892
+ 'type': ['string', 'null'],
1893
+ 'description': 'Team ID',
1894
+ },
1895
+ },
1896
+ },
1897
+ {'type': 'null'},
1898
+ ],
1899
+ 'description': 'Bot profile information',
1900
+ },
1901
+ 'app_id': {
1902
+ 'type': ['string', 'null'],
1903
+ 'description': 'App ID if message was sent by an app',
1904
+ },
1905
+ 'team': {
1906
+ 'type': ['string', 'null'],
1907
+ 'description': 'Team ID',
1908
+ },
1909
+ },
1910
+ 'x-airbyte-entity-name': 'channel_messages',
1911
+ 'x-airbyte-stream-name': 'channel_messages',
1912
+ },
1913
+ },
1914
+ 'has_more': {
1915
+ 'type': ['boolean', 'null'],
1916
+ 'description': 'Whether there are more messages',
1917
+ },
1918
+ 'pin_count': {
1919
+ 'type': ['integer', 'null'],
1920
+ 'description': 'Number of pinned messages',
1921
+ },
1922
+ 'response_metadata': {
1923
+ 'type': 'object',
1924
+ 'description': 'Response metadata including pagination',
1925
+ 'properties': {
1926
+ 'next_cursor': {
1927
+ 'type': ['string', 'null'],
1928
+ 'description': 'Cursor for next page of results',
1929
+ },
1930
+ },
1931
+ },
1932
+ },
1933
+ },
1934
+ record_extractor='$.messages',
1935
+ meta_extractor={'next_cursor': '$.response_metadata.next_cursor', 'has_more': '$.has_more'},
1936
+ ),
1937
+ },
1938
+ entity_schema={
1939
+ 'type': 'object',
1940
+ 'description': 'Slack message object',
1941
+ 'properties': {
1942
+ 'type': {
1943
+ 'type': ['string', 'null'],
1944
+ 'description': 'Message type',
1945
+ },
1946
+ 'subtype': {
1947
+ 'type': ['string', 'null'],
1948
+ 'description': 'Message subtype',
1949
+ },
1950
+ 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
1951
+ 'user': {
1952
+ 'type': ['string', 'null'],
1953
+ 'description': 'User ID who sent the message',
1954
+ },
1955
+ 'text': {
1956
+ 'type': ['string', 'null'],
1957
+ 'description': 'Message text content',
1958
+ },
1959
+ 'thread_ts': {
1960
+ 'type': ['string', 'null'],
1961
+ 'description': 'Thread parent timestamp',
1962
+ },
1963
+ 'reply_count': {
1964
+ 'type': ['integer', 'null'],
1965
+ 'description': 'Number of replies in thread',
1966
+ },
1967
+ 'reply_users_count': {
1968
+ 'type': ['integer', 'null'],
1969
+ 'description': 'Number of unique users who replied',
1970
+ },
1971
+ 'latest_reply': {
1972
+ 'type': ['string', 'null'],
1973
+ 'description': 'Timestamp of latest reply',
1974
+ },
1975
+ 'reply_users': {
1976
+ 'type': ['array', 'null'],
1977
+ 'items': {'type': 'string'},
1978
+ 'description': 'User IDs who replied to the thread',
1979
+ },
1980
+ 'is_locked': {
1981
+ 'type': ['boolean', 'null'],
1982
+ 'description': 'Whether the thread is locked',
1983
+ },
1984
+ 'subscribed': {
1985
+ 'type': ['boolean', 'null'],
1986
+ 'description': 'Whether the user is subscribed to the thread',
1987
+ },
1988
+ 'reactions': {
1989
+ 'type': ['array', 'null'],
1990
+ 'items': {'$ref': '#/components/schemas/Reaction'},
1991
+ 'description': 'Reactions to the message',
1992
+ },
1993
+ 'attachments': {
1994
+ 'type': ['array', 'null'],
1995
+ 'items': {'$ref': '#/components/schemas/Attachment'},
1996
+ 'description': 'Message attachments',
1997
+ },
1998
+ 'blocks': {
1999
+ 'type': ['array', 'null'],
2000
+ 'items': {'type': 'object'},
2001
+ 'description': 'Block kit blocks',
2002
+ },
2003
+ 'files': {
2004
+ 'type': ['array', 'null'],
2005
+ 'items': {'$ref': '#/components/schemas/File'},
2006
+ 'description': 'Files attached to the message',
2007
+ },
2008
+ 'edited': {
2009
+ 'oneOf': [
2010
+ {'$ref': '#/components/schemas/EditedInfo'},
2011
+ {'type': 'null'},
2012
+ ],
2013
+ 'description': 'Edit information',
2014
+ },
2015
+ 'bot_id': {
2016
+ 'type': ['string', 'null'],
2017
+ 'description': 'Bot ID if message was sent by a bot',
2018
+ },
2019
+ 'bot_profile': {
2020
+ 'oneOf': [
2021
+ {'$ref': '#/components/schemas/BotProfile'},
2022
+ {'type': 'null'},
2023
+ ],
2024
+ 'description': 'Bot profile information',
2025
+ },
2026
+ 'app_id': {
2027
+ 'type': ['string', 'null'],
2028
+ 'description': 'App ID if message was sent by an app',
2029
+ },
2030
+ 'team': {
2031
+ 'type': ['string', 'null'],
2032
+ 'description': 'Team ID',
2033
+ },
2034
+ },
2035
+ 'x-airbyte-entity-name': 'channel_messages',
2036
+ 'x-airbyte-stream-name': 'channel_messages',
2037
+ },
2038
+ ),
2039
+ EntityDefinition(
2040
+ name='threads',
2041
+ stream_name='threads',
2042
+ actions=[Action.LIST],
2043
+ endpoints={
2044
+ Action.LIST: EndpointDefinition(
2045
+ method='GET',
2046
+ path='/conversations.replies',
2047
+ action=Action.LIST,
2048
+ description='Returns messages in a thread (thread replies from conversations.replies endpoint)',
2049
+ query_params=[
2050
+ 'channel',
2051
+ 'ts',
2052
+ 'cursor',
2053
+ 'limit',
2054
+ 'oldest',
2055
+ 'latest',
2056
+ 'inclusive',
2057
+ ],
2058
+ query_params_schema={
2059
+ 'channel': {'type': 'string', 'required': True},
2060
+ 'ts': {'type': 'string', 'required': False},
2061
+ 'cursor': {'type': 'string', 'required': False},
2062
+ 'limit': {
2063
+ 'type': 'integer',
2064
+ 'required': False,
2065
+ 'default': 100,
2066
+ },
2067
+ 'oldest': {'type': 'string', 'required': False},
2068
+ 'latest': {'type': 'string', 'required': False},
2069
+ 'inclusive': {
2070
+ 'type': 'boolean',
2071
+ 'required': False,
2072
+ 'default': False,
2073
+ },
2074
+ },
2075
+ response_schema={
2076
+ 'type': 'object',
2077
+ 'description': 'Response containing thread replies',
2078
+ 'properties': {
2079
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
2080
+ 'messages': {
2081
+ 'type': 'array',
2082
+ 'items': {
2083
+ 'type': 'object',
2084
+ 'description': 'Slack thread reply message object',
2085
+ 'properties': {
2086
+ 'type': {
2087
+ 'type': ['string', 'null'],
2088
+ 'description': 'Message type',
2089
+ },
2090
+ 'subtype': {
2091
+ 'type': ['string', 'null'],
2092
+ 'description': 'Message subtype',
2093
+ },
2094
+ 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
2095
+ 'user': {
2096
+ 'type': ['string', 'null'],
2097
+ 'description': 'User ID who sent the message',
2098
+ },
2099
+ 'text': {
2100
+ 'type': ['string', 'null'],
2101
+ 'description': 'Message text content',
2102
+ },
2103
+ 'thread_ts': {
2104
+ 'type': ['string', 'null'],
2105
+ 'description': 'Thread parent timestamp',
2106
+ },
2107
+ 'parent_user_id': {
2108
+ 'type': ['string', 'null'],
2109
+ 'description': 'User ID of the parent message author (present in thread replies)',
2110
+ },
2111
+ 'reply_count': {
2112
+ 'type': ['integer', 'null'],
2113
+ 'description': 'Number of replies in thread',
2114
+ },
2115
+ 'reply_users_count': {
2116
+ 'type': ['integer', 'null'],
2117
+ 'description': 'Number of unique users who replied',
2118
+ },
2119
+ 'latest_reply': {
2120
+ 'type': ['string', 'null'],
2121
+ 'description': 'Timestamp of latest reply',
2122
+ },
2123
+ 'reply_users': {
2124
+ 'type': ['array', 'null'],
2125
+ 'items': {'type': 'string'},
2126
+ 'description': 'User IDs who replied to the thread',
2127
+ },
2128
+ 'is_locked': {
2129
+ 'type': ['boolean', 'null'],
2130
+ 'description': 'Whether the thread is locked',
2131
+ },
2132
+ 'subscribed': {
2133
+ 'type': ['boolean', 'null'],
2134
+ 'description': 'Whether the user is subscribed to the thread',
2135
+ },
2136
+ 'reactions': {
2137
+ 'type': ['array', 'null'],
2138
+ 'items': {
2139
+ 'type': 'object',
2140
+ 'description': 'Message reaction',
2141
+ 'properties': {
2142
+ 'name': {
2143
+ 'type': ['string', 'null'],
2144
+ 'description': 'Reaction emoji name',
2145
+ },
2146
+ 'users': {
2147
+ 'type': ['array', 'null'],
2148
+ 'items': {'type': 'string'},
2149
+ 'description': 'User IDs who reacted',
2150
+ },
2151
+ 'count': {
2152
+ 'type': ['integer', 'null'],
2153
+ 'description': 'Number of reactions',
2154
+ },
2155
+ },
2156
+ },
2157
+ 'description': 'Reactions to the message',
2158
+ },
2159
+ 'attachments': {
2160
+ 'type': ['array', 'null'],
2161
+ 'items': {
2162
+ 'type': 'object',
1279
2163
  'description': 'Message attachment',
1280
2164
  'properties': {
1281
2165
  'id': {
@@ -1507,17 +2391,13 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
1507
2391
  'description': 'Team ID',
1508
2392
  },
1509
2393
  },
1510
- 'x-airbyte-entity-name': 'channel_messages',
1511
- 'x-airbyte-stream-name': 'channel_messages',
2394
+ 'x-airbyte-entity-name': 'threads',
2395
+ 'x-airbyte-stream-name': 'threads',
1512
2396
  },
1513
2397
  },
1514
2398
  'has_more': {
1515
2399
  'type': ['boolean', 'null'],
1516
- 'description': 'Whether there are more messages',
1517
- },
1518
- 'pin_count': {
1519
- 'type': ['integer', 'null'],
1520
- 'description': 'Number of pinned messages',
2400
+ 'description': 'Whether there are more replies',
1521
2401
  },
1522
2402
  'response_metadata': {
1523
2403
  'type': 'object',
@@ -1537,7 +2417,7 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
1537
2417
  },
1538
2418
  entity_schema={
1539
2419
  'type': 'object',
1540
- 'description': 'Slack message object',
2420
+ 'description': 'Slack thread reply message object',
1541
2421
  'properties': {
1542
2422
  'type': {
1543
2423
  'type': ['string', 'null'],
@@ -1560,6 +2440,10 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
1560
2440
  'type': ['string', 'null'],
1561
2441
  'description': 'Thread parent timestamp',
1562
2442
  },
2443
+ 'parent_user_id': {
2444
+ 'type': ['string', 'null'],
2445
+ 'description': 'User ID of the parent message author (present in thread replies)',
2446
+ },
1563
2447
  'reply_count': {
1564
2448
  'type': ['integer', 'null'],
1565
2449
  'description': 'Number of replies in thread',
@@ -1619,505 +2503,686 @@ SlackConnectorModel: ConnectorModel = ConnectorModel(
1619
2503
  'bot_profile': {
1620
2504
  'oneOf': [
1621
2505
  {'$ref': '#/components/schemas/BotProfile'},
1622
- {'type': 'null'},
1623
- ],
1624
- 'description': 'Bot profile information',
1625
- },
1626
- 'app_id': {
1627
- 'type': ['string', 'null'],
1628
- 'description': 'App ID if message was sent by an app',
1629
- },
1630
- 'team': {
1631
- 'type': ['string', 'null'],
1632
- 'description': 'Team ID',
1633
- },
1634
- },
1635
- 'x-airbyte-entity-name': 'channel_messages',
1636
- 'x-airbyte-stream-name': 'channel_messages',
1637
- },
1638
- ),
1639
- EntityDefinition(
1640
- name='threads',
1641
- stream_name='threads',
1642
- actions=[Action.LIST],
1643
- endpoints={
1644
- Action.LIST: EndpointDefinition(
1645
- method='GET',
1646
- path='/conversations.replies',
1647
- action=Action.LIST,
1648
- description='Returns messages in a thread (thread replies from conversations.replies endpoint)',
1649
- query_params=[
1650
- 'channel',
1651
- 'ts',
1652
- 'cursor',
1653
- 'limit',
1654
- 'oldest',
1655
- 'latest',
1656
- 'inclusive',
1657
- ],
1658
- query_params_schema={
1659
- 'channel': {'type': 'string', 'required': True},
1660
- 'ts': {'type': 'string', 'required': False},
1661
- 'cursor': {'type': 'string', 'required': False},
1662
- 'limit': {
1663
- 'type': 'integer',
1664
- 'required': False,
1665
- 'default': 100,
1666
- },
1667
- 'oldest': {'type': 'string', 'required': False},
1668
- 'latest': {'type': 'string', 'required': False},
1669
- 'inclusive': {
1670
- 'type': 'boolean',
1671
- 'required': False,
1672
- 'default': False,
1673
- },
1674
- },
1675
- response_schema={
1676
- 'type': 'object',
1677
- 'description': 'Response containing thread replies',
1678
- 'properties': {
1679
- 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
1680
- 'messages': {
1681
- 'type': 'array',
1682
- 'items': {
1683
- 'type': 'object',
1684
- 'description': 'Slack thread reply message object',
1685
- 'properties': {
1686
- 'type': {
1687
- 'type': ['string', 'null'],
1688
- 'description': 'Message type',
1689
- },
1690
- 'subtype': {
1691
- 'type': ['string', 'null'],
1692
- 'description': 'Message subtype',
1693
- },
1694
- 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
1695
- 'user': {
1696
- 'type': ['string', 'null'],
1697
- 'description': 'User ID who sent the message',
1698
- },
1699
- 'text': {
1700
- 'type': ['string', 'null'],
1701
- 'description': 'Message text content',
1702
- },
1703
- 'thread_ts': {
1704
- 'type': ['string', 'null'],
1705
- 'description': 'Thread parent timestamp',
1706
- },
1707
- 'parent_user_id': {
1708
- 'type': ['string', 'null'],
1709
- 'description': 'User ID of the parent message author (present in thread replies)',
1710
- },
1711
- 'reply_count': {
1712
- 'type': ['integer', 'null'],
1713
- 'description': 'Number of replies in thread',
1714
- },
1715
- 'reply_users_count': {
1716
- 'type': ['integer', 'null'],
1717
- 'description': 'Number of unique users who replied',
1718
- },
1719
- 'latest_reply': {
1720
- 'type': ['string', 'null'],
1721
- 'description': 'Timestamp of latest reply',
1722
- },
1723
- 'reply_users': {
1724
- 'type': ['array', 'null'],
1725
- 'items': {'type': 'string'},
1726
- 'description': 'User IDs who replied to the thread',
1727
- },
1728
- 'is_locked': {
1729
- 'type': ['boolean', 'null'],
1730
- 'description': 'Whether the thread is locked',
1731
- },
1732
- 'subscribed': {
1733
- 'type': ['boolean', 'null'],
1734
- 'description': 'Whether the user is subscribed to the thread',
1735
- },
1736
- 'reactions': {
1737
- 'type': ['array', 'null'],
1738
- 'items': {
1739
- 'type': 'object',
1740
- 'description': 'Message reaction',
1741
- 'properties': {
1742
- 'name': {
1743
- 'type': ['string', 'null'],
1744
- 'description': 'Reaction emoji name',
1745
- },
1746
- 'users': {
1747
- 'type': ['array', 'null'],
1748
- 'items': {'type': 'string'},
1749
- 'description': 'User IDs who reacted',
1750
- },
1751
- 'count': {
1752
- 'type': ['integer', 'null'],
1753
- 'description': 'Number of reactions',
1754
- },
1755
- },
1756
- },
1757
- 'description': 'Reactions to the message',
1758
- },
1759
- 'attachments': {
1760
- 'type': ['array', 'null'],
1761
- 'items': {
2506
+ {'type': 'null'},
2507
+ ],
2508
+ 'description': 'Bot profile information',
2509
+ },
2510
+ 'app_id': {
2511
+ 'type': ['string', 'null'],
2512
+ 'description': 'App ID if message was sent by an app',
2513
+ },
2514
+ 'team': {
2515
+ 'type': ['string', 'null'],
2516
+ 'description': 'Team ID',
2517
+ },
2518
+ },
2519
+ 'x-airbyte-entity-name': 'threads',
2520
+ 'x-airbyte-stream-name': 'threads',
2521
+ },
2522
+ ),
2523
+ EntityDefinition(
2524
+ name='messages',
2525
+ actions=[Action.CREATE, Action.UPDATE],
2526
+ endpoints={
2527
+ Action.CREATE: EndpointDefinition(
2528
+ method='POST',
2529
+ path='/chat.postMessage',
2530
+ action=Action.CREATE,
2531
+ description='Posts a message to a public channel, private channel, or direct message conversation',
2532
+ body_fields=[
2533
+ 'channel',
2534
+ 'text',
2535
+ 'thread_ts',
2536
+ 'reply_broadcast',
2537
+ 'unfurl_links',
2538
+ 'unfurl_media',
2539
+ ],
2540
+ request_schema={
2541
+ 'type': 'object',
2542
+ 'description': 'Parameters for creating a message',
2543
+ 'properties': {
2544
+ 'channel': {'type': 'string', 'description': 'Channel ID, private group ID, or user ID to send message to'},
2545
+ 'text': {'type': 'string', 'description': 'Message text content (supports mrkdwn formatting)'},
2546
+ 'thread_ts': {'type': 'string', 'description': 'Thread timestamp to reply to (for threaded messages)'},
2547
+ 'reply_broadcast': {'type': 'boolean', 'description': 'Also post reply to channel when replying to a thread'},
2548
+ 'unfurl_links': {'type': 'boolean', 'description': 'Enable unfurling of primarily text-based content'},
2549
+ 'unfurl_media': {'type': 'boolean', 'description': 'Enable unfurling of media content'},
2550
+ },
2551
+ 'required': ['channel', 'text'],
2552
+ },
2553
+ response_schema={
2554
+ 'type': 'object',
2555
+ 'description': 'Response from creating a message',
2556
+ 'properties': {
2557
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
2558
+ 'channel': {
2559
+ 'type': ['string', 'null'],
2560
+ 'description': 'Channel ID where message was posted',
2561
+ },
2562
+ 'ts': {
2563
+ 'type': ['string', 'null'],
2564
+ 'description': 'Message timestamp (unique identifier)',
2565
+ },
2566
+ 'message': {
2567
+ 'type': 'object',
2568
+ 'description': 'A message object returned from create/update operations',
2569
+ 'properties': {
2570
+ 'type': {
2571
+ 'type': ['string', 'null'],
2572
+ 'description': 'Message type',
2573
+ },
2574
+ 'subtype': {
2575
+ 'type': ['string', 'null'],
2576
+ 'description': 'Message subtype',
2577
+ },
2578
+ 'text': {
2579
+ 'type': ['string', 'null'],
2580
+ 'description': 'Message text content',
2581
+ },
2582
+ 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
2583
+ 'user': {
2584
+ 'type': ['string', 'null'],
2585
+ 'description': 'User ID who sent the message',
2586
+ },
2587
+ 'bot_id': {
2588
+ 'type': ['string', 'null'],
2589
+ 'description': 'Bot ID if message was sent by a bot',
2590
+ },
2591
+ 'app_id': {
2592
+ 'type': ['string', 'null'],
2593
+ 'description': 'App ID if message was sent by an app',
2594
+ },
2595
+ 'team': {
2596
+ 'type': ['string', 'null'],
2597
+ 'description': 'Team ID',
2598
+ },
2599
+ 'bot_profile': {
2600
+ 'oneOf': [
2601
+ {
1762
2602
  'type': 'object',
1763
- 'description': 'Message attachment',
2603
+ 'description': 'Bot profile information',
1764
2604
  'properties': {
1765
2605
  'id': {
1766
- 'type': ['integer', 'null'],
1767
- 'description': 'Attachment ID',
1768
- },
1769
- 'fallback': {
1770
2606
  'type': ['string', 'null'],
1771
- 'description': 'Fallback text',
2607
+ 'description': 'Bot ID',
1772
2608
  },
1773
- 'color': {
1774
- 'type': ['string', 'null'],
1775
- 'description': 'Attachment color',
2609
+ 'deleted': {
2610
+ 'type': ['boolean', 'null'],
2611
+ 'description': 'Whether the bot is deleted',
1776
2612
  },
1777
- 'pretext': {
2613
+ 'name': {
1778
2614
  'type': ['string', 'null'],
1779
- 'description': 'Pretext',
2615
+ 'description': 'Bot name',
1780
2616
  },
1781
- 'author_name': {
1782
- 'type': ['string', 'null'],
1783
- 'description': 'Author name',
2617
+ 'updated': {
2618
+ 'type': ['integer', 'null'],
2619
+ 'description': 'Unix timestamp of last update',
1784
2620
  },
1785
- 'author_link': {
2621
+ 'app_id': {
1786
2622
  'type': ['string', 'null'],
1787
- 'description': 'Author link',
2623
+ 'description': 'App ID',
1788
2624
  },
1789
- 'author_icon': {
2625
+ 'team_id': {
1790
2626
  'type': ['string', 'null'],
1791
- 'description': 'Author icon URL',
2627
+ 'description': 'Team ID',
1792
2628
  },
1793
- 'title': {
2629
+ },
2630
+ },
2631
+ {'type': 'null'},
2632
+ ],
2633
+ 'description': 'Bot profile information',
2634
+ },
2635
+ },
2636
+ },
2637
+ },
2638
+ },
2639
+ record_extractor='$.message',
2640
+ ),
2641
+ Action.UPDATE: EndpointDefinition(
2642
+ method='POST',
2643
+ path='/chat.update',
2644
+ action=Action.UPDATE,
2645
+ description='Updates an existing message in a channel',
2646
+ body_fields=['channel', 'ts', 'text'],
2647
+ request_schema={
2648
+ 'type': 'object',
2649
+ 'description': 'Parameters for updating a message',
2650
+ 'properties': {
2651
+ 'channel': {'type': 'string', 'description': 'Channel ID containing the message'},
2652
+ 'ts': {'type': 'string', 'description': 'Timestamp of the message to update'},
2653
+ 'text': {'type': 'string', 'description': 'New message text content'},
2654
+ },
2655
+ 'required': ['channel', 'ts', 'text'],
2656
+ },
2657
+ response_schema={
2658
+ 'type': 'object',
2659
+ 'description': 'Response from updating a message',
2660
+ 'properties': {
2661
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
2662
+ 'channel': {
2663
+ 'type': ['string', 'null'],
2664
+ 'description': 'Channel ID where message was updated',
2665
+ },
2666
+ 'ts': {
2667
+ 'type': ['string', 'null'],
2668
+ 'description': 'Message timestamp',
2669
+ },
2670
+ 'text': {
2671
+ 'type': ['string', 'null'],
2672
+ 'description': 'Updated message text',
2673
+ },
2674
+ 'message': {
2675
+ 'type': 'object',
2676
+ 'description': 'A message object returned from create/update operations',
2677
+ 'properties': {
2678
+ 'type': {
2679
+ 'type': ['string', 'null'],
2680
+ 'description': 'Message type',
2681
+ },
2682
+ 'subtype': {
2683
+ 'type': ['string', 'null'],
2684
+ 'description': 'Message subtype',
2685
+ },
2686
+ 'text': {
2687
+ 'type': ['string', 'null'],
2688
+ 'description': 'Message text content',
2689
+ },
2690
+ 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
2691
+ 'user': {
2692
+ 'type': ['string', 'null'],
2693
+ 'description': 'User ID who sent the message',
2694
+ },
2695
+ 'bot_id': {
2696
+ 'type': ['string', 'null'],
2697
+ 'description': 'Bot ID if message was sent by a bot',
2698
+ },
2699
+ 'app_id': {
2700
+ 'type': ['string', 'null'],
2701
+ 'description': 'App ID if message was sent by an app',
2702
+ },
2703
+ 'team': {
2704
+ 'type': ['string', 'null'],
2705
+ 'description': 'Team ID',
2706
+ },
2707
+ 'bot_profile': {
2708
+ 'oneOf': [
2709
+ {
2710
+ 'type': 'object',
2711
+ 'description': 'Bot profile information',
2712
+ 'properties': {
2713
+ 'id': {
1794
2714
  'type': ['string', 'null'],
1795
- 'description': 'Attachment title',
2715
+ 'description': 'Bot ID',
1796
2716
  },
1797
- 'title_link': {
1798
- 'type': ['string', 'null'],
1799
- 'description': 'Title link',
2717
+ 'deleted': {
2718
+ 'type': ['boolean', 'null'],
2719
+ 'description': 'Whether the bot is deleted',
1800
2720
  },
1801
- 'text': {
2721
+ 'name': {
1802
2722
  'type': ['string', 'null'],
1803
- 'description': 'Attachment text',
2723
+ 'description': 'Bot name',
1804
2724
  },
1805
- 'fields': {
1806
- 'type': ['array', 'null'],
1807
- 'items': {'type': 'object'},
1808
- 'description': 'Attachment fields',
2725
+ 'updated': {
2726
+ 'type': ['integer', 'null'],
2727
+ 'description': 'Unix timestamp of last update',
1809
2728
  },
1810
- 'image_url': {
2729
+ 'app_id': {
1811
2730
  'type': ['string', 'null'],
1812
- 'description': 'Image URL',
2731
+ 'description': 'App ID',
1813
2732
  },
1814
- 'thumb_url': {
2733
+ 'team_id': {
1815
2734
  'type': ['string', 'null'],
1816
- 'description': 'Thumbnail URL',
2735
+ 'description': 'Team ID',
1817
2736
  },
1818
- 'footer': {
2737
+ },
2738
+ },
2739
+ {'type': 'null'},
2740
+ ],
2741
+ 'description': 'Bot profile information',
2742
+ },
2743
+ },
2744
+ },
2745
+ },
2746
+ },
2747
+ record_extractor='$.message',
2748
+ ),
2749
+ },
2750
+ ),
2751
+ EntityDefinition(
2752
+ name='channel_topics',
2753
+ actions=[Action.CREATE],
2754
+ endpoints={
2755
+ Action.CREATE: EndpointDefinition(
2756
+ method='POST',
2757
+ path='/conversations.setTopic',
2758
+ action=Action.CREATE,
2759
+ description='Sets the topic for a channel',
2760
+ body_fields=['channel', 'topic'],
2761
+ request_schema={
2762
+ 'type': 'object',
2763
+ 'description': 'Parameters for setting channel topic',
2764
+ 'properties': {
2765
+ 'channel': {'type': 'string', 'description': 'Channel ID to set topic for'},
2766
+ 'topic': {'type': 'string', 'description': 'New topic text (max 250 characters)'},
2767
+ },
2768
+ 'required': ['channel', 'topic'],
2769
+ },
2770
+ response_schema={
2771
+ 'type': 'object',
2772
+ 'description': 'Response from setting channel topic',
2773
+ 'properties': {
2774
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
2775
+ 'channel': {
2776
+ 'type': 'object',
2777
+ 'description': 'Slack channel object',
2778
+ 'properties': {
2779
+ 'id': {'type': 'string', 'description': 'Unique channel identifier'},
2780
+ 'name': {
2781
+ 'type': ['string', 'null'],
2782
+ 'description': 'Channel name',
2783
+ },
2784
+ 'is_channel': {
2785
+ 'type': ['boolean', 'null'],
2786
+ 'description': 'Whether this is a channel',
2787
+ },
2788
+ 'is_group': {
2789
+ 'type': ['boolean', 'null'],
2790
+ 'description': 'Whether this is a group',
2791
+ },
2792
+ 'is_im': {
2793
+ 'type': ['boolean', 'null'],
2794
+ 'description': 'Whether this is a direct message',
2795
+ },
2796
+ 'is_mpim': {
2797
+ 'type': ['boolean', 'null'],
2798
+ 'description': 'Whether this is a multi-party direct message',
2799
+ },
2800
+ 'is_private': {
2801
+ 'type': ['boolean', 'null'],
2802
+ 'description': 'Whether the channel is private',
2803
+ },
2804
+ 'created': {
2805
+ 'type': ['integer', 'null'],
2806
+ 'description': 'Unix timestamp of channel creation',
2807
+ },
2808
+ 'is_archived': {
2809
+ 'type': ['boolean', 'null'],
2810
+ 'description': 'Whether the channel is archived',
2811
+ },
2812
+ 'is_general': {
2813
+ 'type': ['boolean', 'null'],
2814
+ 'description': 'Whether this is the general channel',
2815
+ },
2816
+ 'unlinked': {
2817
+ 'type': ['integer', 'null'],
2818
+ 'description': 'Unlinked timestamp',
2819
+ },
2820
+ 'name_normalized': {
2821
+ 'type': ['string', 'null'],
2822
+ 'description': 'Normalized channel name',
2823
+ },
2824
+ 'is_shared': {
2825
+ 'type': ['boolean', 'null'],
2826
+ 'description': 'Whether the channel is shared',
2827
+ },
2828
+ 'is_org_shared': {
2829
+ 'type': ['boolean', 'null'],
2830
+ 'description': 'Whether the channel is shared across the organization',
2831
+ },
2832
+ 'is_pending_ext_shared': {
2833
+ 'type': ['boolean', 'null'],
2834
+ 'description': 'Whether external sharing is pending',
2835
+ },
2836
+ 'pending_shared': {
2837
+ 'type': ['array', 'null'],
2838
+ 'items': {'type': 'string'},
2839
+ 'description': 'Pending shared teams',
2840
+ },
2841
+ 'context_team_id': {
2842
+ 'type': ['string', 'null'],
2843
+ 'description': 'Context team ID',
2844
+ },
2845
+ 'updated': {
2846
+ 'type': ['integer', 'null'],
2847
+ 'description': 'Unix timestamp of last update',
2848
+ },
2849
+ 'creator': {
2850
+ 'type': ['string', 'null'],
2851
+ 'description': 'User ID of the channel creator',
2852
+ },
2853
+ 'is_ext_shared': {
2854
+ 'type': ['boolean', 'null'],
2855
+ 'description': 'Whether the channel is externally shared',
2856
+ },
2857
+ 'shared_team_ids': {
2858
+ 'type': ['array', 'null'],
2859
+ 'items': {'type': 'string'},
2860
+ 'description': 'IDs of teams the channel is shared with',
2861
+ },
2862
+ 'pending_connected_team_ids': {
2863
+ 'type': ['array', 'null'],
2864
+ 'items': {'type': 'string'},
2865
+ 'description': 'IDs of teams with pending connection',
2866
+ },
2867
+ 'is_member': {
2868
+ 'type': ['boolean', 'null'],
2869
+ 'description': 'Whether the authenticated user is a member',
2870
+ },
2871
+ 'topic': {
2872
+ 'oneOf': [
2873
+ {
2874
+ 'type': 'object',
2875
+ 'description': 'Channel topic information',
2876
+ 'properties': {
2877
+ 'value': {
1819
2878
  'type': ['string', 'null'],
1820
- 'description': 'Footer text',
2879
+ 'description': 'Topic text',
1821
2880
  },
1822
- 'footer_icon': {
2881
+ 'creator': {
1823
2882
  'type': ['string', 'null'],
1824
- 'description': 'Footer icon URL',
2883
+ 'description': 'User ID who set the topic',
1825
2884
  },
1826
- 'ts': {
1827
- 'type': ['string', 'integer', 'null'],
1828
- 'description': 'Timestamp',
2885
+ 'last_set': {
2886
+ 'type': ['integer', 'null'],
2887
+ 'description': 'Unix timestamp when topic was last set',
1829
2888
  },
1830
2889
  },
1831
2890
  },
1832
- 'description': 'Message attachments',
1833
- },
1834
- 'blocks': {
1835
- 'type': ['array', 'null'],
1836
- 'items': {'type': 'object'},
1837
- 'description': 'Block kit blocks',
1838
- },
1839
- 'files': {
1840
- 'type': ['array', 'null'],
1841
- 'items': {
2891
+ {'type': 'null'},
2892
+ ],
2893
+ 'description': 'Channel topic',
2894
+ },
2895
+ 'purpose': {
2896
+ 'oneOf': [
2897
+ {
1842
2898
  'type': 'object',
1843
- 'description': 'File object',
2899
+ 'description': 'Channel purpose information',
1844
2900
  'properties': {
1845
- 'id': {
1846
- 'type': ['string', 'null'],
1847
- 'description': 'File ID',
1848
- },
1849
- 'name': {
1850
- 'type': ['string', 'null'],
1851
- 'description': 'File name',
1852
- },
1853
- 'title': {
1854
- 'type': ['string', 'null'],
1855
- 'description': 'File title',
1856
- },
1857
- 'mimetype': {
1858
- 'type': ['string', 'null'],
1859
- 'description': 'MIME type',
1860
- },
1861
- 'filetype': {
1862
- 'type': ['string', 'null'],
1863
- 'description': 'File type',
1864
- },
1865
- 'pretty_type': {
2901
+ 'value': {
1866
2902
  'type': ['string', 'null'],
1867
- 'description': 'Human-readable file type',
2903
+ 'description': 'Purpose text',
1868
2904
  },
1869
- 'user': {
2905
+ 'creator': {
1870
2906
  'type': ['string', 'null'],
1871
- 'description': 'User ID who uploaded the file',
2907
+ 'description': 'User ID who set the purpose',
1872
2908
  },
1873
- 'size': {
2909
+ 'last_set': {
1874
2910
  'type': ['integer', 'null'],
1875
- 'description': 'File size in bytes',
1876
- },
1877
- 'mode': {
1878
- 'type': ['string', 'null'],
1879
- 'description': 'File mode',
1880
- },
1881
- 'is_external': {
1882
- 'type': ['boolean', 'null'],
1883
- 'description': 'Whether the file is external',
1884
- },
1885
- 'external_type': {
1886
- 'type': ['string', 'null'],
1887
- 'description': 'External file type',
1888
- },
1889
- 'is_public': {
1890
- 'type': ['boolean', 'null'],
1891
- 'description': 'Whether the file is public',
1892
- },
1893
- 'public_url_shared': {
1894
- 'type': ['boolean', 'null'],
1895
- 'description': 'Whether the public URL is shared',
1896
- },
1897
- 'url_private': {
1898
- 'type': ['string', 'null'],
1899
- 'description': 'Private URL',
1900
- },
1901
- 'url_private_download': {
1902
- 'type': ['string', 'null'],
1903
- 'description': 'Private download URL',
1904
- },
1905
- 'permalink': {
1906
- 'type': ['string', 'null'],
1907
- 'description': 'Permalink',
2911
+ 'description': 'Unix timestamp when purpose was last set',
1908
2912
  },
1909
- 'permalink_public': {
2913
+ },
2914
+ },
2915
+ {'type': 'null'},
2916
+ ],
2917
+ 'description': 'Channel purpose',
2918
+ },
2919
+ 'previous_names': {
2920
+ 'type': ['array', 'null'],
2921
+ 'items': {'type': 'string'},
2922
+ 'description': 'Previous channel names',
2923
+ },
2924
+ 'num_members': {
2925
+ 'type': ['integer', 'null'],
2926
+ 'description': 'Number of members in the channel',
2927
+ },
2928
+ 'parent_conversation': {
2929
+ 'type': ['string', 'null'],
2930
+ 'description': 'Parent conversation ID if this is a thread',
2931
+ },
2932
+ 'properties': {
2933
+ 'type': ['object', 'null'],
2934
+ 'description': 'Additional channel properties',
2935
+ },
2936
+ 'is_thread_only': {
2937
+ 'type': ['boolean', 'null'],
2938
+ 'description': 'Whether the channel is thread-only',
2939
+ },
2940
+ 'is_read_only': {
2941
+ 'type': ['boolean', 'null'],
2942
+ 'description': 'Whether the channel is read-only',
2943
+ },
2944
+ },
2945
+ 'x-airbyte-entity-name': 'channels',
2946
+ 'x-airbyte-stream-name': 'channels',
2947
+ },
2948
+ },
2949
+ },
2950
+ record_extractor='$.channel',
2951
+ ),
2952
+ },
2953
+ ),
2954
+ EntityDefinition(
2955
+ name='channel_purposes',
2956
+ actions=[Action.CREATE],
2957
+ endpoints={
2958
+ Action.CREATE: EndpointDefinition(
2959
+ method='POST',
2960
+ path='/conversations.setPurpose',
2961
+ action=Action.CREATE,
2962
+ description='Sets the purpose for a channel',
2963
+ body_fields=['channel', 'purpose'],
2964
+ request_schema={
2965
+ 'type': 'object',
2966
+ 'description': 'Parameters for setting channel purpose',
2967
+ 'properties': {
2968
+ 'channel': {'type': 'string', 'description': 'Channel ID to set purpose for'},
2969
+ 'purpose': {'type': 'string', 'description': 'New purpose text (max 250 characters)'},
2970
+ },
2971
+ 'required': ['channel', 'purpose'],
2972
+ },
2973
+ response_schema={
2974
+ 'type': 'object',
2975
+ 'description': 'Response from setting channel purpose',
2976
+ 'properties': {
2977
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
2978
+ 'channel': {
2979
+ 'type': 'object',
2980
+ 'description': 'Slack channel object',
2981
+ 'properties': {
2982
+ 'id': {'type': 'string', 'description': 'Unique channel identifier'},
2983
+ 'name': {
2984
+ 'type': ['string', 'null'],
2985
+ 'description': 'Channel name',
2986
+ },
2987
+ 'is_channel': {
2988
+ 'type': ['boolean', 'null'],
2989
+ 'description': 'Whether this is a channel',
2990
+ },
2991
+ 'is_group': {
2992
+ 'type': ['boolean', 'null'],
2993
+ 'description': 'Whether this is a group',
2994
+ },
2995
+ 'is_im': {
2996
+ 'type': ['boolean', 'null'],
2997
+ 'description': 'Whether this is a direct message',
2998
+ },
2999
+ 'is_mpim': {
3000
+ 'type': ['boolean', 'null'],
3001
+ 'description': 'Whether this is a multi-party direct message',
3002
+ },
3003
+ 'is_private': {
3004
+ 'type': ['boolean', 'null'],
3005
+ 'description': 'Whether the channel is private',
3006
+ },
3007
+ 'created': {
3008
+ 'type': ['integer', 'null'],
3009
+ 'description': 'Unix timestamp of channel creation',
3010
+ },
3011
+ 'is_archived': {
3012
+ 'type': ['boolean', 'null'],
3013
+ 'description': 'Whether the channel is archived',
3014
+ },
3015
+ 'is_general': {
3016
+ 'type': ['boolean', 'null'],
3017
+ 'description': 'Whether this is the general channel',
3018
+ },
3019
+ 'unlinked': {
3020
+ 'type': ['integer', 'null'],
3021
+ 'description': 'Unlinked timestamp',
3022
+ },
3023
+ 'name_normalized': {
3024
+ 'type': ['string', 'null'],
3025
+ 'description': 'Normalized channel name',
3026
+ },
3027
+ 'is_shared': {
3028
+ 'type': ['boolean', 'null'],
3029
+ 'description': 'Whether the channel is shared',
3030
+ },
3031
+ 'is_org_shared': {
3032
+ 'type': ['boolean', 'null'],
3033
+ 'description': 'Whether the channel is shared across the organization',
3034
+ },
3035
+ 'is_pending_ext_shared': {
3036
+ 'type': ['boolean', 'null'],
3037
+ 'description': 'Whether external sharing is pending',
3038
+ },
3039
+ 'pending_shared': {
3040
+ 'type': ['array', 'null'],
3041
+ 'items': {'type': 'string'},
3042
+ 'description': 'Pending shared teams',
3043
+ },
3044
+ 'context_team_id': {
3045
+ 'type': ['string', 'null'],
3046
+ 'description': 'Context team ID',
3047
+ },
3048
+ 'updated': {
3049
+ 'type': ['integer', 'null'],
3050
+ 'description': 'Unix timestamp of last update',
3051
+ },
3052
+ 'creator': {
3053
+ 'type': ['string', 'null'],
3054
+ 'description': 'User ID of the channel creator',
3055
+ },
3056
+ 'is_ext_shared': {
3057
+ 'type': ['boolean', 'null'],
3058
+ 'description': 'Whether the channel is externally shared',
3059
+ },
3060
+ 'shared_team_ids': {
3061
+ 'type': ['array', 'null'],
3062
+ 'items': {'type': 'string'},
3063
+ 'description': 'IDs of teams the channel is shared with',
3064
+ },
3065
+ 'pending_connected_team_ids': {
3066
+ 'type': ['array', 'null'],
3067
+ 'items': {'type': 'string'},
3068
+ 'description': 'IDs of teams with pending connection',
3069
+ },
3070
+ 'is_member': {
3071
+ 'type': ['boolean', 'null'],
3072
+ 'description': 'Whether the authenticated user is a member',
3073
+ },
3074
+ 'topic': {
3075
+ 'oneOf': [
3076
+ {
3077
+ 'type': 'object',
3078
+ 'description': 'Channel topic information',
3079
+ 'properties': {
3080
+ 'value': {
1910
3081
  'type': ['string', 'null'],
1911
- 'description': 'Public permalink',
3082
+ 'description': 'Topic text',
1912
3083
  },
1913
- 'created': {
1914
- 'type': ['integer', 'null'],
1915
- 'description': 'Unix timestamp of creation',
3084
+ 'creator': {
3085
+ 'type': ['string', 'null'],
3086
+ 'description': 'User ID who set the topic',
1916
3087
  },
1917
- 'timestamp': {
3088
+ 'last_set': {
1918
3089
  'type': ['integer', 'null'],
1919
- 'description': 'Unix timestamp',
3090
+ 'description': 'Unix timestamp when topic was last set',
1920
3091
  },
1921
3092
  },
1922
3093
  },
1923
- 'description': 'Files attached to the message',
1924
- },
1925
- 'edited': {
1926
- 'oneOf': [
1927
- {
1928
- 'type': 'object',
1929
- 'description': 'Message edit information',
1930
- 'properties': {
1931
- 'user': {
1932
- 'type': ['string', 'null'],
1933
- 'description': 'User ID who edited the message',
1934
- },
1935
- 'ts': {
1936
- 'type': ['string', 'null'],
1937
- 'description': 'Edit timestamp',
1938
- },
3094
+ {'type': 'null'},
3095
+ ],
3096
+ 'description': 'Channel topic',
3097
+ },
3098
+ 'purpose': {
3099
+ 'oneOf': [
3100
+ {
3101
+ 'type': 'object',
3102
+ 'description': 'Channel purpose information',
3103
+ 'properties': {
3104
+ 'value': {
3105
+ 'type': ['string', 'null'],
3106
+ 'description': 'Purpose text',
1939
3107
  },
1940
- },
1941
- {'type': 'null'},
1942
- ],
1943
- 'description': 'Edit information',
1944
- },
1945
- 'bot_id': {
1946
- 'type': ['string', 'null'],
1947
- 'description': 'Bot ID if message was sent by a bot',
1948
- },
1949
- 'bot_profile': {
1950
- 'oneOf': [
1951
- {
1952
- 'type': 'object',
1953
- 'description': 'Bot profile information',
1954
- 'properties': {
1955
- 'id': {
1956
- 'type': ['string', 'null'],
1957
- 'description': 'Bot ID',
1958
- },
1959
- 'deleted': {
1960
- 'type': ['boolean', 'null'],
1961
- 'description': 'Whether the bot is deleted',
1962
- },
1963
- 'name': {
1964
- 'type': ['string', 'null'],
1965
- 'description': 'Bot name',
1966
- },
1967
- 'updated': {
1968
- 'type': ['integer', 'null'],
1969
- 'description': 'Unix timestamp of last update',
1970
- },
1971
- 'app_id': {
1972
- 'type': ['string', 'null'],
1973
- 'description': 'App ID',
1974
- },
1975
- 'team_id': {
1976
- 'type': ['string', 'null'],
1977
- 'description': 'Team ID',
1978
- },
3108
+ 'creator': {
3109
+ 'type': ['string', 'null'],
3110
+ 'description': 'User ID who set the purpose',
3111
+ },
3112
+ 'last_set': {
3113
+ 'type': ['integer', 'null'],
3114
+ 'description': 'Unix timestamp when purpose was last set',
1979
3115
  },
1980
3116
  },
1981
- {'type': 'null'},
1982
- ],
1983
- 'description': 'Bot profile information',
1984
- },
1985
- 'app_id': {
1986
- 'type': ['string', 'null'],
1987
- 'description': 'App ID if message was sent by an app',
1988
- },
1989
- 'team': {
1990
- 'type': ['string', 'null'],
1991
- 'description': 'Team ID',
1992
- },
3117
+ },
3118
+ {'type': 'null'},
3119
+ ],
3120
+ 'description': 'Channel purpose',
1993
3121
  },
1994
- 'x-airbyte-entity-name': 'threads',
1995
- 'x-airbyte-stream-name': 'threads',
1996
- },
1997
- },
1998
- 'has_more': {
1999
- 'type': ['boolean', 'null'],
2000
- 'description': 'Whether there are more replies',
2001
- },
2002
- 'response_metadata': {
2003
- 'type': 'object',
2004
- 'description': 'Response metadata including pagination',
2005
- 'properties': {
2006
- 'next_cursor': {
3122
+ 'previous_names': {
3123
+ 'type': ['array', 'null'],
3124
+ 'items': {'type': 'string'},
3125
+ 'description': 'Previous channel names',
3126
+ },
3127
+ 'num_members': {
3128
+ 'type': ['integer', 'null'],
3129
+ 'description': 'Number of members in the channel',
3130
+ },
3131
+ 'parent_conversation': {
2007
3132
  'type': ['string', 'null'],
2008
- 'description': 'Cursor for next page of results',
3133
+ 'description': 'Parent conversation ID if this is a thread',
3134
+ },
3135
+ 'properties': {
3136
+ 'type': ['object', 'null'],
3137
+ 'description': 'Additional channel properties',
3138
+ },
3139
+ 'is_thread_only': {
3140
+ 'type': ['boolean', 'null'],
3141
+ 'description': 'Whether the channel is thread-only',
3142
+ },
3143
+ 'is_read_only': {
3144
+ 'type': ['boolean', 'null'],
3145
+ 'description': 'Whether the channel is read-only',
2009
3146
  },
2010
3147
  },
3148
+ 'x-airbyte-entity-name': 'channels',
3149
+ 'x-airbyte-stream-name': 'channels',
2011
3150
  },
2012
3151
  },
2013
3152
  },
2014
- record_extractor='$.messages',
2015
- meta_extractor={'next_cursor': '$.response_metadata.next_cursor', 'has_more': '$.has_more'},
3153
+ record_extractor='$.channel',
2016
3154
  ),
2017
3155
  },
2018
- entity_schema={
2019
- 'type': 'object',
2020
- 'description': 'Slack thread reply message object',
2021
- 'properties': {
2022
- 'type': {
2023
- 'type': ['string', 'null'],
2024
- 'description': 'Message type',
2025
- },
2026
- 'subtype': {
2027
- 'type': ['string', 'null'],
2028
- 'description': 'Message subtype',
2029
- },
2030
- 'ts': {'type': 'string', 'description': 'Message timestamp (unique identifier)'},
2031
- 'user': {
2032
- 'type': ['string', 'null'],
2033
- 'description': 'User ID who sent the message',
2034
- },
2035
- 'text': {
2036
- 'type': ['string', 'null'],
2037
- 'description': 'Message text content',
2038
- },
2039
- 'thread_ts': {
2040
- 'type': ['string', 'null'],
2041
- 'description': 'Thread parent timestamp',
2042
- },
2043
- 'parent_user_id': {
2044
- 'type': ['string', 'null'],
2045
- 'description': 'User ID of the parent message author (present in thread replies)',
2046
- },
2047
- 'reply_count': {
2048
- 'type': ['integer', 'null'],
2049
- 'description': 'Number of replies in thread',
2050
- },
2051
- 'reply_users_count': {
2052
- 'type': ['integer', 'null'],
2053
- 'description': 'Number of unique users who replied',
2054
- },
2055
- 'latest_reply': {
2056
- 'type': ['string', 'null'],
2057
- 'description': 'Timestamp of latest reply',
2058
- },
2059
- 'reply_users': {
2060
- 'type': ['array', 'null'],
2061
- 'items': {'type': 'string'},
2062
- 'description': 'User IDs who replied to the thread',
2063
- },
2064
- 'is_locked': {
2065
- 'type': ['boolean', 'null'],
2066
- 'description': 'Whether the thread is locked',
2067
- },
2068
- 'subscribed': {
2069
- 'type': ['boolean', 'null'],
2070
- 'description': 'Whether the user is subscribed to the thread',
2071
- },
2072
- 'reactions': {
2073
- 'type': ['array', 'null'],
2074
- 'items': {'$ref': '#/components/schemas/Reaction'},
2075
- 'description': 'Reactions to the message',
2076
- },
2077
- 'attachments': {
2078
- 'type': ['array', 'null'],
2079
- 'items': {'$ref': '#/components/schemas/Attachment'},
2080
- 'description': 'Message attachments',
2081
- },
2082
- 'blocks': {
2083
- 'type': ['array', 'null'],
2084
- 'items': {'type': 'object'},
2085
- 'description': 'Block kit blocks',
2086
- },
2087
- 'files': {
2088
- 'type': ['array', 'null'],
2089
- 'items': {'$ref': '#/components/schemas/File'},
2090
- 'description': 'Files attached to the message',
2091
- },
2092
- 'edited': {
2093
- 'oneOf': [
2094
- {'$ref': '#/components/schemas/EditedInfo'},
2095
- {'type': 'null'},
2096
- ],
2097
- 'description': 'Edit information',
2098
- },
2099
- 'bot_id': {
2100
- 'type': ['string', 'null'],
2101
- 'description': 'Bot ID if message was sent by a bot',
2102
- },
2103
- 'bot_profile': {
2104
- 'oneOf': [
2105
- {'$ref': '#/components/schemas/BotProfile'},
2106
- {'type': 'null'},
2107
- ],
2108
- 'description': 'Bot profile information',
2109
- },
2110
- 'app_id': {
2111
- 'type': ['string', 'null'],
2112
- 'description': 'App ID if message was sent by an app',
3156
+ ),
3157
+ EntityDefinition(
3158
+ name='reactions',
3159
+ actions=[Action.CREATE],
3160
+ endpoints={
3161
+ Action.CREATE: EndpointDefinition(
3162
+ method='POST',
3163
+ path='/reactions.add',
3164
+ action=Action.CREATE,
3165
+ description='Adds a reaction (emoji) to a message',
3166
+ body_fields=['channel', 'timestamp', 'name'],
3167
+ request_schema={
3168
+ 'type': 'object',
3169
+ 'description': 'Parameters for adding a reaction',
3170
+ 'properties': {
3171
+ 'channel': {'type': 'string', 'description': 'Channel ID containing the message'},
3172
+ 'timestamp': {'type': 'string', 'description': 'Timestamp of the message to react to'},
3173
+ 'name': {'type': 'string', 'description': 'Reaction emoji name (without colons, e.g., "thumbsup")'},
3174
+ },
3175
+ 'required': ['channel', 'timestamp', 'name'],
2113
3176
  },
2114
- 'team': {
2115
- 'type': ['string', 'null'],
2116
- 'description': 'Team ID',
3177
+ response_schema={
3178
+ 'type': 'object',
3179
+ 'description': 'Response from adding a reaction',
3180
+ 'properties': {
3181
+ 'ok': {'type': 'boolean', 'description': 'Whether the request was successful'},
3182
+ },
2117
3183
  },
2118
- },
2119
- 'x-airbyte-entity-name': 'threads',
2120
- 'x-airbyte-stream-name': 'threads',
3184
+ record_extractor='$',
3185
+ ),
2121
3186
  },
2122
3187
  ),
2123
3188
  ],