Summary
chat.bsky.convo upstream has been extended with two cross-cutting additions that are not yet reflected in the typed models or wrappers: message-level reply (replyTo on both input and view) and group conversations (convoView.kind union with #groupConvo, plus four new XRPC endpoints). Currently the SDK exposes neither, so the entire reply / group surface is unreachable through ATProtoBlueskyChat.
Pain points
The reply / group definitions are absent from the typed models and wrappers, so the whole surface is unreachable through ATProtoBlueskyChat: typed quote-reply on sendMessage is impossible, an incoming reply's parent is silently dropped on decode (no field-level .unknown fallback), a group is indistinguishable from a 1:1 DM with its metadata unreachable, and the group / lock endpoints require raw XRPC that re-implements the api.bsky.chat host routing / auth ATProtoBlueskyChat already provides. See Additional Context for the specific undefined types, fields, and wrappers.
Considered Alternatives
Raw XRPC for the entire chat surface (loses typed pipeline and the isRelatedToBskyChat host routing) — only viable per-client and brittle.
Is this a breaking change?
No
Library Examples
N/A
Additional Context
Missing types
| Lexicon |
Suggested type |
chat.bsky.convo.defs#replyRef |
ReplyReferenceDefinition — messageID: String (messageId) |
chat.bsky.convo.defs#messageBeforeUserJoinedGroupView |
MessageBeforeUserJoinedGroupViewDefinition — per lexicon |
chat.bsky.convo.defs#groupConvo |
GroupConvoDefinition — name: String?, createdAt: Date, lockStatus: String, lockStatusModerationOverride: String?, memberCount: Int, memberLimit: Int, joinLink: String?, joinRequestCount: Int, unreadJoinRequestCount: Int |
Missing fields on existing types
| Lexicon |
Suggested field |
chat.bsky.convo.defs#messageInput |
replyTo: ReplyReferenceDefinition? |
chat.bsky.convo.defs#messageView |
replyTo: ReplyToUnion? (messageView | deletedMessageView | messageBeforeUserJoinedGroupView) |
chat.bsky.convo.defs#convoView |
kind: KindUnion? (groupConvo) |
Missing wrappers
| Lexicon |
Suggested method |
chat.bsky.convo.getConvoMembers |
getConversationMembers(from:limit:cursor:) |
chat.bsky.convo.listConvoRequests |
listConversationRequests(limit:cursor:) |
chat.bsky.convo.lockConvo |
lockConversation(by:) |
chat.bsky.convo.unlockConvo |
unlockConversation(by:) |
All four sit on api.bsky.chat, mirror the existing acceptConvo / muteConvo shape, and require isRelatedToBskyChat: true routing.
References
Summary
chat.bsky.convoupstream has been extended with two cross-cutting additions that are not yet reflected in the typed models or wrappers: message-level reply (replyToon both input and view) and group conversations (convoView.kindunion with#groupConvo, plus four new XRPC endpoints). Currently the SDK exposes neither, so the entire reply / group surface is unreachable throughATProtoBlueskyChat.Pain points
The reply / group definitions are absent from the typed models and wrappers, so the whole surface is unreachable through
ATProtoBlueskyChat: typed quote-reply onsendMessageis impossible, an incoming reply's parent is silently dropped on decode (no field-level.unknownfallback), a group is indistinguishable from a 1:1 DM with its metadata unreachable, and the group / lock endpoints require raw XRPC that re-implements theapi.bsky.chathost routing / authATProtoBlueskyChatalready provides. See Additional Context for the specific undefined types, fields, and wrappers.Considered Alternatives
Raw XRPC for the entire chat surface (loses typed pipeline and the
isRelatedToBskyChathost routing) — only viable per-client and brittle.Is this a breaking change?
No
Library Examples
N/A
Additional Context
Missing types
chat.bsky.convo.defs#replyRefReplyReferenceDefinition—messageID: String(messageId)chat.bsky.convo.defs#messageBeforeUserJoinedGroupViewMessageBeforeUserJoinedGroupViewDefinition— per lexiconchat.bsky.convo.defs#groupConvoGroupConvoDefinition—name: String?,createdAt: Date,lockStatus: String,lockStatusModerationOverride: String?,memberCount: Int,memberLimit: Int,joinLink: String?,joinRequestCount: Int,unreadJoinRequestCount: IntMissing fields on existing types
chat.bsky.convo.defs#messageInputreplyTo: ReplyReferenceDefinition?chat.bsky.convo.defs#messageViewreplyTo: ReplyToUnion?(messageView | deletedMessageView | messageBeforeUserJoinedGroupView)chat.bsky.convo.defs#convoViewkind: KindUnion?(groupConvo)Missing wrappers
chat.bsky.convo.getConvoMembersgetConversationMembers(from:limit:cursor:)chat.bsky.convo.listConvoRequestslistConversationRequests(limit:cursor:)chat.bsky.convo.lockConvolockConversation(by:)chat.bsky.convo.unlockConvounlockConversation(by:)All four sit on
api.bsky.chat, mirror the existingacceptConvo/muteConvoshape, and requireisRelatedToBskyChat: truerouting.References
defs.json: https://github.com/bluesky-social/atproto/blob/main/lexicons/chat/bsky/convo/defs.jsonSources/ATProtoKit/Models/Lexicons/chat.bsky/Convo/ChatBskyConvoDefs.swiftSources/ATProtoKit/APIReference/ChatBskyAPI/