@devosurf/tesser-connectors 0.1.0-alpha.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/manifest.json ADDED
@@ -0,0 +1,794 @@
1
+ {
2
+ "generatedBy": "connectors/scripts/codegen.ts",
3
+ "connectors": [
4
+ {
5
+ "id": "anthropic",
6
+ "auth": {
7
+ "default": {
8
+ "kind": "apiKey",
9
+ "in": "header",
10
+ "name": "x-api-key",
11
+ "describe": "Anthropic API key"
12
+ }
13
+ },
14
+ "actions": [],
15
+ "modelProvider": {
16
+ "aliases": {
17
+ "fast": "claude-haiku-4-5",
18
+ "smart": "claude-sonnet-4-6",
19
+ "deep": "claude-opus-4-8"
20
+ }
21
+ },
22
+ "triggers": [],
23
+ "describe": "Anthropic Claude direct model API",
24
+ "provider": "anthropic",
25
+ "providerFacts": {
26
+ "id": "anthropic",
27
+ "displayName": "Anthropic",
28
+ "baseUrl": "https://api.anthropic.com",
29
+ "docsUrl": "https://docs.anthropic.com"
30
+ }
31
+ },
32
+ {
33
+ "id": "claude-code",
34
+ "auth": {
35
+ "apiKey": {
36
+ "kind": "apiKey",
37
+ "in": "header",
38
+ "name": "ANTHROPIC_API_KEY",
39
+ "describe": "Anthropic API key for Claude Code --bare"
40
+ },
41
+ "subscription": {
42
+ "kind": "custom",
43
+ "fields": [
44
+ "oauth_token"
45
+ ],
46
+ "describe": "Claude Code subscription token from `claude setup-token`"
47
+ }
48
+ },
49
+ "actions": [],
50
+ "harnessProvider": {
51
+ "adapter": "claude-code-print-json"
52
+ },
53
+ "triggers": [],
54
+ "describe": "Claude Code one-shot Harness runner"
55
+ },
56
+ {
57
+ "id": "github",
58
+ "auth": {
59
+ "oauth": {
60
+ "kind": "oauth2",
61
+ "scopes": [
62
+ "repo"
63
+ ],
64
+ "flow": "auth_code",
65
+ "provider": "github"
66
+ },
67
+ "token": {
68
+ "kind": "apiKey",
69
+ "in": "header",
70
+ "name": "Authorization",
71
+ "prefix": "Bearer ",
72
+ "describe": "Personal access token (repo scope)"
73
+ }
74
+ },
75
+ "actions": [
76
+ {
77
+ "path": "issues.list",
78
+ "safety": "read",
79
+ "retrySafe": true,
80
+ "describe": "List issues — across your repos, or one repo when `repo` is set"
81
+ },
82
+ {
83
+ "path": "issues.create",
84
+ "safety": "write",
85
+ "retrySafe": false,
86
+ "describe": "Open an issue"
87
+ },
88
+ {
89
+ "path": "issues.comment",
90
+ "safety": "write",
91
+ "retrySafe": false,
92
+ "describe": "Comment on an issue"
93
+ },
94
+ {
95
+ "path": "repos.get",
96
+ "safety": "read",
97
+ "retrySafe": true,
98
+ "describe": "Fetch one repository"
99
+ }
100
+ ],
101
+ "triggers": [
102
+ {
103
+ "id": "issueOpened",
104
+ "strategy": "webhook",
105
+ "registerMode": "auto",
106
+ "event": "issues",
107
+ "describe": "Fires when an issue is opened"
108
+ },
109
+ {
110
+ "id": "newIssue",
111
+ "strategy": "poll",
112
+ "intervalDefault": "2m",
113
+ "intervalFloor": "30s",
114
+ "describe": "Fires for each newly created issue (poll)"
115
+ }
116
+ ],
117
+ "describe": "GitHub repositories, issues, and webhooks",
118
+ "provider": "github",
119
+ "providerFacts": {
120
+ "id": "github",
121
+ "displayName": "GitHub",
122
+ "baseUrl": "https://api.github.com",
123
+ "docsUrl": "https://docs.github.com/rest",
124
+ "oauth2": {
125
+ "authorizeUrl": "https://github.com/login/oauth/authorize",
126
+ "tokenUrl": "https://github.com/login/oauth/access_token",
127
+ "clientAuth": "body",
128
+ "scopeSeparator": " ",
129
+ "pkce": true
130
+ }
131
+ },
132
+ "webhookVerify": "hmacSha256"
133
+ },
134
+ {
135
+ "id": "gmail",
136
+ "auth": {
137
+ "default": {
138
+ "kind": "oauth2",
139
+ "scopes": [
140
+ "https://www.googleapis.com/auth/gmail.readonly",
141
+ "https://www.googleapis.com/auth/gmail.send",
142
+ "https://www.googleapis.com/auth/gmail.modify",
143
+ "https://www.googleapis.com/auth/gmail.labels"
144
+ ],
145
+ "flow": "auth_code",
146
+ "provider": "google"
147
+ }
148
+ },
149
+ "actions": [
150
+ {
151
+ "path": "messages.list",
152
+ "safety": "read",
153
+ "retrySafe": true,
154
+ "describe": "List message ids matching a Gmail query"
155
+ },
156
+ {
157
+ "path": "messages.send",
158
+ "safety": "write",
159
+ "retrySafe": false,
160
+ "describe": "Send an email (plain text or HTML; optional cc and reply threading)"
161
+ },
162
+ {
163
+ "path": "messages.get",
164
+ "safety": "read",
165
+ "retrySafe": true,
166
+ "describe": "Fetch one message's headers + snippet"
167
+ },
168
+ {
169
+ "path": "messages.modify",
170
+ "safety": "write",
171
+ "retrySafe": true,
172
+ "describe": "Add and/or remove labels on a message"
173
+ },
174
+ {
175
+ "path": "messages.markRead",
176
+ "safety": "write",
177
+ "retrySafe": true,
178
+ "describe": "Mark a message read (removes the UNREAD label)"
179
+ },
180
+ {
181
+ "path": "messages.archive",
182
+ "safety": "write",
183
+ "retrySafe": true,
184
+ "describe": "Archive a message (removes the INBOX label)"
185
+ },
186
+ {
187
+ "path": "messages.trash",
188
+ "safety": "write",
189
+ "retrySafe": true,
190
+ "describe": "Move a message to the trash"
191
+ },
192
+ {
193
+ "path": "messages.attachments.get",
194
+ "safety": "read",
195
+ "retrySafe": true,
196
+ "describe": "Download one message attachment (base64url data)"
197
+ },
198
+ {
199
+ "path": "labels.list",
200
+ "safety": "read",
201
+ "retrySafe": true,
202
+ "describe": "List all labels (resolve a label name to its id)"
203
+ },
204
+ {
205
+ "path": "labels.create",
206
+ "safety": "write",
207
+ "retrySafe": false,
208
+ "describe": "Create a user label"
209
+ },
210
+ {
211
+ "path": "drafts.create",
212
+ "safety": "write",
213
+ "retrySafe": false,
214
+ "describe": "Create a draft from a plain-text or HTML message"
215
+ },
216
+ {
217
+ "path": "drafts.send",
218
+ "safety": "write",
219
+ "retrySafe": false,
220
+ "describe": "Send an existing draft (the draft id goes in the body, not the path)"
221
+ },
222
+ {
223
+ "path": "threads.get",
224
+ "safety": "read",
225
+ "retrySafe": true,
226
+ "describe": "Fetch a whole conversation (all messages in one call)"
227
+ }
228
+ ],
229
+ "triggers": [
230
+ {
231
+ "id": "messageReceived",
232
+ "strategy": "poll",
233
+ "intervalDefault": "1m",
234
+ "intervalFloor": "30s",
235
+ "describe": "Fires for each new email in the connected inbox (optionally matching a Gmail query)"
236
+ }
237
+ ],
238
+ "describe": "Gmail — read, send, label, draft, and organize mail as the connected account",
239
+ "provider": "google",
240
+ "providerFacts": {
241
+ "id": "google",
242
+ "displayName": "Google",
243
+ "docsUrl": "https://developers.google.com/identity/protocols/oauth2",
244
+ "oauth2": {
245
+ "authorizeUrl": "https://accounts.google.com/o/oauth2/v2/auth",
246
+ "tokenUrl": "https://oauth2.googleapis.com/token",
247
+ "clientAuth": "body",
248
+ "scopeSeparator": " ",
249
+ "pkce": true,
250
+ "extraAuthorizeParams": {
251
+ "access_type": "offline",
252
+ "prompt": "consent"
253
+ }
254
+ }
255
+ },
256
+ "baseUrl": "https://gmail.googleapis.com/gmail/v1"
257
+ },
258
+ {
259
+ "id": "google-calendar",
260
+ "auth": {
261
+ "default": {
262
+ "kind": "oauth2",
263
+ "scopes": [
264
+ "https://www.googleapis.com/auth/calendar.events",
265
+ "https://www.googleapis.com/auth/calendar.readonly"
266
+ ],
267
+ "flow": "auth_code",
268
+ "provider": "google"
269
+ }
270
+ },
271
+ "actions": [
272
+ {
273
+ "path": "events.list",
274
+ "safety": "read",
275
+ "retrySafe": true,
276
+ "describe": "List upcoming events"
277
+ },
278
+ {
279
+ "path": "events.get",
280
+ "safety": "read",
281
+ "retrySafe": true,
282
+ "describe": "Fetch one event by id"
283
+ },
284
+ {
285
+ "path": "events.create",
286
+ "safety": "write",
287
+ "retrySafe": false,
288
+ "describe": "Create an event"
289
+ },
290
+ {
291
+ "path": "events.update",
292
+ "safety": "write",
293
+ "retrySafe": false,
294
+ "describe": "Replace an event (full PUT)"
295
+ },
296
+ {
297
+ "path": "events.delete",
298
+ "safety": "write",
299
+ "retrySafe": false,
300
+ "describe": "Delete an event; deleting an already-gone event is a no-op success"
301
+ },
302
+ {
303
+ "path": "calendars.list",
304
+ "safety": "read",
305
+ "retrySafe": true,
306
+ "describe": "List calendars on the connected account"
307
+ },
308
+ {
309
+ "path": "freebusy.query",
310
+ "safety": "read",
311
+ "retrySafe": true,
312
+ "describe": "Query busy windows for one or more calendars"
313
+ }
314
+ ],
315
+ "triggers": [
316
+ {
317
+ "id": "eventCreated",
318
+ "strategy": "poll",
319
+ "intervalDefault": "2m",
320
+ "intervalFloor": "1m",
321
+ "describe": "Fires for each newly created or changed event (syncToken poll)"
322
+ },
323
+ {
324
+ "id": "eventStarting",
325
+ "strategy": "poll",
326
+ "intervalDefault": "1m",
327
+ "intervalFloor": "1m",
328
+ "describe": "Fires for each event entering the upcoming window (poll)"
329
+ }
330
+ ],
331
+ "describe": "Google Calendar events",
332
+ "provider": "google",
333
+ "providerFacts": {
334
+ "id": "google",
335
+ "displayName": "Google",
336
+ "docsUrl": "https://developers.google.com/identity/protocols/oauth2",
337
+ "oauth2": {
338
+ "authorizeUrl": "https://accounts.google.com/o/oauth2/v2/auth",
339
+ "tokenUrl": "https://oauth2.googleapis.com/token",
340
+ "clientAuth": "body",
341
+ "scopeSeparator": " ",
342
+ "pkce": true,
343
+ "extraAuthorizeParams": {
344
+ "access_type": "offline",
345
+ "prompt": "consent"
346
+ }
347
+ }
348
+ },
349
+ "baseUrl": "https://www.googleapis.com/calendar/v3"
350
+ },
351
+ {
352
+ "id": "google-docs",
353
+ "auth": {
354
+ "default": {
355
+ "kind": "oauth2",
356
+ "scopes": [
357
+ "https://www.googleapis.com/auth/documents",
358
+ "https://www.googleapis.com/auth/drive.file"
359
+ ],
360
+ "flow": "auth_code",
361
+ "provider": "google"
362
+ }
363
+ },
364
+ "actions": [
365
+ {
366
+ "path": "documents.get",
367
+ "safety": "read",
368
+ "retrySafe": true,
369
+ "describe": "Read a document's title and full plain text"
370
+ },
371
+ {
372
+ "path": "documents.create",
373
+ "safety": "write",
374
+ "retrySafe": false,
375
+ "describe": "Create a new blank document with the given title"
376
+ },
377
+ {
378
+ "path": "documents.appendText",
379
+ "safety": "write",
380
+ "retrySafe": false,
381
+ "describe": "Append text to the end of a document's body (no index math)"
382
+ },
383
+ {
384
+ "path": "documents.replacePlaceholders",
385
+ "safety": "write",
386
+ "retrySafe": false,
387
+ "describe": "Replace placeholder tokens throughout a document (one atomic batch)"
388
+ }
389
+ ],
390
+ "triggers": [],
391
+ "describe": "Google Docs — read, create, and template-fill documents",
392
+ "provider": "google",
393
+ "providerFacts": {
394
+ "id": "google",
395
+ "displayName": "Google",
396
+ "docsUrl": "https://developers.google.com/identity/protocols/oauth2",
397
+ "oauth2": {
398
+ "authorizeUrl": "https://accounts.google.com/o/oauth2/v2/auth",
399
+ "tokenUrl": "https://oauth2.googleapis.com/token",
400
+ "clientAuth": "body",
401
+ "scopeSeparator": " ",
402
+ "pkce": true,
403
+ "extraAuthorizeParams": {
404
+ "access_type": "offline",
405
+ "prompt": "consent"
406
+ }
407
+ }
408
+ },
409
+ "baseUrl": "https://docs.googleapis.com/v1"
410
+ },
411
+ {
412
+ "id": "google-drive",
413
+ "auth": {
414
+ "default": {
415
+ "kind": "oauth2",
416
+ "scopes": [
417
+ "https://www.googleapis.com/auth/drive.file"
418
+ ],
419
+ "flow": "auth_code",
420
+ "provider": "google"
421
+ }
422
+ },
423
+ "actions": [
424
+ {
425
+ "path": "files.list",
426
+ "safety": "read",
427
+ "retrySafe": true,
428
+ "describe": "List/search files visible to the app with a raw Drive q query (loops pages, ~10-page cap)"
429
+ },
430
+ {
431
+ "path": "files.get",
432
+ "safety": "read",
433
+ "retrySafe": true,
434
+ "describe": "Fetch one file's metadata"
435
+ },
436
+ {
437
+ "path": "files.createFolder",
438
+ "safety": "write",
439
+ "retrySafe": false,
440
+ "describe": "Create a folder (optionally under a parent folder)"
441
+ },
442
+ {
443
+ "path": "files.copy",
444
+ "safety": "write",
445
+ "retrySafe": false,
446
+ "describe": "Copy a file (no folder recursion; optionally rename/reparent)"
447
+ },
448
+ {
449
+ "path": "files.delete",
450
+ "safety": "write",
451
+ "retrySafe": false,
452
+ "describe": "Permanently delete a file (cascades on folders, irreversible)"
453
+ },
454
+ {
455
+ "path": "permissions.create",
456
+ "safety": "write",
457
+ "retrySafe": false,
458
+ "describe": "Grant a permission on a file (share with a user/group/domain/anyone)"
459
+ }
460
+ ],
461
+ "triggers": [
462
+ {
463
+ "id": "newFileInFolder",
464
+ "strategy": "poll",
465
+ "intervalDefault": "1m",
466
+ "intervalFloor": "30s",
467
+ "describe": "Fires for each new app-accessible file added to a folder (optionally filtered by mimeType)"
468
+ }
469
+ ],
470
+ "describe": "Google Drive — list, fetch, create, copy, and share app-created or user-opened files",
471
+ "provider": "google",
472
+ "providerFacts": {
473
+ "id": "google",
474
+ "displayName": "Google",
475
+ "docsUrl": "https://developers.google.com/identity/protocols/oauth2",
476
+ "oauth2": {
477
+ "authorizeUrl": "https://accounts.google.com/o/oauth2/v2/auth",
478
+ "tokenUrl": "https://oauth2.googleapis.com/token",
479
+ "clientAuth": "body",
480
+ "scopeSeparator": " ",
481
+ "pkce": true,
482
+ "extraAuthorizeParams": {
483
+ "access_type": "offline",
484
+ "prompt": "consent"
485
+ }
486
+ }
487
+ },
488
+ "baseUrl": "https://www.googleapis.com/drive/v3"
489
+ },
490
+ {
491
+ "id": "google-sheets",
492
+ "auth": {
493
+ "default": {
494
+ "kind": "oauth2",
495
+ "scopes": [
496
+ "https://www.googleapis.com/auth/spreadsheets",
497
+ "https://www.googleapis.com/auth/drive.file"
498
+ ],
499
+ "flow": "auth_code",
500
+ "provider": "google"
501
+ }
502
+ },
503
+ "actions": [
504
+ {
505
+ "path": "values.get",
506
+ "safety": "read",
507
+ "retrySafe": true,
508
+ "describe": "Read a range as rows (majorDimension ROWS)"
509
+ },
510
+ {
511
+ "path": "values.append",
512
+ "safety": "write",
513
+ "retrySafe": false,
514
+ "describe": "Append rows after the table touching {range} (non-idempotent)"
515
+ },
516
+ {
517
+ "path": "values.update",
518
+ "safety": "write",
519
+ "retrySafe": true,
520
+ "describe": "Overwrite a fixed range (idempotent-in-effect)"
521
+ },
522
+ {
523
+ "path": "values.clear",
524
+ "safety": "write",
525
+ "retrySafe": true,
526
+ "describe": "Clear values in a range (formatting kept; idempotent)"
527
+ },
528
+ {
529
+ "path": "spreadsheets.get",
530
+ "safety": "read",
531
+ "retrySafe": true,
532
+ "describe": "Fetch spreadsheet metadata (title + sheet list, no grid)"
533
+ },
534
+ {
535
+ "path": "spreadsheets.create",
536
+ "safety": "write",
537
+ "retrySafe": false,
538
+ "describe": "Create a spreadsheet (lands an app-scoped Drive file; non-idempotent)"
539
+ },
540
+ {
541
+ "path": "spreadsheets.addSheet",
542
+ "safety": "write",
543
+ "retrySafe": false,
544
+ "describe": "Add a tab via :batchUpdate addSheet"
545
+ }
546
+ ],
547
+ "triggers": [
548
+ {
549
+ "id": "newRow",
550
+ "strategy": "poll",
551
+ "intervalDefault": "1m",
552
+ "intervalFloor": "30s",
553
+ "describe": "Fires for each new row in a range (poll-only; Sheets has no webhook)"
554
+ }
555
+ ],
556
+ "describe": "Google Sheets — read and write spreadsheet values and structure",
557
+ "provider": "google",
558
+ "providerFacts": {
559
+ "id": "google",
560
+ "displayName": "Google",
561
+ "docsUrl": "https://developers.google.com/identity/protocols/oauth2",
562
+ "oauth2": {
563
+ "authorizeUrl": "https://accounts.google.com/o/oauth2/v2/auth",
564
+ "tokenUrl": "https://oauth2.googleapis.com/token",
565
+ "clientAuth": "body",
566
+ "scopeSeparator": " ",
567
+ "pkce": true,
568
+ "extraAuthorizeParams": {
569
+ "access_type": "offline",
570
+ "prompt": "consent"
571
+ }
572
+ }
573
+ },
574
+ "baseUrl": "https://sheets.googleapis.com/v4"
575
+ },
576
+ {
577
+ "id": "http",
578
+ "auth": {
579
+ "default": {
580
+ "kind": "custom",
581
+ "fields": [],
582
+ "describe": "No credential — requests go out as-is"
583
+ }
584
+ },
585
+ "actions": [
586
+ {
587
+ "path": "request",
588
+ "safety": "write",
589
+ "retrySafe": false,
590
+ "describe": "Perform an HTTP request (any method)"
591
+ },
592
+ {
593
+ "path": "get",
594
+ "safety": "read",
595
+ "retrySafe": true,
596
+ "describe": "Perform an HTTP GET"
597
+ }
598
+ ],
599
+ "triggers": [],
600
+ "describe": "Plain HTTP requests to any endpoint"
601
+ },
602
+ {
603
+ "id": "pi",
604
+ "auth": {
605
+ "anthropicApiKey": {
606
+ "kind": "apiKey",
607
+ "in": "header",
608
+ "name": "ANTHROPIC_API_KEY",
609
+ "describe": "Anthropic API key for Pi"
610
+ },
611
+ "anthropicOAuth": {
612
+ "kind": "custom",
613
+ "fields": [
614
+ "oauth_token"
615
+ ],
616
+ "describe": "Anthropic OAuth token for Pi"
617
+ }
618
+ },
619
+ "actions": [],
620
+ "harnessProvider": {
621
+ "adapter": "pi-print-json"
622
+ },
623
+ "triggers": [],
624
+ "describe": "Pi one-shot Harness runner"
625
+ },
626
+ {
627
+ "id": "resend",
628
+ "auth": {
629
+ "default": {
630
+ "kind": "apiKey",
631
+ "in": "header",
632
+ "name": "Authorization",
633
+ "prefix": "Bearer ",
634
+ "describe": "Resend API key (re_…)"
635
+ }
636
+ },
637
+ "actions": [
638
+ {
639
+ "path": "emails.send",
640
+ "safety": "write",
641
+ "retrySafe": true,
642
+ "describe": "Send an email"
643
+ }
644
+ ],
645
+ "triggers": [],
646
+ "describe": "Transactional email via Resend",
647
+ "provider": "resend",
648
+ "providerFacts": {
649
+ "id": "resend",
650
+ "displayName": "Resend",
651
+ "baseUrl": "https://api.resend.com",
652
+ "docsUrl": "https://resend.com/docs"
653
+ },
654
+ "idempotencyHeader": "Idempotency-Key"
655
+ },
656
+ {
657
+ "id": "slack",
658
+ "auth": {
659
+ "oauth": {
660
+ "kind": "oauth2",
661
+ "scopes": [
662
+ "chat:write",
663
+ "chat:write.public",
664
+ "channels:read",
665
+ "channels:history",
666
+ "groups:history",
667
+ "im:history",
668
+ "mpim:history",
669
+ "app_mentions:read",
670
+ "reactions:read",
671
+ "users:read",
672
+ "users:read.email"
673
+ ],
674
+ "flow": "auth_code",
675
+ "provider": "slack"
676
+ },
677
+ "token": {
678
+ "kind": "apiKey",
679
+ "in": "header",
680
+ "name": "Authorization",
681
+ "prefix": "Bearer ",
682
+ "describe": "Bot token (xoxb-…) with chat:write"
683
+ }
684
+ },
685
+ "actions": [
686
+ {
687
+ "path": "chat.postMessage",
688
+ "safety": "write",
689
+ "retrySafe": false,
690
+ "describe": "Post a message to a channel the app is in"
691
+ },
692
+ {
693
+ "path": "chat.update",
694
+ "safety": "write",
695
+ "retrySafe": false,
696
+ "describe": "Edit a message the app posted"
697
+ },
698
+ {
699
+ "path": "chat.delete",
700
+ "safety": "write",
701
+ "retrySafe": false,
702
+ "describe": "Delete a message the app posted"
703
+ },
704
+ {
705
+ "path": "chat.postEphemeral",
706
+ "safety": "write",
707
+ "retrySafe": false,
708
+ "describe": "Post a message only one user can see"
709
+ },
710
+ {
711
+ "path": "conversations.list",
712
+ "safety": "read",
713
+ "retrySafe": true,
714
+ "describe": "List channels visible to the app"
715
+ },
716
+ {
717
+ "path": "conversations.history",
718
+ "safety": "read",
719
+ "retrySafe": true,
720
+ "describe": "Read recent messages in a channel (cursor-paginated, newest first)"
721
+ },
722
+ {
723
+ "path": "conversations.replies",
724
+ "safety": "read",
725
+ "retrySafe": true,
726
+ "describe": "Read all messages in a thread (cursor-paginated)"
727
+ },
728
+ {
729
+ "path": "conversations.info",
730
+ "safety": "read",
731
+ "retrySafe": true,
732
+ "describe": "Fetch one channel's metadata"
733
+ },
734
+ {
735
+ "path": "reactions.add",
736
+ "safety": "write",
737
+ "retrySafe": false,
738
+ "describe": "Add an emoji reaction to a message"
739
+ },
740
+ {
741
+ "path": "users.info",
742
+ "safety": "read",
743
+ "retrySafe": true,
744
+ "describe": "Fetch one user's profile (email needs users:read.email)"
745
+ },
746
+ {
747
+ "path": "users.lookupByEmail",
748
+ "safety": "read",
749
+ "retrySafe": true,
750
+ "describe": "Find a user by email (needs users:read.email)"
751
+ }
752
+ ],
753
+ "triggers": [
754
+ {
755
+ "id": "messagePosted",
756
+ "strategy": "webhook",
757
+ "registerMode": "manual",
758
+ "event": "message",
759
+ "describe": "Fires for each message posted in a channel the app is in"
760
+ },
761
+ {
762
+ "id": "appMention",
763
+ "strategy": "webhook",
764
+ "registerMode": "manual",
765
+ "event": "app_mention",
766
+ "describe": "Fires when the app is @-mentioned in a channel"
767
+ },
768
+ {
769
+ "id": "reactionAdded",
770
+ "strategy": "webhook",
771
+ "registerMode": "manual",
772
+ "event": "reaction_added",
773
+ "describe": "Fires when someone adds an emoji reaction to a message"
774
+ }
775
+ ],
776
+ "describe": "Slack messaging",
777
+ "provider": "slack",
778
+ "providerFacts": {
779
+ "id": "slack",
780
+ "displayName": "Slack",
781
+ "baseUrl": "https://slack.com/api",
782
+ "docsUrl": "https://docs.slack.dev",
783
+ "oauth2": {
784
+ "authorizeUrl": "https://slack.com/oauth/v2/authorize",
785
+ "tokenUrl": "https://slack.com/api/oauth.v2.access",
786
+ "clientAuth": "body",
787
+ "scopeSeparator": ",",
788
+ "pkce": false
789
+ }
790
+ },
791
+ "webhookVerify": "slackSigning"
792
+ }
793
+ ]
794
+ }