@openclaw/googlechat 2026.5.2-beta.1

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.
Files changed (58) hide show
  1. package/api.ts +3 -0
  2. package/channel-config-api.ts +1 -0
  3. package/channel-plugin-api.ts +1 -0
  4. package/contract-api.ts +5 -0
  5. package/doctor-contract-api.ts +1 -0
  6. package/index.ts +20 -0
  7. package/openclaw.plugin.json +884 -0
  8. package/package.json +88 -0
  9. package/runtime-api.ts +60 -0
  10. package/secret-contract-api.ts +5 -0
  11. package/setup-entry.ts +13 -0
  12. package/setup-plugin-api.ts +3 -0
  13. package/src/accounts.ts +169 -0
  14. package/src/actions.test.ts +265 -0
  15. package/src/actions.ts +227 -0
  16. package/src/api.ts +322 -0
  17. package/src/approval-auth.test.ts +24 -0
  18. package/src/approval-auth.ts +32 -0
  19. package/src/auth.ts +209 -0
  20. package/src/channel-config.test.ts +39 -0
  21. package/src/channel.adapters.ts +293 -0
  22. package/src/channel.deps.runtime.ts +28 -0
  23. package/src/channel.runtime.ts +17 -0
  24. package/src/channel.setup.ts +98 -0
  25. package/src/channel.test.ts +695 -0
  26. package/src/channel.ts +256 -0
  27. package/src/config-schema.test.ts +16 -0
  28. package/src/config-schema.ts +3 -0
  29. package/src/doctor-contract.test.ts +75 -0
  30. package/src/doctor-contract.ts +182 -0
  31. package/src/doctor.ts +57 -0
  32. package/src/gateway.ts +63 -0
  33. package/src/google-auth.runtime.test.ts +462 -0
  34. package/src/google-auth.runtime.ts +539 -0
  35. package/src/group-policy.ts +17 -0
  36. package/src/monitor-access.test.ts +443 -0
  37. package/src/monitor-access.ts +405 -0
  38. package/src/monitor-reply-delivery.ts +156 -0
  39. package/src/monitor-routing.ts +55 -0
  40. package/src/monitor-types.ts +33 -0
  41. package/src/monitor-webhook.test.ts +446 -0
  42. package/src/monitor-webhook.ts +285 -0
  43. package/src/monitor.reply-delivery.test.ts +139 -0
  44. package/src/monitor.ts +428 -0
  45. package/src/monitor.webhook-routing.test.ts +252 -0
  46. package/src/runtime.ts +9 -0
  47. package/src/secret-contract.test.ts +60 -0
  48. package/src/secret-contract.ts +161 -0
  49. package/src/sender-allow.ts +46 -0
  50. package/src/setup-core.ts +40 -0
  51. package/src/setup-surface.ts +236 -0
  52. package/src/setup.test.ts +560 -0
  53. package/src/targets.test.ts +421 -0
  54. package/src/targets.ts +66 -0
  55. package/src/types.config.ts +3 -0
  56. package/src/types.ts +73 -0
  57. package/test-api.ts +2 -0
  58. package/tsconfig.json +16 -0
@@ -0,0 +1,884 @@
1
+ {
2
+ "id": "googlechat",
3
+ "activation": {
4
+ "onStartup": false
5
+ },
6
+ "channels": [
7
+ "googlechat"
8
+ ],
9
+ "channelEnvVars": {
10
+ "googlechat": [
11
+ "GOOGLE_CHAT_SERVICE_ACCOUNT",
12
+ "GOOGLE_CHAT_SERVICE_ACCOUNT_FILE"
13
+ ]
14
+ },
15
+ "configSchema": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "properties": {}
19
+ },
20
+ "channelConfigs": {
21
+ "googlechat": {
22
+ "schema": {
23
+ "$schema": "http://json-schema.org/draft-07/schema#",
24
+ "type": "object",
25
+ "properties": {
26
+ "name": {
27
+ "type": "string"
28
+ },
29
+ "capabilities": {
30
+ "type": "array",
31
+ "items": {
32
+ "type": "string"
33
+ }
34
+ },
35
+ "enabled": {
36
+ "type": "boolean"
37
+ },
38
+ "configWrites": {
39
+ "type": "boolean"
40
+ },
41
+ "allowBots": {
42
+ "type": "boolean"
43
+ },
44
+ "dangerouslyAllowNameMatching": {
45
+ "type": "boolean"
46
+ },
47
+ "requireMention": {
48
+ "type": "boolean"
49
+ },
50
+ "groupPolicy": {
51
+ "default": "allowlist",
52
+ "type": "string",
53
+ "enum": [
54
+ "open",
55
+ "disabled",
56
+ "allowlist"
57
+ ]
58
+ },
59
+ "groupAllowFrom": {
60
+ "type": "array",
61
+ "items": {
62
+ "anyOf": [
63
+ {
64
+ "type": "string"
65
+ },
66
+ {
67
+ "type": "number"
68
+ }
69
+ ]
70
+ }
71
+ },
72
+ "groups": {
73
+ "type": "object",
74
+ "propertyNames": {
75
+ "type": "string"
76
+ },
77
+ "additionalProperties": {
78
+ "type": "object",
79
+ "properties": {
80
+ "enabled": {
81
+ "type": "boolean"
82
+ },
83
+ "requireMention": {
84
+ "type": "boolean"
85
+ },
86
+ "users": {
87
+ "type": "array",
88
+ "items": {
89
+ "anyOf": [
90
+ {
91
+ "type": "string"
92
+ },
93
+ {
94
+ "type": "number"
95
+ }
96
+ ]
97
+ }
98
+ },
99
+ "systemPrompt": {
100
+ "type": "string"
101
+ }
102
+ },
103
+ "additionalProperties": false
104
+ }
105
+ },
106
+ "defaultTo": {
107
+ "type": "string"
108
+ },
109
+ "serviceAccount": {
110
+ "anyOf": [
111
+ {
112
+ "type": "string"
113
+ },
114
+ {
115
+ "type": "object",
116
+ "propertyNames": {
117
+ "type": "string"
118
+ },
119
+ "additionalProperties": {}
120
+ },
121
+ {
122
+ "oneOf": [
123
+ {
124
+ "type": "object",
125
+ "properties": {
126
+ "source": {
127
+ "type": "string",
128
+ "const": "env"
129
+ },
130
+ "provider": {
131
+ "type": "string",
132
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
133
+ },
134
+ "id": {
135
+ "type": "string",
136
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
137
+ }
138
+ },
139
+ "required": [
140
+ "source",
141
+ "provider",
142
+ "id"
143
+ ],
144
+ "additionalProperties": false
145
+ },
146
+ {
147
+ "type": "object",
148
+ "properties": {
149
+ "source": {
150
+ "type": "string",
151
+ "const": "file"
152
+ },
153
+ "provider": {
154
+ "type": "string",
155
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
156
+ },
157
+ "id": {
158
+ "type": "string"
159
+ }
160
+ },
161
+ "required": [
162
+ "source",
163
+ "provider",
164
+ "id"
165
+ ],
166
+ "additionalProperties": false
167
+ },
168
+ {
169
+ "type": "object",
170
+ "properties": {
171
+ "source": {
172
+ "type": "string",
173
+ "const": "exec"
174
+ },
175
+ "provider": {
176
+ "type": "string",
177
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
178
+ },
179
+ "id": {
180
+ "type": "string"
181
+ }
182
+ },
183
+ "required": [
184
+ "source",
185
+ "provider",
186
+ "id"
187
+ ],
188
+ "additionalProperties": false
189
+ }
190
+ ]
191
+ }
192
+ ]
193
+ },
194
+ "serviceAccountRef": {
195
+ "oneOf": [
196
+ {
197
+ "type": "object",
198
+ "properties": {
199
+ "source": {
200
+ "type": "string",
201
+ "const": "env"
202
+ },
203
+ "provider": {
204
+ "type": "string",
205
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
206
+ },
207
+ "id": {
208
+ "type": "string",
209
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
210
+ }
211
+ },
212
+ "required": [
213
+ "source",
214
+ "provider",
215
+ "id"
216
+ ],
217
+ "additionalProperties": false
218
+ },
219
+ {
220
+ "type": "object",
221
+ "properties": {
222
+ "source": {
223
+ "type": "string",
224
+ "const": "file"
225
+ },
226
+ "provider": {
227
+ "type": "string",
228
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
229
+ },
230
+ "id": {
231
+ "type": "string"
232
+ }
233
+ },
234
+ "required": [
235
+ "source",
236
+ "provider",
237
+ "id"
238
+ ],
239
+ "additionalProperties": false
240
+ },
241
+ {
242
+ "type": "object",
243
+ "properties": {
244
+ "source": {
245
+ "type": "string",
246
+ "const": "exec"
247
+ },
248
+ "provider": {
249
+ "type": "string",
250
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
251
+ },
252
+ "id": {
253
+ "type": "string"
254
+ }
255
+ },
256
+ "required": [
257
+ "source",
258
+ "provider",
259
+ "id"
260
+ ],
261
+ "additionalProperties": false
262
+ }
263
+ ]
264
+ },
265
+ "serviceAccountFile": {
266
+ "type": "string"
267
+ },
268
+ "audienceType": {
269
+ "type": "string",
270
+ "enum": [
271
+ "app-url",
272
+ "project-number"
273
+ ]
274
+ },
275
+ "audience": {
276
+ "type": "string"
277
+ },
278
+ "appPrincipal": {
279
+ "type": "string"
280
+ },
281
+ "webhookPath": {
282
+ "type": "string"
283
+ },
284
+ "webhookUrl": {
285
+ "type": "string"
286
+ },
287
+ "botUser": {
288
+ "type": "string"
289
+ },
290
+ "historyLimit": {
291
+ "type": "integer",
292
+ "minimum": 0,
293
+ "maximum": 9007199254740991
294
+ },
295
+ "dmHistoryLimit": {
296
+ "type": "integer",
297
+ "minimum": 0,
298
+ "maximum": 9007199254740991
299
+ },
300
+ "dms": {
301
+ "type": "object",
302
+ "propertyNames": {
303
+ "type": "string"
304
+ },
305
+ "additionalProperties": {
306
+ "type": "object",
307
+ "properties": {
308
+ "historyLimit": {
309
+ "type": "integer",
310
+ "minimum": 0,
311
+ "maximum": 9007199254740991
312
+ }
313
+ },
314
+ "additionalProperties": false
315
+ }
316
+ },
317
+ "textChunkLimit": {
318
+ "type": "integer",
319
+ "exclusiveMinimum": 0,
320
+ "maximum": 9007199254740991
321
+ },
322
+ "chunkMode": {
323
+ "type": "string",
324
+ "enum": [
325
+ "length",
326
+ "newline"
327
+ ]
328
+ },
329
+ "blockStreaming": {
330
+ "type": "boolean"
331
+ },
332
+ "blockStreamingCoalesce": {
333
+ "type": "object",
334
+ "properties": {
335
+ "minChars": {
336
+ "type": "integer",
337
+ "exclusiveMinimum": 0,
338
+ "maximum": 9007199254740991
339
+ },
340
+ "maxChars": {
341
+ "type": "integer",
342
+ "exclusiveMinimum": 0,
343
+ "maximum": 9007199254740991
344
+ },
345
+ "idleMs": {
346
+ "type": "integer",
347
+ "minimum": 0,
348
+ "maximum": 9007199254740991
349
+ }
350
+ },
351
+ "additionalProperties": false
352
+ },
353
+ "mediaMaxMb": {
354
+ "type": "number",
355
+ "exclusiveMinimum": 0
356
+ },
357
+ "replyToMode": {
358
+ "anyOf": [
359
+ {
360
+ "type": "string",
361
+ "const": "off"
362
+ },
363
+ {
364
+ "type": "string",
365
+ "const": "first"
366
+ },
367
+ {
368
+ "type": "string",
369
+ "const": "all"
370
+ },
371
+ {
372
+ "type": "string",
373
+ "const": "batched"
374
+ }
375
+ ]
376
+ },
377
+ "actions": {
378
+ "type": "object",
379
+ "properties": {
380
+ "reactions": {
381
+ "type": "boolean"
382
+ }
383
+ },
384
+ "additionalProperties": false
385
+ },
386
+ "dm": {
387
+ "type": "object",
388
+ "properties": {
389
+ "enabled": {
390
+ "type": "boolean"
391
+ },
392
+ "policy": {
393
+ "default": "pairing",
394
+ "type": "string",
395
+ "enum": [
396
+ "pairing",
397
+ "allowlist",
398
+ "open",
399
+ "disabled"
400
+ ]
401
+ },
402
+ "allowFrom": {
403
+ "type": "array",
404
+ "items": {
405
+ "anyOf": [
406
+ {
407
+ "type": "string"
408
+ },
409
+ {
410
+ "type": "number"
411
+ }
412
+ ]
413
+ }
414
+ }
415
+ },
416
+ "required": [
417
+ "policy"
418
+ ],
419
+ "additionalProperties": false
420
+ },
421
+ "healthMonitor": {
422
+ "type": "object",
423
+ "properties": {
424
+ "enabled": {
425
+ "type": "boolean"
426
+ }
427
+ },
428
+ "additionalProperties": false
429
+ },
430
+ "typingIndicator": {
431
+ "type": "string",
432
+ "enum": [
433
+ "none",
434
+ "message",
435
+ "reaction"
436
+ ]
437
+ },
438
+ "responsePrefix": {
439
+ "type": "string"
440
+ },
441
+ "accounts": {
442
+ "type": "object",
443
+ "propertyNames": {
444
+ "type": "string"
445
+ },
446
+ "additionalProperties": {
447
+ "type": "object",
448
+ "properties": {
449
+ "name": {
450
+ "type": "string"
451
+ },
452
+ "capabilities": {
453
+ "type": "array",
454
+ "items": {
455
+ "type": "string"
456
+ }
457
+ },
458
+ "enabled": {
459
+ "type": "boolean"
460
+ },
461
+ "configWrites": {
462
+ "type": "boolean"
463
+ },
464
+ "allowBots": {
465
+ "type": "boolean"
466
+ },
467
+ "dangerouslyAllowNameMatching": {
468
+ "type": "boolean"
469
+ },
470
+ "requireMention": {
471
+ "type": "boolean"
472
+ },
473
+ "groupPolicy": {
474
+ "default": "allowlist",
475
+ "type": "string",
476
+ "enum": [
477
+ "open",
478
+ "disabled",
479
+ "allowlist"
480
+ ]
481
+ },
482
+ "groupAllowFrom": {
483
+ "type": "array",
484
+ "items": {
485
+ "anyOf": [
486
+ {
487
+ "type": "string"
488
+ },
489
+ {
490
+ "type": "number"
491
+ }
492
+ ]
493
+ }
494
+ },
495
+ "groups": {
496
+ "type": "object",
497
+ "propertyNames": {
498
+ "type": "string"
499
+ },
500
+ "additionalProperties": {
501
+ "type": "object",
502
+ "properties": {
503
+ "enabled": {
504
+ "type": "boolean"
505
+ },
506
+ "requireMention": {
507
+ "type": "boolean"
508
+ },
509
+ "users": {
510
+ "type": "array",
511
+ "items": {
512
+ "anyOf": [
513
+ {
514
+ "type": "string"
515
+ },
516
+ {
517
+ "type": "number"
518
+ }
519
+ ]
520
+ }
521
+ },
522
+ "systemPrompt": {
523
+ "type": "string"
524
+ }
525
+ },
526
+ "additionalProperties": false
527
+ }
528
+ },
529
+ "defaultTo": {
530
+ "type": "string"
531
+ },
532
+ "serviceAccount": {
533
+ "anyOf": [
534
+ {
535
+ "type": "string"
536
+ },
537
+ {
538
+ "type": "object",
539
+ "propertyNames": {
540
+ "type": "string"
541
+ },
542
+ "additionalProperties": {}
543
+ },
544
+ {
545
+ "oneOf": [
546
+ {
547
+ "type": "object",
548
+ "properties": {
549
+ "source": {
550
+ "type": "string",
551
+ "const": "env"
552
+ },
553
+ "provider": {
554
+ "type": "string",
555
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
556
+ },
557
+ "id": {
558
+ "type": "string",
559
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
560
+ }
561
+ },
562
+ "required": [
563
+ "source",
564
+ "provider",
565
+ "id"
566
+ ],
567
+ "additionalProperties": false
568
+ },
569
+ {
570
+ "type": "object",
571
+ "properties": {
572
+ "source": {
573
+ "type": "string",
574
+ "const": "file"
575
+ },
576
+ "provider": {
577
+ "type": "string",
578
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
579
+ },
580
+ "id": {
581
+ "type": "string"
582
+ }
583
+ },
584
+ "required": [
585
+ "source",
586
+ "provider",
587
+ "id"
588
+ ],
589
+ "additionalProperties": false
590
+ },
591
+ {
592
+ "type": "object",
593
+ "properties": {
594
+ "source": {
595
+ "type": "string",
596
+ "const": "exec"
597
+ },
598
+ "provider": {
599
+ "type": "string",
600
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
601
+ },
602
+ "id": {
603
+ "type": "string"
604
+ }
605
+ },
606
+ "required": [
607
+ "source",
608
+ "provider",
609
+ "id"
610
+ ],
611
+ "additionalProperties": false
612
+ }
613
+ ]
614
+ }
615
+ ]
616
+ },
617
+ "serviceAccountRef": {
618
+ "oneOf": [
619
+ {
620
+ "type": "object",
621
+ "properties": {
622
+ "source": {
623
+ "type": "string",
624
+ "const": "env"
625
+ },
626
+ "provider": {
627
+ "type": "string",
628
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
629
+ },
630
+ "id": {
631
+ "type": "string",
632
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
633
+ }
634
+ },
635
+ "required": [
636
+ "source",
637
+ "provider",
638
+ "id"
639
+ ],
640
+ "additionalProperties": false
641
+ },
642
+ {
643
+ "type": "object",
644
+ "properties": {
645
+ "source": {
646
+ "type": "string",
647
+ "const": "file"
648
+ },
649
+ "provider": {
650
+ "type": "string",
651
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
652
+ },
653
+ "id": {
654
+ "type": "string"
655
+ }
656
+ },
657
+ "required": [
658
+ "source",
659
+ "provider",
660
+ "id"
661
+ ],
662
+ "additionalProperties": false
663
+ },
664
+ {
665
+ "type": "object",
666
+ "properties": {
667
+ "source": {
668
+ "type": "string",
669
+ "const": "exec"
670
+ },
671
+ "provider": {
672
+ "type": "string",
673
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
674
+ },
675
+ "id": {
676
+ "type": "string"
677
+ }
678
+ },
679
+ "required": [
680
+ "source",
681
+ "provider",
682
+ "id"
683
+ ],
684
+ "additionalProperties": false
685
+ }
686
+ ]
687
+ },
688
+ "serviceAccountFile": {
689
+ "type": "string"
690
+ },
691
+ "audienceType": {
692
+ "type": "string",
693
+ "enum": [
694
+ "app-url",
695
+ "project-number"
696
+ ]
697
+ },
698
+ "audience": {
699
+ "type": "string"
700
+ },
701
+ "appPrincipal": {
702
+ "type": "string"
703
+ },
704
+ "webhookPath": {
705
+ "type": "string"
706
+ },
707
+ "webhookUrl": {
708
+ "type": "string"
709
+ },
710
+ "botUser": {
711
+ "type": "string"
712
+ },
713
+ "historyLimit": {
714
+ "type": "integer",
715
+ "minimum": 0,
716
+ "maximum": 9007199254740991
717
+ },
718
+ "dmHistoryLimit": {
719
+ "type": "integer",
720
+ "minimum": 0,
721
+ "maximum": 9007199254740991
722
+ },
723
+ "dms": {
724
+ "type": "object",
725
+ "propertyNames": {
726
+ "type": "string"
727
+ },
728
+ "additionalProperties": {
729
+ "type": "object",
730
+ "properties": {
731
+ "historyLimit": {
732
+ "type": "integer",
733
+ "minimum": 0,
734
+ "maximum": 9007199254740991
735
+ }
736
+ },
737
+ "additionalProperties": false
738
+ }
739
+ },
740
+ "textChunkLimit": {
741
+ "type": "integer",
742
+ "exclusiveMinimum": 0,
743
+ "maximum": 9007199254740991
744
+ },
745
+ "chunkMode": {
746
+ "type": "string",
747
+ "enum": [
748
+ "length",
749
+ "newline"
750
+ ]
751
+ },
752
+ "blockStreaming": {
753
+ "type": "boolean"
754
+ },
755
+ "blockStreamingCoalesce": {
756
+ "type": "object",
757
+ "properties": {
758
+ "minChars": {
759
+ "type": "integer",
760
+ "exclusiveMinimum": 0,
761
+ "maximum": 9007199254740991
762
+ },
763
+ "maxChars": {
764
+ "type": "integer",
765
+ "exclusiveMinimum": 0,
766
+ "maximum": 9007199254740991
767
+ },
768
+ "idleMs": {
769
+ "type": "integer",
770
+ "minimum": 0,
771
+ "maximum": 9007199254740991
772
+ }
773
+ },
774
+ "additionalProperties": false
775
+ },
776
+ "mediaMaxMb": {
777
+ "type": "number",
778
+ "exclusiveMinimum": 0
779
+ },
780
+ "replyToMode": {
781
+ "anyOf": [
782
+ {
783
+ "type": "string",
784
+ "const": "off"
785
+ },
786
+ {
787
+ "type": "string",
788
+ "const": "first"
789
+ },
790
+ {
791
+ "type": "string",
792
+ "const": "all"
793
+ },
794
+ {
795
+ "type": "string",
796
+ "const": "batched"
797
+ }
798
+ ]
799
+ },
800
+ "actions": {
801
+ "type": "object",
802
+ "properties": {
803
+ "reactions": {
804
+ "type": "boolean"
805
+ }
806
+ },
807
+ "additionalProperties": false
808
+ },
809
+ "dm": {
810
+ "type": "object",
811
+ "properties": {
812
+ "enabled": {
813
+ "type": "boolean"
814
+ },
815
+ "policy": {
816
+ "default": "pairing",
817
+ "type": "string",
818
+ "enum": [
819
+ "pairing",
820
+ "allowlist",
821
+ "open",
822
+ "disabled"
823
+ ]
824
+ },
825
+ "allowFrom": {
826
+ "type": "array",
827
+ "items": {
828
+ "anyOf": [
829
+ {
830
+ "type": "string"
831
+ },
832
+ {
833
+ "type": "number"
834
+ }
835
+ ]
836
+ }
837
+ }
838
+ },
839
+ "required": [
840
+ "policy"
841
+ ],
842
+ "additionalProperties": false
843
+ },
844
+ "healthMonitor": {
845
+ "type": "object",
846
+ "properties": {
847
+ "enabled": {
848
+ "type": "boolean"
849
+ }
850
+ },
851
+ "additionalProperties": false
852
+ },
853
+ "typingIndicator": {
854
+ "type": "string",
855
+ "enum": [
856
+ "none",
857
+ "message",
858
+ "reaction"
859
+ ]
860
+ },
861
+ "responsePrefix": {
862
+ "type": "string"
863
+ }
864
+ },
865
+ "required": [
866
+ "groupPolicy"
867
+ ],
868
+ "additionalProperties": false
869
+ }
870
+ },
871
+ "defaultAccount": {
872
+ "type": "string"
873
+ }
874
+ },
875
+ "required": [
876
+ "groupPolicy"
877
+ ],
878
+ "additionalProperties": false
879
+ },
880
+ "label": "Google Chat",
881
+ "description": "Google Workspace Chat app with HTTP webhook."
882
+ }
883
+ }
884
+ }