{
  "_doc": "Headless capability enumeration for the Android Chat SDK v5 skill (cometchat-android-v5-sdk). Unlike the UI Kit's component features, the SDK's deliverable is ONE coherent sdk-chat-surface (RULES: full surface for a generic prompt); these ids are the drivable/assertable capabilities of that surface. surface=headless. Symbols verified against test-suite/catalogs/sdk-android-v5.json (curated from the INSTALLED com.cometchat:chat-sdk-android:5.0.5 AAR + javap statics, cross-checked with the live sdk/android/v5 docs, 2026-08-20). Every feature's gates: G0 existence (symbol in sdk-android-v5 catalog) + G5 compile (Kotlin fence vs the installed 5.0.x AAR) — the live-backend smoke analogue of sdk-smoke.mjs is PARKED until the Android native harness lands (see families.json _status).",
  "family": "android-sdk",
  "major": "v5",
  "surface": "headless",
  "pack": "cometchat-android-v5-sdk",
  "features": [
    { "id": "sdk-init-login", "name": "Init + login (session bootstrap)", "category": "core", "enablement": "auto", "docs_topic": "setup", "sdk_symbols": ["init", "AppSettings", "AppSettingsBuilder", "getLoggedInUser", "login", "logout", "CallbackListener", "CometChatException"] },
    { "id": "conversations-list", "name": "Conversations list", "category": "core", "enablement": "auto", "docs_topic": "retrieve-conversations", "sdk_symbols": ["ConversationsRequest", "ConversationsRequestBuilder", "Conversation"] },
    { "id": "users-list", "name": "Users list", "category": "users-groups", "enablement": "auto", "docs_topic": "retrieve-users", "sdk_symbols": ["UsersRequest", "UsersRequestBuilder", "User"] },
    { "id": "groups-list", "name": "Groups list", "category": "users-groups", "enablement": "auto", "docs_topic": "retrieve-groups", "sdk_symbols": ["GroupsRequest", "GroupsRequestBuilder", "Group"] },
    { "id": "open-conversation", "name": "Open a chat + fetch message history", "category": "messaging", "enablement": "auto", "docs_topic": "additional-message-filtering", "sdk_symbols": ["MessagesRequest", "MessagesRequestBuilder", "BaseMessage"] },
    { "id": "send-message", "name": "Send a text message", "category": "messaging", "enablement": "auto", "docs_topic": "send-message", "sdk_symbols": ["TextMessage", "sendMessage"] },
    { "id": "receive-message", "name": "Real-time receive (message listener)", "category": "realtime", "enablement": "auto", "docs_topic": "receive-messages", "sdk_symbols": ["addMessageListener", "MessageListener", "removeMessageListener"] },
    { "id": "media-attachment", "name": "Media attachment (image/file)", "category": "media", "enablement": "auto", "docs_topic": "upload-files", "sdk_symbols": ["MediaMessage", "sendMediaMessage", "Attachment", "createUploadFileRequest", "UploadFileRequest", "UploadFileListener"] },
    { "id": "typing-indicator", "name": "Typing indicators", "category": "realtime", "enablement": "auto", "docs_topic": "typing-indicators", "sdk_symbols": ["startTyping", "endTyping", "TypingIndicator"] },
    { "id": "receipts", "name": "Delivery & read receipts", "category": "realtime", "enablement": "auto", "docs_topic": "delivery-read-receipts", "sdk_symbols": ["markAsDelivered", "markAsRead", "markAsUnread", "MessageReceipt", "getMessageReceipts"] },
    { "id": "message-edit", "name": "Edit a message", "category": "actions", "enablement": "auto", "docs_topic": "edit-message", "sdk_symbols": ["editMessage"] },
    { "id": "message-delete", "name": "Delete a message", "category": "actions", "enablement": "auto", "docs_topic": "delete-message", "sdk_symbols": ["deleteMessage"] },
    { "id": "message-flag", "name": "Flag / report a message", "category": "actions", "enablement": "auto", "docs_topic": "flag-message", "sdk_symbols": ["flagMessage", "getFlagReasons", "FlagReason"] },
    { "id": "message-react", "name": "React to a message", "category": "actions", "enablement": "auto", "docs_topic": "reactions", "sdk_symbols": ["addReaction", "removeReaction", "Reaction", "ReactionCount"] },
    { "id": "threaded-replies", "name": "Threaded replies", "category": "messaging", "enablement": "auto", "docs_topic": "threaded-messages", "sdk_symbols": ["MessagesRequestBuilder", "TextMessage"] },
    { "id": "mentions", "name": "@ Mentions", "category": "messaging", "enablement": "auto", "docs_topic": "mentions", "sdk_symbols": ["TextMessage", "User"] },
    { "id": "delete-conversation", "name": "Delete a conversation", "category": "actions", "enablement": "auto", "docs_topic": "delete-conversation", "sdk_symbols": ["deleteConversation"] },
    { "id": "transient-messages", "name": "Transient messages", "category": "realtime", "enablement": "auto", "docs_topic": "transient-messages", "sdk_symbols": ["sendTransientMessage", "TransientMessage"] },
    { "id": "user-details", "name": "User detail (fetch + block/unblock)", "category": "users-groups", "enablement": "auto", "docs_topic": "block-users", "sdk_symbols": ["getUser", "blockUsers", "unblockUsers", "BlockedUsersRequest", "BlockedUsersRequestBuilder"] },
    { "id": "user-presence", "name": "User presence (online/offline)", "category": "realtime", "enablement": "code-prop", "needs_settings_config": true, "docs_topic": "user-presence", "sdk_symbols": ["addUserListener", "UserListener", "removeUserListener"], "notes": "REALTIME presence is OPT-IN, NOT auto: onUserOnline/onUserOffline fire ONLY if the settings asset (cometchat-settings.json) sets chatSDK.presenceSubscription to ALL_USERS / FRIENDS / ROLES (NONE or absent ⇒ NO presence events — docs user-presence: 'if none of the above methods are set, no presence will be sent'; verified vs the installed AAR settings parser, an invalid value throws ERR_SETTINGS_FILE_INVALID_PRESENCE_TYPE). The seeded getUser().status / UsersRequest list 'status' field is a snapshot that works WITHOUT the subscription; only the realtime transition needs it. Wiring the app-surface presence surface (header name/presence/typing + users list) without the subscription silently ships a header stuck 'offline' (AUDIT-235)." },
    { "id": "group-management", "name": "Group create/join/leave/update/delete", "category": "users-groups", "enablement": "auto", "docs_topic": "create-group", "sdk_symbols": ["createGroup", "createGroupWithMembers", "joinGroup", "leaveGroup", "updateGroup", "deleteGroup", "getGroup", "Group"] },
    { "id": "group-members", "name": "Group members + moderation actions", "category": "users-groups", "enablement": "auto", "docs_topic": "retrieve-group-members", "sdk_symbols": ["GroupMembersRequest", "GroupMembersRequestBuilder", "GroupMember", "addMembersToGroup", "kickGroupMember", "banGroupMember", "unbanGroupMember", "BannedGroupMembersRequest", "BannedGroupMembersRequestBuilder", "updateGroupMemberScope", "transferGroupOwnership"] },
    { "id": "group-listener", "name": "Real-time group events", "category": "realtime", "enablement": "auto", "docs_topic": "real-time-listeners", "sdk_symbols": ["addGroupListener", "GroupListener", "removeGroupListener"] },
    { "id": "connection-status", "name": "Connection status + manual reconnect", "category": "advanced", "enablement": "auto", "docs_topic": "connection-status", "sdk_symbols": ["getConnectionStatus", "addConnectionListener", "ConnectionListener", "removeConnectionListener", "connect", "disconnect", "ping"] },
    { "id": "login-listener", "name": "Login/logout lifecycle events", "category": "core", "enablement": "auto", "docs_topic": "login-listeners", "sdk_symbols": ["addLoginListener", "LoginListener", "removeLoginListener"] },
    { "id": "unread-counts", "name": "Unread message counts", "category": "messaging", "enablement": "auto", "docs_topic": "delivery-read-receipts", "sdk_symbols": ["getUnreadMessageCount", "getUnreadMessageCountForUser", "getUnreadMessageCountForGroup", "markConversationAsRead"] },
    { "id": "calls-default", "name": "Voice/video calls (default calling)", "category": "calls", "enablement": "gradle-package", "docs_topic": "calling-overview", "sdk_symbols": ["Call", "initiateCall", "acceptCall", "rejectCall", "getActiveCall", "clearActiveCall", "addCallListener", "CallListener", "removeCallListener", "CallSettings", "CallSettingsBuilder"], "notes": "Needs com.cometchat:calls-sdk-android alongside the chat SDK; full Calls docs live under /calls/android." },
    { "id": "push-token-registration", "name": "Push notification token registration", "category": "advanced", "enablement": "gradle-package", "docs_topic": "webhooks-overview", "sdk_symbols": ["registerTokenForPushNotification", "CometChatNotifications", "PushPlatforms"], "notes": "FCM token registration + notification mute/DND preferences via CometChatNotifications; provider setup is Dashboard-side (notifications product docs)." },
    { "id": "ai-conversation-copilot", "name": "AI user copilot (starter/replies/summary)", "category": "ai", "enablement": "dashboard-toggle", "docs_topic": "ai-agents", "sdk_symbols": ["getConversationStarter", "getSmartReplies", "getConversationSummary", "askBot", "isAIFeatureEnabled"] },
    { "id": "ai-assistant-events", "name": "AI assistant streaming events", "category": "ai", "enablement": "dashboard-toggle", "docs_topic": "ai-agents", "sdk_symbols": ["addAIAssistantListener", "AIAssistantListener", "removeAIAssistantListener", "AIAssistantMessage", "AIAssistantBaseEvent"] },
    { "id": "notification-feed", "name": "Notification feed (fetch + realtime)", "category": "advanced", "enablement": "auto", "docs_topic": "webhooks-overview", "sdk_symbols": ["NotificationFeedRequest", "NotificationFeedRequestBuilder", "NotificationFeedItem", "addNotificationFeedListener", "NotificationFeedListener", "removeNotificationFeedListener", "getNotificationFeedUnreadCount"] }
  ]
}
