{
  "generatedFrom": "cometchat.com/docs — extensions/overview + ui-kit/react (v7). VERIFY entries resolved 2026-07-29 against live docs (ai-features, call-features, search, notifications/web-push, moderation, end-to-end-encryption). Plan-gating for AI / E2EE / moderation is NOT stated in the docs = 'unknown', not asserted. Component existence is finally confirmed by the web-v7 catalog (Phase-0). CORRECTIONS 2026-07-30 (see AUDIT.md): threaded-replies reclassified auto->code-prop with needs_stitching (was wrongly 'built-in'); message-search annotated — the Conversations search bar is client-side-only and needs onSearchBarClicked/CometChatSearch stitching or showSearchBar={false}, and dashboard-enable is a VERIFY item.",
  "schemaNotes": "needs_stitching:true = the drop-in renders a default-ON UI affordance that is inert/partial until the host wires a callback + companion panel/component (or hides it). needs_dashboard = whether the feature also requires a Dashboard/plan toggle ('VERIFY' = unconfirmed). deprecated:true = a LEGACY entry whose live docs are titled '(Legacy)'/'(Deprecated)' or say 'already part of core messaging' / 'no longer maintained' — NEVER offer it as an 'add a feature' suggestion (AUDIT-077). AUDIT-077: 'mentions' + 'reactions' were miscategorized as dashboard extensions but are ON BY DEFAULT in the v7 UI Kit (their extension pages are '(Legacy)' = already in core); recategorized to category:default/enablement:auto. Rule: an extension/dashboard-extension entry MUST be validated against its LIVE extension page — a '(Legacy)/(Deprecated)' page or 'already part of core messaging' means it is NOT an active off-by-default extension (recategorize to default, or flag deprecated:true).",
  "family": "web-react",
  "major": "v7",
  "categories": ["default", "extension", "ai", "package-install", "component-swap", "dashboard-only"],
  "enablement": ["auto", "dashboard-toggle", "dashboard-extension", "npm-package", "code-prop"],
  "features": [
    { "id": "core-chat-surface", "name": "Production-ready core chat surface", "category": "default", "enablement": "auto", "needs_stitching": true, "ui_components": ["CometChatErrorBoundary", "CometChatConversations", "CometChatMessageHeader", "CometChatMessageList", "CometChatMessageComposer", "CometChatThreadHeader", "CometChatSearch"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/overview", "notes": "COMPOSITE / app-level feature — the DEFAULT for an unscoped 'add chat'. A production-ready CORE surface, lean but complete: wrap the app in CometChatErrorBoundary; init->login gate; a CometChatConversations LIST <-> a message pane (header+list+composer); the default-on search bar + thread indicator wired-or-hidden; correct container sizing (root 100dvh + the column CSS so panes fill, not collapse); a mobile collapse to one pane (header hideBackButton/onBack); prod auth-token guidance (loginWithAuthToken). NOT a bare/broken two-pane demo, and NOT the whole combined app. needs_stitching: the panes + affordances are wired by host state + built-in callbacks (onItemClick, onThreadRepliesClick, onSearchBarClicked). It GROWS on request to the users/groups/calls selector tabs, a details/thread/search side panel, incoming calls, and calls -> the chat-experience feature (the union). Composition + minimum in .claude/skills/cometchat-skill-creator/references/FULL-APP-BLUEPRINT.md §7 and contracts.json ('core-chat-surface'). Gated features (extensions/AI/plugins) stay OFF unless requested. A scoped-down ask (embed/popup) opts into a specific placement instead." },
    { "id": "chat-experience", "name": "Complete chat experience (combined app)", "category": "default", "enablement": "auto", "needs_stitching": true, "ui_components": ["CometChatErrorBoundary", "CometChatConversations", "CometChatUsers", "CometChatGroups", "CometChatCallLogs", "CometChatMessageHeader", "CometChatMessageList", "CometChatMessageComposer", "CometChatThreadHeader", "CometChatSearch", "CometChatGroupMembers", "CometChatIncomingCall"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/overview", "notes": "COMPOSITE / app-level feature — the GROW target, emitted when the user asks for the WHOLE app (NOT the default for a plain 'add chat' — that is core-chat-surface). It is the combined single-page app assembled from drop-ins, mirroring the official React v7 sample app: the core surface PLUS a selector (conversations + users/groups/calls tabs) <-> a message pane <-> a mutually-exclusive details/thread/search side panel, plus CometChatIncomingCall at root, all wrapped in CometChatErrorBoundary, collapsing to one pane on mobile. needs_stitching: the panes are wired by host state (selection / active tab / side panel) + built-in callbacks (onItemClick, onThreadRepliesClick, onSearchBarClicked/onSearchOptionClicked). The kit ships NO combined shell (no CometChatUI/WithMessages). It is the UNION of the core surface + the growths. Composition + placement map + minimum in .claude/skills/cometchat-skill-creator/references/FULL-APP-BLUEPRINT.md §4 and contracts.json ('chat-experience'). Gated features (extensions/AI/plugins) stay OFF unless requested." },
    { "id": "text-messaging", "name": "Text messaging", "category": "default", "enablement": "auto", "ui_components": ["CometChatMessageList", "CometChatMessageComposer"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/message-composer", "notes": "Built-in; core chat." },
    { "id": "typing-indicators", "name": "Typing indicators", "category": "default", "enablement": "auto", "ui_components": ["CometChatMessageHeader"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/typing-indicator", "notes": "On by default. NO standalone CometChatTypingIndicator component in v7 (phantom — corrected 2026-07-30, see AUDIT-008; caught by the reviewer G0 existence-catalog). The 'typing…' indicator auto-renders inside CometChatMessageHeader, backed by the SDK TypingIndicator model + startTyping/endTyping events. VERIFY the exact CometChatMessageHeader toggle prop from docs." },
    { "id": "delivery-read-receipts", "name": "Delivery & read receipts", "category": "default", "enablement": "auto", "ui_components": ["CometChatMessageList"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/message-receipts", "notes": "On by default." },
    { "id": "threaded-replies", "name": "Threaded replies", "category": "default", "enablement": "code-prop", "needs_stitching": true, "ui_components": ["CometChatThreadHeader", "CometChatMessageList", "CometChatMessageComposer"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/guide-threaded-messages", "notes": "NOT automatic (was wrongly marked auto/built-in — see AUDIT.md AUDIT-001). CometChatMessageList renders a thread-reply indicator + 'Reply in Thread' option BY DEFAULT, but both are INERT until the host wires onThreadRepliesClick to open a thread panel: CometChatThreadHeader + CometChatMessageList(parentMessageId) + CometChatMessageComposer(parentMessageId). DEFAULT SCOPE: threaded replies are INCLUDED in a first-time 'add chat' — the core-chat-surface contract wires the thread panel by default (with a back/close round-trip). Hide the affordance with hideReplyInThreadOption ONLY if the user explicitly opts out of threads (never leave it dead-ending). See guide-threaded-messages + contracts.json core-chat-surface." },
    { "id": "media-file-attachments", "name": "Media & file attachments", "category": "default", "enablement": "auto", "ui_components": ["CometChatImagesBubble", "CometChatVideosBubble", "CometChatAudiosBubble", "CometChatFilesBubble"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/message-composer", "notes": "Image/video/audio/file bubbles built-in." },
    { "id": "voice-notes", "name": "Voice notes", "category": "default", "enablement": "auto", "ui_components": ["CometChatMessageComposer"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/message-composer", "notes": "Built into CometChatMessageComposer (prop hideVoiceRecordingButton, default false = on). No standalone voice-note component in v7." },
    { "id": "user-presence", "name": "User presence (online/offline)", "category": "default", "enablement": "code-prop", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/overview", "notes": "Enabled in the init SETTINGS OBJECT passed to CometChatUIKit.initFromSettings: chatSDK.presenceSubscription.type='ALL_USERS' (= the classic UIKitSettingsBuilder.subscribePresenceForAllUsers()). Init moved to initFromSettings for telemetry attribution (AUDIT-084)." },
    { "id": "users-groups", "name": "Users & groups management", "category": "default", "enablement": "auto", "ui_components": ["CometChatUsers", "CometChatGroups", "CometChatGroupMembers"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/groups", "notes": "Built-in list components." },
    { "id": "message-search", "name": "Message & conversation search", "category": "default", "enablement": "code-prop", "needs_stitching": true, "needs_dashboard": true, "ui_components": ["CometChatSearch"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/guide-search-messages", "notes": "TWO separate things (see AUDIT.md AUDIT-002). (1) CometChatConversations ships a search bar ON BY DEFAULT (showSearchBar=true) that ONLY does client-side name filtering of already-loaded conversations — it does NOT search message content or hit the server, so it reads as broken. For real search either wire onSearchBarClicked -> open CometChatSearch, or hide the built-in bar with showSearchBar={false}. PLACEMENT (AUDIT-014): render CometChatSearch IN the conversations list column (over the list, replacing it), NOT full-screen — the message pane must stay visible on wide viewports; onBack/result-click returns to the list. Full-screen is only correct on mobile's single-pane (where it IS the list-level screen). Same for the message-header search button (onSearchOptionClicked): open a SCOPED CometChatSearch (pass the current uid/guid so it searches ONLY that chat) in the SIDE PANEL — mutually exclusive with the thread, onBack closes, onMessageClicked jumps to the hit — NOT a whole-app takeover. This IN-CHAT scoped search is DEFAULT-ON in the core surface alongside the global (list-column) search (contracts core-chat-surface); it mirrors the official sample app (CometChatHome scoped CometChatSearch). Opt-out via showSearchOption={false}. (2) CometChatSearch is the real search UI (conversations + messages, server-side). WIRE ITS FULL ROUND-TRIP (AUDIT-017): CometChatSearch renders a back button by default (hideBackButton default false) whose handler is onBack — you MUST wire onBack to close it (return to the list) AND onConversationClicked/onMessageClicked to close + select the result, or the back button dead-ends. CometChatSearchBar is NOT a standalone v7 component. DASHBOARD/PLAN PREREQUISITE — CONFIRMED (reviewer web-react-v7 iter-1, 2026-07-30): even correctly-wired, CometChatSearch's server call (GET /v3.0/conversations?searchKey=...) returns HTTP 402 Payment Required until Search is enabled on the app's plan/Dashboard. So TELL THE USER: search wiring alone yields no results — enable Search in the Dashboard / upgrade the plan (gate G7). Docs are still silent on the exact toggle (owner: docs)." },

    { "id": "reactions", "name": "Message reactions", "category": "default", "enablement": "auto", "auto_rendered_ui": true, "ui_components": ["CometChatReactions", "CometChatReactionList"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/components/reactions", "notes": "ON BY DEFAULT in the v7 UI Kit — NOT a dashboard extension to enable (corrected, AUDIT-077). Hover/long-press a message -> emoji picker -> react; CometChatMessageList renders reaction badges + CometChatReactionList by default. The dashboard 'Reactions' extension is LEGACY: its docs (/extensions/reactions) say it is 'already included as part of the core messaging experience and is scheduled for deprecation' — do NOT enable it and do NOT offer it as an 'add a feature' suggestion. Customize via the reactions component props (fetch the component .md)." },
    { "id": "mentions", "name": "Mentions", "category": "default", "enablement": "auto", "ui_components": ["CometChatMentionsFormatter"], "docs_topic": "https://www.cometchat.com/docs/sdk/javascript/mentions", "notes": "ON BY DEFAULT in the v7 UI Kit — NOT a dashboard extension to enable (corrected, AUDIT-077). Typing @ in CometChatMessageComposer surfaces the user list; the default CometChatMentionsFormatter highlights mentions in bubbles (see the text-formatters entry). The dashboard 'Mentions' extension is LEGACY: its own docs (/extensions/mentions) say it is 'already included as part of the core messaging experience and is scheduled for deprecation' — do NOT enable it and do NOT offer it as an 'add a feature' suggestion. SDK-side mentions use the <@uid:UID> format + MessagesRequestBuilder mentionsWithTagInfo/mentionsWithBlockedInfo filters. Customize rendering via text-formatters." },
    { "id": "polls", "name": "Polls", "category": "extension", "enablement": "dashboard-extension", "ui_components": ["CometChatPollBubble", "CometChatCreatePoll"], "docs_topic": "https://www.cometchat.com/docs/extensions/polls", "notes": "Extension + poll bubble; CometChatCreatePoll is the built-in poll-authoring dialog." },
    { "id": "stickers", "name": "Stickers", "category": "extension", "enablement": "dashboard-extension", "ui_components": ["CometChatStickerBubble"], "docs_topic": "https://www.cometchat.com/docs/extensions/stickers", "notes": "Extension + sticker bubble." },
    { "id": "message-translation", "name": "Message translation", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/message-translation", "notes": "Dashboard extension." },
    { "id": "link-preview", "name": "Link preview", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/link-preview", "notes": "Dashboard extension." },
    { "id": "pin-message", "name": "Pin message", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/pin-message", "notes": "Dashboard extension." },
    { "id": "save-message", "name": "Save message", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/save-message", "notes": "Dashboard extension." },
    { "id": "message-shortcuts", "name": "Message shortcuts", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/message-shortcuts", "notes": "Dashboard extension." },
    { "id": "thumbnail-generation", "name": "Thumbnail generation", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/thumbnail-generation", "notes": "Dashboard extension." },
    { "id": "voice-transcription", "name": "Voice transcription", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/voice-transcription", "notes": "Dashboard extension." },
    { "id": "rich-media-preview", "name": "Rich media preview", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/rich-media-preview", "notes": "Dashboard extension." },
    { "id": "gifs", "name": "GIFs (Giphy / Tenor / Stipop)", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/giphy", "notes": "Pick one GIF provider extension." },
    { "id": "reminders", "name": "Reminders", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/reminders", "notes": "Dashboard extension." },
    { "id": "email-replies", "name": "Email replies", "category": "extension", "enablement": "dashboard-extension", "deprecated": true, "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/email-replies", "notes": "LEGACY / deprecated (AUDIT-077). Live docs title 'Email Replies (Legacy)': 'scheduled for deprecation in the near future... no longer recommended for new integrations.' Still a real dashboard extension but do NOT offer it as an 'add a feature' suggestion for new apps." },
    { "id": "collaborative-whiteboard", "name": "Collaborative whiteboard", "category": "extension", "enablement": "dashboard-extension", "ui_components": ["CometChatCollaborativeWhiteboardBubble"], "docs_topic": "https://www.cometchat.com/docs/extensions/collaborative-whiteboard", "notes": "Extension + whiteboard bubble." },
    { "id": "collaborative-document", "name": "Collaborative document", "category": "extension", "enablement": "dashboard-extension", "ui_components": ["CometChatCollaborativeDocumentBubble"], "docs_topic": "https://www.cometchat.com/docs/extensions/collaborative-document", "notes": "Extension + document bubble." },
    { "id": "disappearing-messages", "name": "Disappearing messages", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/disappearing-messages", "notes": "Security extension." },
    { "id": "e2e-encryption", "name": "End-to-end encryption", "category": "extension", "enablement": "dashboard-extension", "deprecated": true, "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/fundamentals/end-to-end-encryption", "notes": "DEPRECATED / no longer maintained (Virgil-backed). Live docs title 'End To End Encryption (Deprecated)': 'no longer maintained and will not receive further updates.' Treat as legacy — do NOT offer it as an 'add a feature' suggestion for new apps (corrected AUDIT-077)." },
    { "id": "url-shortener", "name": "URL shortener (Bitly / TinyURL)", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/bitly", "notes": "Pick one shortener extension." },
    { "id": "live-streaming", "name": "Live streaming (api.video)", "category": "extension", "enablement": "dashboard-extension", "deprecated": true, "docs_status": "404 — verify", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/live-streaming", "notes": "VERIFY / possibly REMOVED (AUDIT-077): the docs page /extensions/live-streaming 404s (serves the docs homepage) as of 2026-08-14 — the extension may have been removed from the marketplace. Do NOT offer it as an 'add a feature' suggestion until the docs page is confirmed. DOCS-GAP owner: docs." },
    { "id": "support-integrations", "name": "Support integrations (Chatwoot / Intercom)", "category": "extension", "enablement": "dashboard-extension", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/extensions/chatwoot", "notes": "Dashboard extension." },

    { "id": "smart-reply", "name": "Smart replies (AI User Copilot)", "category": "ai", "enablement": "dashboard-toggle", "needs_stitching": true, "needs_dashboard": true, "ui_components": ["CometChatMessageList"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/ai-features", "notes": "NOT zero-code (corrected 2026-07-30, AUDIT-009). Requires BOTH: (1) enable AI User Copilot (Smart Replies) in the Dashboard, AND (2) set the code prop showSmartReplies on CometChatMessageList — it DEFAULTS TO false (index.d.ts:3105), so nothing appears until showSmartReplies={true}. Suggestions render in the CometChatMessageList FOOTER (earlier note wrongly said the composer action sheet). Optional: smartRepliesKeywords, smartRepliesDelayDuration. A standalone CometChatSmartReplies primitive exists (index.d.ts:2245) but the list renders the chips itself — don't hand-place it. Plan-gating: unknown." },
    { "id": "conversation-starter", "name": "Conversation starter (AI User Copilot)", "category": "ai", "enablement": "dashboard-toggle", "needs_dashboard": true, "needs_stitching": true, "ui_components": ["CometChatConversationStarter"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/ai-features", "notes": "NOT zero-code (AUDIT-009/012). Enable via BOTH the Dashboard AI User Copilot toggle AND the code prop showConversationStarters on CometChatMessageList — it DEFAULTS TO false (index.d.ts:3122), so nothing appears until showConversationStarters={true}; starters render in the empty-list FOOTER. A standalone CometChatConversationStarter component also exists (needs getConversationStarters). Plan-gating: unknown." },
    { "id": "conversation-summary", "name": "Conversation summary (AI User Copilot)", "category": "ai", "enablement": "dashboard-toggle", "needs_stitching": true, "needs_dashboard": true, "ui_components": ["CometChatMessageHeader", "CometChatConversationSummary"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/ai-features", "notes": "NOT zero-code (corrected 2026-07-30, AUDIT-009). Requires the Dashboard toggle AND code props: CometChatMessageHeader showConversationSummaryButton DEFAULTS false (index.d.ts:4747) — set showConversationSummaryButton={true} + onSummaryClick to surface it (optional enableAutoSummaryGeneration). A CometChatConversationSummary component also exists. Plan-gating: unknown." },
    { "id": "ai-assistant", "name": "AI assistant chat (AI Agents)", "category": "ai", "enablement": "dashboard-toggle", "ui_components": ["CometChatAIAssistantChat"], "docs_topic": "https://www.cometchat.com/docs/ai-agents/agent-builder/overview", "notes": "Build/deploy an agent in Agent Builder, enable in dashboard. CometChatAIAssistantChat IS a real v7 component (1:1 user↔agent). Plan-gating: unknown." },

    { "id": "voice-video-calls", "name": "Voice & video calling", "category": "package-install", "enablement": "npm-package", "package": "@cometchat/calls-sdk-javascript@5", "ui_components": ["CometChatCallButtons", "CometChatIncomingCall", "CometChatOutgoingCall", "CometChatCallLogs"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react/call-features", "notes": "Full operational depth lives in the cometchat-react-v7-calls SKILL. Install the calls SDK — MAJOR v5 (@cometchat/calls-sdk-javascript@5), separate from chat SDK v4, NOT bundled by the kit. Enable it on the mandated initFromSettings path with uiKit:{callsSDK:{}} in CometChatUIKit.initFromSettings (the kit computes callingEnabled = !!settings.uiKit.callsSDK; the #1 gotcha). The classic UIKitSettingsBuilder().setCallingEnabled(true) + CometChatUIKit.init(...) still works but skips the ai-agent telemetry path, so prefer initFromSettings. Calling UI ships inside chat-uikit-react (no separate calls UI package). Not plan-gated (usage-billed). Mount CometChatIncomingCall once at app root; MessageHeader surfaces call buttons by default (don't double-mount CometChatCallButtons). 1:1 rings; groups JOIN (no group-ring primitive). GOTCHAS (baked in the calls skill): idle-timeout is in MILLISECONDS (180 ≠ 180s); zero-dimension call surface crashes/blanks; Next.js needs client-only render + a webpack fs/path fallback; HTTPS required for getUserMedia; screen-share/PiP/recording/device-select are separate wiring." },

    { "id": "custom-message-types", "name": "Custom message types (message plugins)", "category": "default", "enablement": "code-prop", "ui_components": ["CometChatMessagePlugin", "CometChatPluginRegistry", "CometChatTextPlugin", "CometChatCardBubblePlugin"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react", "notes": "v7 replaces v6's CometChatMessageTemplate with a PLUGIN architecture. A custom message type = an object implementing CometChatMessagePlugin (id, messageTypes, messageCategories, renderBubble), registered via <CometChatProvider plugins={[myPlugin]}> — the plugins prop is MERGED with defaultPlugins internally (use removePlugins to override a built-in). Provider-level config, not a standalone screen. Built-in plugins (text/image/poll/sticker/...) are already in defaultPlugins. Verified vs installed 7.1.x types; compiling recipe in cometchat-react-v7-features." },
    { "id": "text-formatters", "name": "Text formatters / rich text (mentions, markdown, URLs)", "category": "default", "enablement": "code-prop", "ui_components": ["CometChatTextFormatter", "CometChatRichTextFormatter", "CometChatMarkdownFormatter", "CometChatMentionsFormatter", "CometChatUrlFormatter"], "docs_topic": "https://www.cometchat.com/docs/ui-kit/react", "notes": "The default text plugin already applies @mentions, URLs and markdown. Add CUSTOM formatting by subclassing the abstract CometChatTextFormatter (id + getRegex() + format()) and passing it via the textFormatters?: CometChatTextFormatter[] prop on CometChatMessageComposer (and the bubble components) — NOT on CometChatMessageList. Built-in formatters (CometChatMentionsFormatter/UrlFormatter/MarkdownFormatter/RichTextFormatter) have no-arg constructors. Verified vs installed 7.1.x types; compiling recipe in cometchat-react-v7-features." },

    { "id": "push-notifications", "name": "Push notifications (Notifications product)", "category": "dashboard-only", "enablement": "dashboard-toggle", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/notifications/web-push-notifications", "notes": "Full operational depth lives in the cometchat-react-v7-push SKILL. Current path = Notifications product (NOT the legacy push extension). Enable in dashboard (Notifications → add FCM provider → Provider ID) + client: install firebase@^10.3.1, get an FCM web token (VAPID key + public/firebase-messaging-sw.js), then CometChatNotifications.registerPushToken(token, PushPlatforms.FCM_WEB, providerId) AFTER login; unregisterPushToken() before logout. Permission on a user gesture; iOS = PWA-only; per-bundler SW placement. CometChat's backend is the sender (delivery needs the Dashboard FCM provider). NOTE: self-hosted VAPID + message-sent webhook is NOT a documented v7 web path (v6-era only)." },
    { "id": "email-notifications", "name": "Email notifications", "category": "dashboard-only", "enablement": "dashboard-toggle", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/notifications/overview", "notes": "Notifications product; dashboard-configured." },
    { "id": "sms-notifications", "name": "SMS notifications", "category": "dashboard-only", "enablement": "dashboard-toggle", "ui_components": [], "docs_topic": "https://www.cometchat.com/docs/notifications/overview", "notes": "Notifications product; dashboard-configured." },
    { "id": "notification-feed", "name": "In-app notification feed", "category": "dashboard-only", "enablement": "dashboard-toggle", "needs_dashboard": true, "ui_components": ["CometChatNotificationFeed"], "docs_topic": "https://www.cometchat.com/docs/notifications/overview", "notes": "The IN-APP notifications inbox — distinct from push/email/sms which DELIVER notifications out; this renders them inside the app. Added 2026-07-31 (AUDIT-012 coverage sweep): the CometChatNotificationFeed component was already in the components catalog but had no feature entry. Drop-in CometChatNotificationFeed provides categories/filter chips, date grouping, unread counts, mark-all-read; item content renders as cards via @cometchat/cards-react (auto-installed WITH the UI Kit, no separate npm install). Unread badge via the useNotificationUnreadCount hook. Requires the Notifications product enabled/configured in the Dashboard. Plan-gating: unknown — verify." },

    { "id": "moderation", "name": "Moderation (Rules Engine + Lists)", "category": "dashboard-only", "enablement": "dashboard-toggle", "needs_stitching": false, "auto_rendered_ui": true, "ui_components": ["CometChatModerationView", "CometChatFlagMessageDialog"], "docs_topic": "https://www.cometchat.com/docs/moderation/overview", "notes": "100% DASHBOARD-CONFIGURED — emit ZERO moderation client code (corrected AUDIT-078). The listed ui_components are AUTO-RENDERED / INTERNAL, NOT host-wired: (a) CometChatModerationView is the moderation FOOTER the kit renders AUTOMATICALLY for blocked/pending messages (CometChatMessageList prop hideModerationView defaults false = shown; backed by isMessageModerated/isMessagePendingModeration) — you render NOTHING; (b) CometChatFlagMessageDialog is opened INTERNALLY by the message list's BUILT-IN 'Report message' option, already present in each received message's context menu (reasons via CometChat.getFlagReasons(), submit via SDK flagMessage) — do NOT hand-roll a custom Report option via plugin getOptions and do NOT mount CometChatFlagMessageDialog yourself (that DUPLICATES the built-in — the #1 moderation mistake, AUDIT-078). So MODERATION = dashboard only: (1) set up the unified Rules Engine in the Dashboard Moderation section (auto block/flag on send; content filtering text/image/video; Flagged/Blocked Messages; keyword/regex Lists) — it is NOT a classic extension, so the CLI cannot toggle it; (2) turn ON Report Message / Report User (these power the built-in Report option). The kit surfaces everything once those are on. Legacy per-word extensions (Profanity Filter, Data Masking, Image Moderation, Sentiment Analysis) are being phased out — disable before using rules. Plan-gating: unknown. CometChatModerationView/CometChatFlagMessageDialog are real v7 exports (AUDIT-009) — but auto/internal, not to be hand-mounted." }
  ]
}
