@botmesh/core - v2.0.0-alpha.2
    Preparing search index...

    Interface ProviderCapabilities

    interface ProviderCapabilities {
        contentKinds: readonly (
            | "text"
            | "image"
            | "video"
            | "audio"
            | "voice"
            | "document"
            | "sticker"
            | "location"
            | "contact"
            | "poll"
            | "buttons"
            | "list"
            | "form"
            | "reaction"
            | "native"
            | "card"
            | "template"
        )[];
        maxTextLength?: number;
        maxTextBytes?: number;
        maxMediaBytes?: number;
        maxButtonDataBytes?: number;
        buttons: boolean;
        lists: boolean;
        polls: boolean;
        reactions: boolean;
        edit: boolean;
        typing: boolean;
        presence: boolean;
        readReceipts: boolean;
        groups: boolean;
        templates: boolean;
        interactionsRequireAck: boolean;
        pushIngress: boolean;
        exclusiveSession?: boolean;
        forms?: "native"
        | "degraded";
        streaming?: StreamingMode;
        textFormat?: TextFormat;
    }
    Index
    contentKinds: readonly (
        | "text"
        | "image"
        | "video"
        | "audio"
        | "voice"
        | "document"
        | "sticker"
        | "location"
        | "contact"
        | "poll"
        | "buttons"
        | "list"
        | "form"
        | "reaction"
        | "native"
        | "card"
        | "template"
    )[]

    Content kinds this provider can actually deliver.

    maxTextLength?: number

    Max length of one text message in UTF-16 code units (string.length). A longer text send is split by the core into several messages (BotConfig.splitLongText); ctx.stream() honours it too. Unset = no known limit.

    maxTextBytes?: number

    Max size of one text message in UTF-8 bytes, for transports that count bytes (Instagram: 1000). Applied together with maxTextLength. Unset = no byte limit.

    maxMediaBytes?: number
    maxButtonDataBytes?: number
    buttons: boolean
    lists: boolean
    polls: boolean
    reactions: boolean

    Can SEND reactions (an outbound reaction OutboundContent). This does NOT describe inbound reaction receipt — providers may emit inbound reaction events regardless of this flag (e.g. Messenger/Instagram receive reactions but cannot send them, so they set this false).

    edit: boolean
    typing: boolean
    presence: boolean
    readReceipts: boolean
    groups: boolean
    templates: boolean
    interactionsRequireAck: boolean

    Interactions carry a hard ack deadline (Discord): the core then acknowledges each interaction on its own (see InboundInteraction). false when an ack is optional (Telegram's spinner) or meaningless; then only ctx.acknowledge() acks.

    pushIngress: boolean

    Delivery is push-to-us (webhook) rather than a socket the provider owns.

    exclusiveSession?: boolean

    Set it when two live replicas of the bot would each receive EVERY event, or fight for the one connection the account allows: a WhatsApp Web socket (Baileys, a second connection logs the first out), Telegram long polling (two getUpdates loops get 409), a Discord gateway without sharding (every connection gets every event), an IMAP IDLE mailbox (both replicas fetch the same unseen mail). NOT for webhook or REST-gateway transports (Cloud API, Messenger, Instagram, Twilio, Gupshup, GoHighLevel, Evolution, WPPConnect, TikTok): the platform holds the session and a webhook fans out to whichever replica is behind the load balancer. With multi-replica coordination (BotConfig.coordination, providerSession: 'auto') only the elected replica starts a provider that sets it. Omitted → false.

    forms?: "native" | "degraded"

    How flow().form() renders: 'native' = the provider accepts form OutboundContent and emits 'form' inbound messages with the submission (WhatsApp Flows on the Cloud API); 'degraded' (or absent) = the core asks field by field with plain text messages.

    streaming?: StreamingMode

    How ctx.stream() renders a reply that is still being generated: 'draft' — native ephemeral draft previews (IProvider.sendDraft) then one final send (Telegram sendMessageDraft); 'edit' — send once, then throttled IProvider.editMessage calls (Discord, Telegram groups); 'none' — no live preview: sentence-sized chunks with typing (WhatsApp). Omitted → treated as 'none'.

    textFormat?: TextFormat

    Rich-text dialect the channel renders in plain text messages, so producers of Markdown (e.g. @botmesh/ai replies) can convert it: 'whatsapp' — *bold*, _italic_, ~strike~, `code`; 'markdown' — Markdown is rendered as is (Discord); 'html' — a small HTML subset; 'plain' — no formatting at all (markers are shown literally, so strip them). Omitted → unknown: text is sent untouched.