social.colibri.sync.subscribeEvents

colibri.social

Schema Diff

+3 -0

From

CID
bafyreievhjau2il...
Indexed At
2026-07-31 21:23 UTC
View this version

To

CID
bafyreihrarl3uu6...
Indexed At
2026-08-15 21:21 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 2 non-breaking changes.

Non-Breaking Changes (2)
  • AddedVertex AddedVertex { vertex_id: "social.colibri.sync.subscribeEvents#messageEventData.live" }
  • AddedEdge AddedEdge { src: "social.colibri.sync.subscribeEvents#messageEventData", tgt: "social.colibri.sync.subscribeEvents#messageEventData.live", kind: "prop", name: Some("live") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "social.colibri.sync.subscribeEvents#messageEventData.live" }

Additional Notes

  • Non-breaking: AddedEdge { src: "social.colibri.sync.subscribeEvents#messageEventData", tgt: "social.colibri.sync.subscribeEvents#messageEventData.live", kind: "prop", name: Some("live") }
1 1
{
2 2
  "id": "social.colibri.sync.subscribeEvents",
3 3
  "defs": {
4 4
    "ack": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "type"
8 8
      ],
9 9
      "properties": {
10 10
        "type": {
11 11
          "type": "string",
12 12
          "const": "ack"
13 13
        }
14 14
      },
15 15
      "description": "Sent in response to a heartbeat message."
16 16
    },
17 17
    "main": {
18 18
      "type": "subscription",
19 19
      "errors": [
20 20
        {
21 21
          "name": "AuthRequired",
22 22
          "description": "Missing, malformed, or unverifiable service auth."
23 23
        }
24 24
      ],
25 25
      "message": {
26 26
        "schema": {
27 27
          "refs": [
28 28
            "lex:social.colibri.sync.subscribeEvents#ack",
29 29
            "lex:social.colibri.sync.subscribeEvents#communityEvent",
30 30
            "lex:social.colibri.sync.subscribeEvents#memberEvent",
31 31
            "lex:social.colibri.sync.subscribeEvents#categoryEvent",
32 32
            "lex:social.colibri.sync.subscribeEvents#channelEvent",
33 33
            "lex:social.colibri.sync.subscribeEvents#messageEvent",
34 34
            "lex:social.colibri.sync.subscribeEvents#reactionEvent",
35 35
            "lex:social.colibri.sync.subscribeEvents#userEvent",
36 36
            "lex:social.colibri.sync.subscribeEvents#typingEvent",
37 37
            "lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
38 38
            "lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
39 39
          ],
40 40
          "type": "union"
41 41
        }
42 42
      },
43 43
      "description": "Opens a WebSocket stream that transmits relevant events for the authenticated user."
44 44
    },
45 45
    "userEvent": {
46 46
      "type": "object",
47 47
      "required": [
48 48
        "type",
49 49
        "data"
50 50
      ],
51 51
      "properties": {
52 52
        "data": {
53 53
          "ref": "lex:social.colibri.sync.subscribeEvents#userEventData",
54 54
          "type": "ref"
55 55
        },
56 56
        "type": {
57 57
          "type": "string",
58 58
          "const": "user_event"
59 59
        }
60 60
      },
61 61
      "description": "Sent when a known user has updated their profile or Colibri status."
62 62
    },
63 63
    "userStatus": {
64 64
      "type": "object",
65 65
      "required": [
66 66
        "state",
67 67
        "text"
68 68
      ],
69 69
      "properties": {
70 70
        "text": {
71 71
          "type": "string"
72 72
        },
73 73
        "emoji": {
74 74
          "type": "string"
75 75
        },
76 76
        "state": {
77 77
          "type": "string",
78 78
          "knownValues": [
79 79
            "online",
80 80
            "away",
81 81
            "dnd",
82 82
            "offline"
83 83
          ]
84 84
        }
85 85
      }
86 86
    },
87 87
    "humEnvelope": {
88 88
      "type": "object",
89 89
      "required": [
90 90
        "origin",
91 91
        "id",
92 92
        "ttl",
93 93
        "subject",
94 94
        "community",
95 95
        "event"
96 96
      ],
97 97
      "properties": {
98 98
        "id": {
99 99
          "type": "string",
100 100
          "maxLength": 64,
101 101
          "description": "Unique id for this Hum, used by receivers to dedup across relay paths."
102 102
        },
103 103
        "ttl": {
104 104
          "type": "integer",
105 105
          "maximum": 8,
106 106
          "minimum": 0,
107 107
          "description": "Remaining relay hops. Decremented on each forward; a Hum at ttl 0 is delivered locally but never relayed."
108 108
        },
109 109
        "event": {
110 110
          "refs": [
111 111
            "lex:social.colibri.sync.subscribeEvents#userEvent",
112 112
            "lex:social.colibri.sync.subscribeEvents#typingEvent",
113 113
            "lex:social.colibri.sync.subscribeEvents#voicePresenceEvent",
114 114
            "lex:social.colibri.sync.subscribeEvents#voiceStateEvent"
115 115
          ],
116 116
          "type": "union",
117 117
          "description": "Ephemeral event payload. Only off-protocol types are permitted."
118 118
        },
119 119
        "origin": {
120 120
          "type": "string",
121 121
          "format": "did",
122 122
          "description": "DID of the AppView that first emitted this Hum."
123 123
        },
124 124
        "subject": {
125 125
          "type": "string",
126 126
          "format": "did",
127 127
          "description": "The user this event is about. Receiver MUST verify origin equals subject's declared presenceService before trusting or relaying."
128 128
        },
129 129
        "community": {
130 130
          "type": "string",
131 131
          "format": "at-uri",
132 132
          "description": "Community the event is scoped to. Receiver relays to local clients only if they are members of this community."
133 133
        }
134 134
      },
135 135
      "description": "An off-protocol event relayed between AppViews. The authenticated sender (inter-service auth JWT: aud = receiving AppView did:web, lxm = social.colibri.sync.sendHum) is the origin of record; `origin` is echoed for relay/loop control and MUST match the JWT issuer. Only off-protocol event types are permitted — on-protocol events are never carried by a Hum and are derived from the firehose instead."
136 136
    },
137 137
    "memberEvent": {
138 138
      "type": "object",
139 139
      "required": [
140 140
        "type",
141 141
        "data"
142 142
      ],
143 143
      "properties": {
144 144
        "data": {
145 145
          "ref": "lex:social.colibri.sync.subscribeEvents#memberEventData",
146 146
          "type": "ref"
147 147
        },
148 148
        "type": {
149 149
          "type": "string",
150 150
          "const": "member_event"
151 151
        }
152 152
      },
153 153
      "description": "Sent when a member has joined or left a community."
154 154
    },
155 155
    "typingEvent": {
156 156
      "type": "object",
157 157
      "required": [
158 158
        "type",
159 159
        "data"
160 160
      ],
161 161
      "properties": {
162 162
        "data": {
163 163
          "ref": "lex:social.colibri.sync.subscribeEvents#typingEventData",
164 164
          "type": "ref"
165 165
        },
166 166
        "type": {
167 167
          "type": "string",
168 168
          "const": "typing_event"
169 169
        }
170 170
      },
171 171
      "description": "Sent when a user is typing in a channel the client is viewing."
172 172
    },
173 173
    "userProfile": {
174 174
      "type": "object",
175 175
      "required": [
176 176
        "handle"
177 177
      ],
178 178
      "properties": {
179 179
        "avatar": {
180 180
          "type": "blob"
181 181
        },
182 182
        "banner": {
183 183
          "type": "blob"
184 184
        },
185 185
        "handle": {
186 186
          "type": "string",
187 187
          "format": "handle"
188 188
        },
189 189
        "description": {
190 190
          "type": "string"
191 191
        },
192 192
        "displayName": {
193 193
          "type": "string"
194 194
        }
195 195
      }
196 196
    },
197 197
    "channelEvent": {
198 198
      "type": "object",
199 199
      "required": [
200 200
        "type",
201 201
        "data"
202 202
      ],
203 203
      "properties": {
204 204
        "data": {
205 205
          "ref": "lex:social.colibri.sync.subscribeEvents#channelEventData",
206 206
          "type": "ref"
207 207
        },
208 208
        "type": {
209 209
          "type": "string",
210 210
          "const": "channel_event"
211 211
        }
212 212
      },
213 213
      "description": "Sent when a channel has been created, updated, or deleted."
214 214
    },
215 215
    "messageEvent": {
216 216
      "type": "object",
217 217
      "required": [
218 218
        "type",
219 219
        "data"
220 220
      ],
221 221
      "properties": {
222 222
        "data": {
223 223
          "ref": "lex:social.colibri.sync.subscribeEvents#messageEventData",
224 224
          "type": "ref"
225 225
        },
226 226
        "type": {
227 227
          "type": "string",
228 228
          "const": "message_event"
229 229
        }
230 230
      },
231 231
      "description": "Sent when a message has been sent, edited, or deleted."
232 232
    },
233 233
    "categoryEvent": {
234 234
      "type": "object",
235 235
      "required": [
236 236
        "type",
237 237
        "data"
238 238
      ],
239 239
      "properties": {
240 240
        "data": {
241 241
          "ref": "lex:social.colibri.sync.subscribeEvents#categoryEventData",
242 242
          "type": "ref"
243 243
        },
244 244
        "type": {
245 245
          "type": "string",
246 246
          "const": "category_event"
247 247
        }
248 248
      },
249 249
      "description": "Sent when a category has been created, updated, or deleted."
250 250
    },
251 251
    "reactionEvent": {
252 252
      "type": "object",
253 253
      "required": [
254 254
        "type",
255 255
        "data"
256 256
      ],
257 257
      "properties": {
258 258
        "data": {
259 259
          "ref": "lex:social.colibri.sync.subscribeEvents#reactionEventData",
260 260
          "type": "ref"
261 261
        },
262 262
        "type": {
263 263
          "type": "string",
264 264
          "const": "reaction_event"
265 265
        }
266 266
      },
267 267
      "description": "Sent when a reaction has been added to or removed from a message."
268 268
    },
269 269
    "userEventData": {
270 270
      "type": "object",
271 271
      "required": [
272 272
        "did",
273 273
        "profile"
274 274
      ],
275 275
      "properties": {
276 276
        "did": {
277 277
          "type": "string",
278 278
          "format": "did"
279 279
        },
280 280
        "status": {
281 281
          "ref": "lex:social.colibri.sync.subscribeEvents#userStatus",
282 282
          "type": "ref"
283 283
        },
284 284
        "profile": {
285 285
          "ref": "lex:social.colibri.sync.subscribeEvents#userProfile",
286 286
          "type": "ref"
287 287
        }
288 288
      }
289 289
    },
290 290
    "communityEvent": {
291 291
      "type": "object",
292 292
      "required": [
293 293
        "type",
294 294
        "data"
295 295
      ],
296 296
      "properties": {
297 297
        "data": {
298 298
          "ref": "lex:social.colibri.sync.subscribeEvents#communityEventData",
299 299
          "type": "ref"
300 300
        },
301 301
        "type": {
302 302
          "type": "string",
303 303
          "const": "community_event"
304 304
        }
305 305
      },
306 306
      "description": "Sent when a community has been updated or deleted."
307 307
    },
308 308
    "memberEventData": {
309 309
      "type": "object",
310 310
      "required": [
311 311
        "event",
312 312
        "community"
313 313
      ],
314 314
      "properties": {
315 315
        "event": {
316 316
          "type": "string",
317 317
          "knownValues": [
318 318
            "join",
319 319
            "leave",
320 320
            "roles_updated"
321 321
          ]
322 322
        },
323 323
        "member": {
324 324
          "ref": "lex:social.colibri.sync.subscribeEvents#memberEventMember",
325 325
          "type": "ref",
326 326
          "description": "The affected member, hydrated. Present on `join` and `roles_updated`."
327 327
        },
328 328
        "community": {
329 329
          "type": "string",
330 330
          "format": "at-uri"
331 331
        },
332 332
        "memberDid": {
333 333
          "type": "string",
334 334
          "format": "did",
335 335
          "description": "DID of the member who left. Present on `leave`."
336 336
        },
337 337
        "membership": {
338 338
          "type": "string",
339 339
          "format": "at-uri"
340 340
        }
341 341
      }
342 342
    },
343 343
    "typingEventData": {
344 344
      "type": "object",
345 345
      "required": [
346 346
        "event",
347 347
        "channel",
348 348
        "did"
349 349
      ],
350 350
      "properties": {
351 351
        "did": {
352 352
          "type": "string",
353 353
          "format": "did"
354 354
        },
355 355
        "event": {
356 356
          "type": "string",
357 357
          "knownValues": [
358 358
            "start",
359 359
            "stop"
360 360
          ]
361 361
        },
362 362
        "channel": {
363 363
          "type": "string",
364 364
          "format": "at-uri"
365 365
        }
366 366
      }
367 367
    },
368 368
    "voiceStateEvent": {
369 369
      "type": "object",
370 370
      "required": [
371 371
        "type",
372 372
        "data"
373 373
      ],
374 374
      "properties": {
375 375
        "data": {
376 376
          "ref": "lex:social.colibri.sync.subscribeEvents#voiceStateEventData",
377 377
          "type": "ref"
378 378
        },
379 379
        "type": {
380 380
          "type": "string",
381 381
          "const": "voice_state_event"
382 382
        }
383 383
      },
384 384
      "description": "Sent when a user's voice state changes within a voice channel. `muted` and `deafened` are the user's own choices; `serverMuted` and `serverDeafened` are moderator-applied and enforced by the SFU. Each field is absent when unchanged."
385 385
    },
386 386
    "channelEventData": {
387 387
      "type": "object",
388 388
      "required": [
389 389
        "event",
390 390
        "uri",
391 391
        "community"
392 392
      ],
393 393
      "properties": {
394 394
        "uri": {
395 395
          "type": "string",
396 396
          "format": "at-uri"
397 397
        },
398 398
        "name": {
399 399
          "type": "string"
400 400
        },
401 401
        "type": {
402 402
          "type": "string"
403 403
        },
404 404
        "event": {
405 405
          "type": "string",
406 406
          "knownValues": [
407 407
            "upsert",
408 408
            "delete"
409 409
          ]
410 410
        },
411 411
        "category": {
412 412
          "type": "string",
413 413
          "format": "at-uri"
414 414
        },
415 415
        "community": {
416 416
          "type": "string",
417 417
          "format": "at-uri"
418 418
        },
419 419
        "description": {
420 420
          "type": "string"
421 421
        }
422 422
      }
423 423
    },
424 424
    "messageEventData": {
425 425
      "type": "object",
426 426
      "required": [
427 427
        "event",
428 428
        "uri",
429 429
        "channel"
430 430
      ],
431 431
      "properties": {
432 432
        "uri": {
433 433
          "type": "string",
434 434
          "format": "at-uri"
435 435
        },
436 +
        "live": {
437 +
          "type": "boolean"
438 +
        },
436 439
        "text": {
437 440
          "type": "string"
438 441
        },
439 442
        "event": {
440 443
          "type": "string",
441 444
          "knownValues": [
442 445
            "upsert",
443 446
            "delete"
444 447
          ]
445 448
        },
446 449
        "edited": {
447 450
          "type": "boolean"
448 451
        },
449 452
        "facets": {
450 453
          "type": "array",
451 454
          "items": {
452 455
            "ref": "lex:social.colibri.richtext.facet",
453 456
            "type": "ref"
454 457
          }
455 458
        },
456 459
        "parent": {
457 460
          "type": "string",
458 461
          "format": "at-uri"
459 462
        },
460 463
        "channel": {
461 464
          "type": "string",
462 465
          "format": "at-uri"
463 466
        },
464 467
        "createdAt": {
465 468
          "type": "string",
466 469
          "format": "datetime"
467 470
        },
468 471
        "indexedAt": {
469 472
          "type": "string",
470 473
          "format": "datetime"
471 474
        },
472 475
        "attachments": {
473 476
          "type": "array",
474 477
          "items": {
475 478
            "type": "blob"
476 479
          }
477 480
        }
478 481
      }
479 482
    },
480 483
    "categoryEventData": {
481 484
      "type": "object",
482 485
      "required": [
483 486
        "event",
484 487
        "uri",
485 488
        "community"
486 489
      ],
487 490
      "properties": {
488 491
        "uri": {
489 492
          "type": "string",
490 493
          "format": "at-uri"
491 494
        },
492 495
        "name": {
493 496
          "type": "string"
494 497
        },
495 498
        "event": {
496 499
          "type": "string",
497 500
          "knownValues": [
498 501
            "upsert",
499 502
            "delete"
500 503
          ]
501 504
        },
502 505
        "community": {
503 506
          "type": "string",
504 507
          "format": "at-uri"
505 508
        },
506 509
        "channelOrder": {
507 510
          "type": "array",
508 511
          "items": {
509 512
            "type": "string",
510 513
            "format": "at-uri"
511 514
          }
512 515
        }
513 516
      }
514 517
    },
515 518
    "memberEventMember": {
516 519
      "type": "object",
517 520
      "required": [
518 521
        "did",
519 522
        "handle",
520 523
        "roles",
521 524
        "data"
522 525
      ],
523 526
      "properties": {
524 527
        "vc": {
525 528
          "type": "string",
526 529
          "format": "at-uri",
527 530
          "description": "AT-URI of the voice channel the member is currently connected to, if any. Only set when that channel belongs to `community`."
528 531
        },
529 532
        "did": {
530 533
          "type": "string",
531 534
          "format": "did"
532 535
        },
533 536
        "data": {
534 537
          "ref": "lex:social.colibri.actor.defs#actorData",
535 538
          "type": "ref"
536 539
        },
537 540
        "roles": {
538 541
          "type": "array",
539 542
          "items": {
540 543
            "type": "string",
541 544
            "format": "at-uri"
542 545
          }
543 546
        },
544 547
        "handle": {
545 548
          "type": "string",
546 549
          "format": "handle"
547 550
        },
548 551
        "vcMuted": {
549 552
          "type": "boolean"
550 553
        },
551 554
        "joinedAt": {
552 555
          "type": "string",
553 556
          "format": "datetime"
554 557
        },
555 558
        "nickname": {
556 559
          "type": "string"
557 560
        },
558 561
        "vcDeafened": {
559 562
          "type": "boolean"
560 563
        }
561 564
      },
562 565
      "description": "The affected member as carried by a member event. Mirrors `social.colibri.community.defs#memberView`, including the member's current voice channel state so a receiving client can place them in a voice channel without refetching."
563 566
    },
564 567
    "reactionEventData": {
565 568
      "type": "object",
566 569
      "required": [
567 570
        "event",
568 571
        "uri",
569 572
        "emoji",
570 573
        "target",
571 574
        "channel"
572 575
      ],
573 576
      "properties": {
574 577
        "uri": {
575 578
          "type": "string",
576 579
          "format": "at-uri"
577 580
        },
578 581
        "emoji": {
579 582
          "type": "string"
580 583
        },
581 584
        "event": {
582 585
          "type": "string",
583 586
          "knownValues": [
584 587
            "added",
585 588
            "removed"
586 589
          ]
587 590
        },
588 591
        "target": {
589 592
          "type": "string",
590 593
          "format": "at-uri"
591 594
        },
592 595
        "channel": {
593 596
          "type": "string",
594 597
          "format": "at-uri"
595 598
        }
596 599
      }
597 600
    },
598 601
    "communityEventData": {
599 602
      "type": "object",
600 603
      "required": [
601 604
        "event",
602 605
        "uri"
603 606
      ],
604 607
      "properties": {
605 608
        "uri": {
606 609
          "type": "string",
607 610
          "format": "at-uri"
608 611
        },
609 612
        "name": {
610 613
          "type": "string"
611 614
        },
612 615
        "event": {
613 616
          "type": "string",
614 617
          "knownValues": [
615 618
            "upsert",
616 619
            "delete"
617 620
          ]
618 621
        },
619 622
        "banner": {
620 623
          "type": "blob"
621 624
        },
622 625
        "picture": {
623 626
          "type": "blob"
624 627
        },
625 628
        "description": {
626 629
          "type": "string"
627 630
        },
628 631
        "categoryOrder": {
629 632
          "type": "array",
630 633
          "items": {
631 634
            "type": "string",
632 635
            "format": "at-uri"
633 636
          }
634 637
        },
635 638
        "requiresApprovalToJoin": {
636 639
          "type": "boolean"
637 640
        }
638 641
      }
639 642
    },
640 643
    "voicePresenceEvent": {
641 644
      "type": "object",
642 645
      "required": [
643 646
        "type",
644 647
        "data"
645 648
      ],
646 649
      "properties": {
647 650
        "data": {
648 651
          "ref": "lex:social.colibri.sync.subscribeEvents#voicePresenceEventData",
649 652
          "type": "ref"
650 653
        },
651 654
        "type": {
652 655
          "type": "string",
653 656
          "const": "voice_presence_event"
654 657
        }
655 658
      },
656 659
      "description": "Sent when a user joins or leaves a voice channel."
657 660
    },
658 661
    "voiceStateEventData": {
659 662
      "type": "object",
660 663
      "required": [
661 664
        "channel",
662 665
        "did"
663 666
      ],
664 667
      "properties": {
665 668
        "did": {
666 669
          "type": "string",
667 670
          "format": "did"
668 671
        },
669 672
        "muted": {
670 673
          "type": "boolean"
671 674
        },
672 675
        "channel": {
673 676
          "type": "string",
674 677
          "format": "at-uri"
675 678
        },
676 679
        "deafened": {
677 680
          "type": "boolean"
678 681
        },
679 682
        "serverMuted": {
680 683
          "type": "boolean"
681 684
        },
682 685
        "serverDeafened": {
683 686
          "type": "boolean"
684 687
        }
685 688
      }
686 689
    },
687 690
    "voicePresenceEventData": {
688 691
      "type": "object",
689 692
      "required": [
690 693
        "event",
691 694
        "channel",
692 695
        "did"
693 696
      ],
694 697
      "properties": {
695 698
        "did": {
696 699
          "type": "string",
697 700
          "format": "did"
698 701
        },
699 702
        "event": {
700 703
          "type": "string",
701 704
          "knownValues": [
702 705
            "join",
703 706
            "leave"
704 707
          ]
705 708
        },
706 709
        "channel": {
707 710
          "type": "string",
708 711
          "format": "at-uri"
709 712
        }
710 713
      }
711 714
    }
712 715
  },
713 716
  "$type": "com.atproto.lexicon.schema",
714 717
  "lexicon": 1,
715 718
  "revision": 1
716 719
}

Compare Other Versions

Lexicon Garden

@