social.colibri.beta.actor.defs
Schema Diff
+117 -8
Compatibility Analysis
Breaking Changes Detected
8 breaking changes, 38 non-breaking changes.
Breaking Changes (8)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.source", kind: "prop", name: Some("source") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.title", kind: "prop", name: Some("title") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.kind", kind: "prop", name: Some("kind") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedChannel", src: "social.colibri.beta.actor.defs#mutedChannel", tgt: "social.colibri.beta.actor.defs#mutedChannel.channel", kind: "prop", name: Some("channel") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedActor", src: "social.colibri.beta.actor.defs#mutedActor", tgt: "social.colibri.beta.actor.defs#mutedActor.did", kind: "prop", name: Some("did") }
- KindChanged KindChanged { vertex_id: "social.colibri.beta.actor.defs#mute.subject", old_kind: "string", new_kind: "union" }
- KindChanged KindChanged { vertex_id: "social.colibri.beta.actor.defs#preferences.gifFavorites:items", old_kind: "string", new_kind: "ref" }
- ConstraintAdded ConstraintAdded { vertex_id: "social.colibri.beta.actor.defs#preferences.gifFavorites:items", sort: "ref", value: "social.colibri.beta.embed.defs#gifView" }
Non-Breaking Changes (38)
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.detail" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.endsAt" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.imageUri" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.kind" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.linkUri" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.source" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.startedAt" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.subtitle" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.title" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant0" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant1" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor.did" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel.channel" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#preferences.shareActivity" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#presence.activity" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverDeafened" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverMuted" }
- AddedVertex AddedVertex { vertex_id: "social.colibri.beta.embed.defs#gifView" }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.detail", kind: "prop", name: Some("detail") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.endsAt", kind: "prop", name: Some("endsAt") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.imageUri", kind: "prop", name: Some("imageUri") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.linkUri", kind: "prop", name: Some("linkUri") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.startedAt", kind: "prop", name: Some("startedAt") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.subtitle", kind: "prop", name: Some("subtitle") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant0", kind: "variant", name: Some("#mutedActor") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant1", kind: "variant", name: Some("#mutedChannel") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant0", tgt: "social.colibri.beta.actor.defs#mutedActor", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant1", tgt: "social.colibri.beta.actor.defs#mutedChannel", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#preferences", tgt: "social.colibri.beta.actor.defs#preferences.shareActivity", kind: "prop", name: Some("shareActivity") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#preferences.gifFavorites:items", tgt: "social.colibri.beta.embed.defs#gifView", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#presence", tgt: "social.colibri.beta.actor.defs#presence.activity", kind: "prop", name: Some("activity") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#presence.activity", tgt: "social.colibri.beta.actor.defs#activity", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverDeafened", kind: "prop", name: Some("serverDeafened") }
- AddedEdge AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverMuted", kind: "prop", name: Some("serverMuted") }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.colibri.beta.actor.defs#mute.subject", sort: "format" }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.detail" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.endsAt" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.imageUri" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.kind" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.linkUri" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.source" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.startedAt" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.subtitle" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#activity.title" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant0" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mute.subject:variant1" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedActor.did" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#mutedChannel.channel" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#preferences.shareActivity" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#presence.activity" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverDeafened" }AddedVertex { vertex_id: "social.colibri.beta.actor.defs#voiceState.serverMuted" }AddedVertex { vertex_id: "social.colibri.beta.embed.defs#gifView" }
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "social.colibri.beta.actor.defs#preferences.gifFavorites:items", sort: "ref", value: "social.colibri.beta.embed.defs#gifView" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "social.colibri.beta.actor.defs#mute.subject", sort: "format" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedActor", src: "social.colibri.beta.actor.defs#mutedActor", tgt: "social.colibri.beta.actor.defs#mutedActor.did", kind: "prop", name: Some("did") }
- Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.source", kind: "prop", name: Some("source") }
- Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.title", kind: "prop", name: Some("title") }
- Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#activity", src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.kind", kind: "prop", name: Some("kind") }
- Breaking: RequiredEdgeAdded { vertex_id: "social.colibri.beta.actor.defs#mutedChannel", src: "social.colibri.beta.actor.defs#mutedChannel", tgt: "social.colibri.beta.actor.defs#mutedChannel.channel", kind: "prop", name: Some("channel") }
- Breaking: KindChanged { vertex_id: "social.colibri.beta.actor.defs#mute.subject", old_kind: "string", new_kind: "union" }
- Breaking: KindChanged { vertex_id: "social.colibri.beta.actor.defs#preferences.gifFavorites:items", old_kind: "string", new_kind: "ref" }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.detail", kind: "prop", name: Some("detail") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.endsAt", kind: "prop", name: Some("endsAt") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.imageUri", kind: "prop", name: Some("imageUri") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.linkUri", kind: "prop", name: Some("linkUri") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.startedAt", kind: "prop", name: Some("startedAt") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#activity", tgt: "social.colibri.beta.actor.defs#activity.subtitle", kind: "prop", name: Some("subtitle") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant0", kind: "variant", name: Some("#mutedActor") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject", tgt: "social.colibri.beta.actor.defs#mute.subject:variant1", kind: "variant", name: Some("#mutedChannel") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant0", tgt: "social.colibri.beta.actor.defs#mutedActor", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#mute.subject:variant1", tgt: "social.colibri.beta.actor.defs#mutedChannel", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#preferences", tgt: "social.colibri.beta.actor.defs#preferences.shareActivity", kind: "prop", name: Some("shareActivity") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#preferences.gifFavorites:items", tgt: "social.colibri.beta.embed.defs#gifView", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#presence", tgt: "social.colibri.beta.actor.defs#presence.activity", kind: "prop", name: Some("activity") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#presence.activity", tgt: "social.colibri.beta.actor.defs#activity", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverDeafened", kind: "prop", name: Some("serverDeafened") }
- Non-breaking: AddedEdge { src: "social.colibri.beta.actor.defs#voiceState", tgt: "social.colibri.beta.actor.defs#voiceState.serverMuted", kind: "prop", name: Some("serverMuted") }
1
1
{
2
2
"id": "social.colibri.beta.actor.defs",
3
3
"defs": {
4
4
"mute": {
5
5
"type": "object",
6
6
"required": [
7
7
"subject",
8
8
"createdAt"
9
9
],
10
10
"properties": {
11
11
"subject": {
12
-
"type": "string",
13
-
"format": "did",
14
-
"description": "The muted user or community."
12
+
"refs": [
13
+
"#mutedActor",
14
+
"#mutedChannel"
15
+
],
16
+
"type": "union",
17
+
"closed": true,
18
+
"description": "What is muted. A user or a community is named by DID, a channel by its space."
15
19
},
16
20
"createdAt": {
17
21
"type": "string",
18
22
"format": "datetime",
19
23
"description": "When the mute was created."
20
24
}
21
25
},
22
26
"description": "A muted subject."
23
27
},
24
28
"status": {
25
29
"type": "object",
26
30
"required": [
27
31
"text"
28
32
],
29
33
"properties": {
30
34
"text": {
31
35
"type": "string",
32
36
"maxLength": 32,
33
37
"description": "The status text."
34
38
},
35
39
"emoji": {
36
40
"type": "string",
37
41
"description": "An emoji shown beside the status."
38
42
}
39
43
},
40
44
"description": "A user's status line."
41
45
},
46
+
"activity": {
47
+
"type": "object",
48
+
"required": [
49
+
"kind",
50
+
"title",
51
+
"source"
52
+
],
53
+
"properties": {
54
+
"kind": {
55
+
"type": "string",
56
+
"description": "What sort of activity this is. A client that does not know a kind falls back to naming the source.",
57
+
"knownValues": [
58
+
"listening",
59
+
"playing",
60
+
"streaming"
61
+
]
62
+
},
63
+
"title": {
64
+
"type": "string",
65
+
"maxLength": 256,
66
+
"description": "The main line: a track, a game, or a stream title."
67
+
},
68
+
"detail": {
69
+
"type": "string",
70
+
"maxLength": 256,
71
+
"description": "A third line naming where the title sits, such as the album."
72
+
},
73
+
"endsAt": {
74
+
"type": "string",
75
+
"format": "datetime",
76
+
"description": "After this the activity is no longer current. The AppView clears it and says so, and a client treats a lapsed activity as absent."
77
+
},
78
+
"source": {
79
+
"type": "string",
80
+
"maxLength": 64,
81
+
"description": "The service the activity was read from, such as 'teal.fm'."
82
+
},
83
+
"linkUri": {
84
+
"type": "string",
85
+
"format": "uri",
86
+
"description": "Where the activity points, such as the track's page on the service it was played from."
87
+
},
88
+
"imageUri": {
89
+
"type": "string",
90
+
"format": "uri",
91
+
"description": "Artwork for the activity, served by this AppView. Absent when none could be resolved."
92
+
},
93
+
"subtitle": {
94
+
"type": "string",
95
+
"maxLength": 256,
96
+
"description": "The second line, such as the artist."
97
+
},
98
+
"startedAt": {
99
+
"type": "string",
100
+
"format": "datetime",
101
+
"description": "When the activity began."
102
+
}
103
+
},
104
+
"description": "Something the user is doing right now, read from another service they publish to. A client renders it beside their presence."
105
+
},
42
106
"presence": {
43
107
"type": "object",
44
108
"required": [
45
109
"onlineState"
46
110
],
47
111
"properties": {
48
112
"voice": {
49
113
"ref": "#voiceState",
50
114
"type": "ref",
51
115
"description": "Where the user is connected for voice, if anywhere."
52
116
},
53
117
"status": {
54
118
"ref": "#status",
55
119
"type": "ref",
56
120
"description": "The user's status line."
57
121
},
122
+
"activity": {
123
+
"ref": "#activity",
124
+
"type": "ref",
125
+
"description": "What the user is doing right now, when they share it and the AppView has something current."
126
+
},
58
127
"onlineState": {
59
128
"type": "string",
60
129
"description": "Derived online state.",
61
130
"knownValues": [
62
131
"online",
63
132
"away",
64
133
"dnd",
65
134
"offline"
66
135
]
67
136
}
68
137
},
69
138
"description": "A user's live, off-protocol state."
70
139
},
140
+
"mutedActor": {
141
+
"type": "object",
142
+
"required": [
143
+
"did"
144
+
],
145
+
"properties": {
146
+
"did": {
147
+
"type": "string",
148
+
"format": "did",
149
+
"description": "The muted user or community."
150
+
}
151
+
},
152
+
"description": "A muted user or community."
153
+
},
71
154
"voiceState": {
72
155
"type": "object",
73
156
"required": [
74
157
"channel"
75
158
],
76
159
"properties": {
77
160
"muted": {
78
161
"type": "boolean",
79
-
"description": "Whether the user has muted their microphone."
162
+
"description": "Whether the user's microphone is muted, for any reason."
80
163
},
81
164
"channel": {
82
165
"type": "string",
83
166
"format": "space-ref",
84
167
"description": "The voice channel the user is connected to."
85
168
},
86
169
"deafened": {
87
170
"type": "boolean",
88
-
"description": "Whether the user has deafened themselves."
171
+
"description": "Whether the user has incoming audio silenced, for any reason."
172
+
},
173
+
"serverMuted": {
174
+
"type": "boolean",
175
+
"description": "Whether a moderator muted them. When this is true they cannot unmute themselves, and a client must not offer them the control."
176
+
},
177
+
"serverDeafened": {
178
+
"type": "boolean",
179
+
"description": "Whether a moderator deafened them. When this is true they cannot undeafen themselves."
89
180
}
90
181
},
91
182
"description": "A user's voice connection."
92
183
},
93
184
"preferences": {
94
185
"type": "object",
95
186
"required": [
96
187
"notificationLevel",
97
188
"communityOrder",
98
189
"mutes",
99
190
"gifFavorites"
100
191
],
101
192
"properties": {
102
193
"mutes": {
103
194
"type": "array",
104
195
"items": {
105
196
"ref": "#mute",
106
197
"type": "ref"
107
198
},
108
199
"description": "Subjects the user has muted."
109
200
},
110
201
"gifFavorites": {
111
202
"type": "array",
112
203
"items": {
113
-
"type": "string",
114
-
"description": "A GIF identifier."
204
+
"ref": "social.colibri.beta.embed.defs#gifView",
205
+
"type": "ref"
115
206
},
116
-
"description": "GIFs saved from the picker."
207
+
"description": "GIFs saved from the picker, stored whole."
117
208
},
209
+
"shareActivity": {
210
+
"type": "boolean",
211
+
"description": "Whether the AppView may read what the user is listening to and show it to others."
212
+
},
118
213
"communityOrder": {
119
214
"type": "array",
120
215
"items": {
121
216
"type": "string",
122
217
"format": "did",
123
218
"description": "A community."
124
219
},
125
220
"description": "Communities in preferred sidebar order."
126
221
},
127
222
"notificationLevel": {
128
223
"type": "string",
129
224
"description": "Which messages produce a notification.",
130
225
"knownValues": [
131
226
"all",
132
227
"mentionsAndReplies"
133
228
]
134
229
}
135
230
},
136
231
"description": "The authenticated user's own settings, as the AppView currently holds them."
137
232
},
138
233
"profileView": {
139
234
"type": "object",
140
235
"required": [
141
236
"did",
142
237
"handle",
143
238
"displayName",
144
239
"isBot",
145
240
"syncBluesky"
146
241
],
147
242
"properties": {
148
243
"did": {
149
244
"type": "string",
150
245
"format": "did",
151
246
"description": "The user's DID."
152
247
},
153
248
"isBot": {
154
249
"type": "boolean",
155
250
"description": "Whether the account is labelled as an automated account."
156
251
},
157
252
"theme": {
158
253
"ref": "social.colibri.beta.actor.profile#theme",
159
254
"type": "ref",
160
255
"description": "Colibri-only profile theming, read from the profile record even when the mirrored fields come from Bluesky."
161
256
},
162
257
"avatar": {
163
258
"type": "string",
164
259
"format": "uri",
165
260
"description": "URL of the user's avatar, served by this AppView's blob proxy."
166
261
},
167
262
"banner": {
168
263
"type": "string",
169
264
"format": "uri",
170
265
"description": "URL of the user's profile banner, served by this AppView's blob proxy."
171
266
},
172
267
"handle": {
173
268
"type": "string",
174
269
"format": "handle",
175
270
"description": "The user's handle, or 'handle.invalid' when it does not resolve."
176
271
},
177
272
"presence": {
178
273
"ref": "#presence",
179
274
"type": "ref",
180
275
"description": "Live presence, when the AppView is tracking any."
181
276
},
182
277
"description": {
183
278
"type": "string",
184
279
"description": "Resolved bio."
185
280
},
186
281
"displayName": {
187
282
"type": "string",
188
283
"description": "Resolved display name, falling back to the handle."
189
284
},
190
285
"syncBluesky": {
191
286
"type": "boolean",
192
287
"description": "Whether the mirrored profile fields come from app.bsky.actor.profile."
193
288
},
194
289
"preferredBadge": {
195
290
"type": "string",
196
291
"description": "Label value of the badge the user chose to display."
197
292
}
198
293
},
199
294
"description": "A Colibri user as the AppView serves them: identity, resolved profile, and presence."
295
+
},
296
+
"mutedChannel": {
297
+
"type": "object",
298
+
"required": [
299
+
"channel"
300
+
],
301
+
"properties": {
302
+
"channel": {
303
+
"type": "string",
304
+
"format": "space-ref",
305
+
"description": "The muted channel's space."
306
+
}
307
+
},
308
+
"description": "A muted channel. Muting a channel silences it without leaving the community it belongs to."
200
309
}
201
310
},
202
311
"$type": "com.atproto.lexicon.schema",
203
312
"lexicon": 1
204
313
}