> ## Documentation Index
> Fetch the complete documentation index at: https://botmesh.afaya.com.co/llms.txt
> Use this file to discover all available pages before exploring further.

# ProviderCapabilities

> Interface exported by @botmesh/core.

Defined in: [core/provider.ts:547](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L547)

What a transport can do: content kinds, buttons, typing, edits, text limits and so on.
Handlers usually ask through `ctx.supports(feature)`; an unsupported operation is an absent
provider method with a `false` flag here.

## Properties

### contentKinds

```ts theme={null}
contentKinds: readonly (
  | "text"
  | "image"
  | "video"
  | "audio"
  | "voice"
  | "document"
  | "sticker"
  | "location"
  | "contact"
  | "poll"
  | "buttons"
  | "list"
  | "form"
  | "reaction"
  | "native"
  | "card"
  | "template")[];
```

Defined in: [core/provider.ts:549](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L549)

Content kinds this provider can actually deliver.

***

### maxTextLength?

```ts theme={null}
maxTextLength?: number;
```

Defined in: [core/provider.ts:555](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L555)

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?

```ts theme={null}
maxTextBytes?: number;
```

Defined in: [core/provider.ts:560](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L560)

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

***

### maxMediaBytes?

```ts theme={null}
maxMediaBytes?: number;
```

Defined in: [core/provider.ts:561](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L561)

***

### maxButtonDataBytes?

```ts theme={null}
maxButtonDataBytes?: number;
```

Defined in: [core/provider.ts:562](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L562)

***

### buttons

```ts theme={null}
buttons: boolean;
```

Defined in: [core/provider.ts:563](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L563)

***

### lists

```ts theme={null}
lists: boolean;
```

Defined in: [core/provider.ts:564](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L564)

***

### polls

```ts theme={null}
polls: boolean;
```

Defined in: [core/provider.ts:565](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L565)

***

### reactions

```ts theme={null}
reactions: boolean;
```

Defined in: [core/provider.ts:572](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L572)

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

```ts theme={null}
edit: boolean;
```

Defined in: [core/provider.ts:573](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L573)

***

### typing

```ts theme={null}
typing: boolean;
```

Defined in: [core/provider.ts:574](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L574)

***

### presence

```ts theme={null}
presence: boolean;
```

Defined in: [core/provider.ts:575](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L575)

***

### readReceipts

```ts theme={null}
readReceipts: boolean;
```

Defined in: [core/provider.ts:576](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L576)

***

### groups

```ts theme={null}
groups: boolean;
```

Defined in: [core/provider.ts:577](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L577)

***

### templates

```ts theme={null}
templates: boolean;
```

Defined in: [core/provider.ts:578](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L578)

***

### interactionsRequireAck

```ts theme={null}
interactionsRequireAck: boolean;
```

Defined in: [core/provider.ts:584](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L584)

Interactions carry a hard ack deadline (Discord): the core then acknowledges each
interaction on its own (see [InboundInteraction](https://botmesh.afaya.com.co/api/core/interfaces/InboundInteraction.md)). `false` when an ack is
optional (Telegram's spinner) or meaningless; then only `ctx.acknowledge()` acks.

***

### pushIngress

```ts theme={null}
pushIngress: boolean;
```

Defined in: [core/provider.ts:586](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L586)

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

***

### exclusiveSession?

```ts theme={null}
exclusiveSession?: boolean;
```

Defined in: [core/provider.ts:599](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L599)

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?

```ts theme={null}
forms?: "native" | "degraded";
```

Defined in: [core/provider.ts:606](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L606)

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?

```ts theme={null}
streaming?: StreamingMode;
```

Defined in: [core/provider.ts:615](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L615)

How `ctx.stream()` renders a reply that is still being generated:
`'draft'` — native ephemeral draft previews ([IProvider.sendDraft](https://botmesh.afaya.com.co/api/core/interfaces/IProvider.md#senddraft)) then
one final send (Telegram `sendMessageDraft`); `'edit'` — send once, then
throttled [IProvider.editMessage](https://botmesh.afaya.com.co/api/core/interfaces/IProvider.md#editmessage) calls (Discord, Telegram groups);
`'none'` — no live preview: sentence-sized chunks with typing (WhatsApp).
Omitted → treated as `'none'`.

***

### textFormat?

```ts theme={null}
textFormat?: TextFormat;
```

Defined in: [core/provider.ts:624](https://github.com/andresayac/botmesh/blob/main/packages/core/src/core/provider.ts#L624)

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.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.