Developer and self-hosted
Mattermost
Status: Plugin disponível para download (token de bot + eventos WebSocket). Há suporte a canais, canais privados, DMs em grupo e DMs. O Mattermost é uma plataforma auto-hospedável de mensagens para equipes (mattermost.com).
Instalação
Registro npm
openclaw plugins install @openclaw/mattermostCheckout local
openclaw plugins install ./path/to/local/mattermost-pluginDetalhes: Plugins
Configuração rápida
Verifique se o Plugin está disponível
Instale @openclaw/mattermost com o comando acima e reinicie o Gateway caso ele já esteja em execução.
Crie um bot do Mattermost
Crie uma conta de bot no Mattermost, copie o token do bot e adicione o bot às equipes e aos canais que ele deve ler.
Copie a URL base
Copie a URL base do Mattermost (por exemplo, https://chat.example.com). Um /api/v4 no final é removido automaticamente.
Configure o OpenClaw e inicie o Gateway
Configuração mínima:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}Alternativa não interativa:
openclaw channels add --channel mattermost --bot-token <token> --http-url https://chat.example.comComandos de barra nativos
Os comandos de barra nativos são opcionais. Quando habilitados, o OpenClaw registra comandos de barra oc_* em todas as equipes das quais o bot é membro e recebe POSTs de callback no servidor HTTP do Gateway.
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Use quando o Mattermost não puder acessar o Gateway diretamente (proxy reverso/URL pública). callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}Comandos registrados: /oc_status, /oc_model, /oc_models, /oc_new, /oc_help, /oc_think, /oc_reasoning, /oc_verbose, /oc_queue. Com nativeSkills: true, os comandos de Skills também são registrados como /oc_<skill>.
Observações sobre o comportamento
- O padrão de
nativeenativeSkillsé"auto", que resulta em desabilitado para o Mattermost. Defina-os explicitamente comotrue. - O padrão de
callbackPathé/api/channels/mattermost/command. - Se
callbackUrlfor omitida, o OpenClaw derivahttp://<gateway.customBindHost ou localhost>:<gateway.port, padrão 18789><callbackPath>. Hosts de associação curinga (0.0.0.0,::) usamlocalhostcomo alternativa. - Em configurações com várias contas,
commandspode ser definido no nível superior ou emchannels.mattermost.accounts.<id>.commands(os valores da conta substituem os campos do nível superior). - Comandos de barra existentes com o mesmo gatilho, criados por outras integrações, permanecem inalterados (o registro os ignora); os comandos criados pelo bot são atualizados ou recriados quando a URL de callback diverge.
- Os callbacks de comandos são validados com os tokens específicos de cada comando retornados pelo Mattermost quando o OpenClaw registra os comandos
oc_*. - O OpenClaw atualiza o registro atual de comandos do Mattermost antes de aceitar cada callback; assim, tokens obsoletos de comandos de barra excluídos ou gerados novamente deixam de ser aceitos sem reiniciar o Gateway.
- A validação do callback falha de modo seguro se a API do Mattermost não puder confirmar que o comando ainda é atual; as validações com falha são armazenadas brevemente em cache, consultas simultâneas são agrupadas e o início de novas consultas tem limite de frequência por comando para restringir a pressão de repetição.
- Os callbacks de barra falham de modo seguro quando o registro falha, a inicialização é parcial ou o token do callback não corresponde ao token registrado do comando resolvido (um token válido para um comando não pode alcançar a validação upstream de outro comando).
- Os callbacks aceitos são confirmados com uma resposta efêmera "Processando..."; a resposta real chega como uma mensagem normal.
Requisito de acessibilidade
O endpoint de callback deve estar acessível a partir do servidor do Mattermost.
- Não defina
callbackUrlcomolocalhost, a menos que o Mattermost seja executado no mesmo host/namespace de rede que o OpenClaw. - Não defina
callbackUrlcomo a URL base do Mattermost, a menos que essa URL use um proxy reverso para encaminhar/api/channels/mattermost/commandao OpenClaw. - Uma verificação rápida é
curl https://<gateway-host>/api/channels/mattermost/command; uma solicitação GET deve retornar405 Method Not Alloweddo OpenClaw, não404.
Lista de permissões de saída do Mattermost
Se o callback tiver como destino endereços privados/da tailnet/internos, defina ServiceSettings.AllowedUntrustedInternalConnections do Mattermost para incluir o host/domínio do callback.
Use entradas de host/domínio, não URLs completas.
- Correto:
gateway.tailnet-name.ts.net - Incorreto:
https://gateway.tailnet-name.ts.net
Variáveis de ambiente (conta padrão)
Defina estas variáveis no host do Gateway se preferir usar variáveis de ambiente:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Modos de chat
O Mattermost responde automaticamente às DMs. O comportamento nos canais é controlado por chatmode:
oncall (padrão)
Responde somente quando recebe uma @menção nos canais.
onmessage
Responde a todas as mensagens do canal.
onchar
Responde quando uma mensagem começa com um prefixo de gatilho.
Exemplo de configuração:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], // padrão }, },}Observações:
oncharainda responde a @menções explícitas.channels.mattermost.requireMentioncontinua sendo respeitado, maschatmodeé preferível. As configuraçõesgroups.<channelId>.requireMentionespecíficas de cada canal têm precedência sobre ambas.- Depois que o bot envia uma resposta visível em uma thread de canal, as mensagens posteriores nessa mesma thread são respondidas sem uma nova @menção nem um prefixo
onchar, permitindo que as conversas com várias interações continuem fluindo. A participação é lembrada por sete dias após a última resposta do bot nessa thread e persiste após reinicializações do Gateway. As threads que o bot apenas observou não são afetadas; inicie uma nova mensagem de nível superior para voltar a exigir uma menção explícita.
Threads e sessões
Use channels.mattermost.replyToMode para controlar se as respostas de canais e grupos permanecem no canal principal ou iniciam uma thread sob a publicação que as acionou.
off(padrão): responde em uma thread somente quando a publicação recebida já está em uma.first: para publicações de nível superior em canais/grupos, inicia uma thread sob essa publicação e encaminha a conversa para uma sessão com escopo de thread.- Atualmente,
allebatchedtêm o mesmo comportamento quefirstno Mattermost, pois, depois que o Mattermost tem uma raiz de thread, os blocos e as mídias subsequentes continuam nessa mesma thread. - O padrão das mensagens diretas é
off, mesmo quandoreplyToModeestá definido.
Use channels.mattermost.replyToModeByChatType para substituir o modo em conversas direct, group ou channel. Defina direct para habilitar threads em mensagens diretas:
off(padrão): as mensagens diretas permanecem sem threads em uma única sessão contínua.first,alloubatched: cada mensagem direta de nível superior inicia uma thread do Mattermost apoiada por uma sessão nova e independente.
{ channels: { mattermost: { replyToMode: "all", replyToModeByChatType: { direct: "first", }, }, },}Observações:
- As sessões com escopo de thread usam o ID da publicação que acionou a conversa como raiz da thread.
- Atualmente,
firsteallsão equivalentes, pois, depois que o Mattermost tem uma raiz de thread, os blocos e as mídias subsequentes continuam nessa mesma thread. - As substituições por tipo de conversa têm precedência sobre
replyToMode. Sem uma substituição dedirect, as implantações existentes mantêm DMs lineares, sem threads.
Controle de acesso (DMs)
- Padrão:
channels.mattermost.dmPolicy = "pairing"(remetentes desconhecidos recebem um código de pareamento). Outros valores:allowlist,open,disabled. - Aprove por meio de:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- DMs públicas:
channels.mattermost.dmPolicy="open"maischannels.mattermost.allowFrom=["*"](o esquema de configuração exige o curinga). channels.mattermost.allowFromaceita IDs de usuário (recomendado) e entradasaccessGroup:<name>. Consulte Grupos de acesso.
Canais (grupos)
- Padrão:
channels.mattermost.groupPolicy = "allowlist"(exige menção). - Inclua remetentes na lista de permissões com
channels.mattermost.groupAllowFrom(IDs de usuário recomendados). channels.mattermost.groupAllowFromaceita entradasaccessGroup:<name>. Consulte Grupos de acesso.- As substituições de menção específicas de cada canal ficam em
channels.mattermost.groups.<channelId>.requireMentionou, para um padrão, emchannels.mattermost.groups["*"].requireMention. - A correspondência de
@usernameé mutável e somente é habilitada quandochannels.mattermost.dangerouslyAllowNameMatching: true. - Canais abertos:
channels.mattermost.groupPolicy="open"(exige menção). - Ordem de resolução:
channels.mattermost.groupPolicy, depoischannels.defaults.groupPolicye, por fim,"allowlist". - Observação de tempo de execução: se a seção
channels.mattermostestiver completamente ausente, o tempo de execução falha de modo seguro usandogroupPolicy="allowlist"nas verificações de grupo (mesmo quechannels.defaults.groupPolicyesteja definido) e registra um aviso uma única vez.
Exemplo:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}Destinos para entrega de saída
Use estes formatos de destino com openclaw message send ou Cron/Webhooks:
| Destino | Entrega em |
|---|---|
channel:<id> |
Canal pelo ID |
channel:<name> ou #channel-name |
Canal pelo nome, pesquisado nas equipes às quais o bot pertence |
user:<id> ou mattermost:<id> |
DM com esse usuário |
@username |
DM (nome de usuário resolvido por meio da API do Mattermost) |
Os envios de saída aceitam no máximo um anexo por mensagem; divida vários arquivos em envios separados.
Nova tentativa de canal de DM
Quando o OpenClaw envia para um destino de DM do Mattermost e precisa primeiro resolver o canal direto, por padrão ele tenta novamente após falhas transitórias na criação do canal direto.
Use channels.mattermost.dmChannelRetry para ajustar esse comportamento globalmente para o Plugin do Mattermost ou channels.mattermost.accounts.<id>.dmChannelRetry para uma conta. Padrões:
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}Observações:
- Isso se aplica somente à criação de canais de MD (
/api/v4/channels/direct), não a todas as chamadas à API do Mattermost. - As novas tentativas usam recuo exponencial com variação aleatória e se aplicam a falhas transitórias, como limites de taxa, respostas 5xx e erros de rede ou de tempo limite.
- Erros 4xx do cliente diferentes de
429são tratados como permanentes e não geram novas tentativas.
Transmissão da prévia
O Mattermost transmite o raciocínio, a atividade das ferramentas e o texto parcial da resposta para uma publicação de prévia em rascunho, que é finalizada no próprio lugar quando for seguro enviar a resposta final. No modo partial, a prévia é atualizada na mesma ID de publicação, em vez de inundar o canal com mensagens para cada fragmento. No modo block, a prévia alterna entre blocos de texto concluído e de atividade das ferramentas, de modo que os blocos anteriores permaneçam visíveis como publicações próprias, em vez de serem sobrescritos pelo bloco seguinte. Resultados finais com mídia ou erro cancelam as edições pendentes da prévia e usam a entrega normal, em vez de publicar uma prévia descartável.
A transmissão da prévia fica ativada por padrão no modo partial. Configure por meio de channels.mattermost.streaming (uma string de modo, um booleano ou um objeto como { mode: "progress" }):
{ channels: { mattermost: { streaming: "partial", // off | partial | block | progress }, },}Modos de transmissão
partial(padrão): uma publicação de prévia que é editada à medida que a resposta cresce e, em seguida, finalizada com a resposta completa.blockalterna a prévia entre blocos de texto concluído e de atividade das ferramentas, de modo que cada bloco permaneça visível como uma publicação própria, em vez de ser sobrescrito no mesmo lugar. Atualizações paralelas e consecutivas de ferramentas compartilham a publicação atual de atividade das ferramentas.progressexibe uma prévia de status durante a geração e publica a resposta final somente após a conclusão.offdesativa a transmissão da prévia. ComblockStreaming: true, os blocos concluídos do assistente ainda são entregues como respostas normais em blocos (publicações separadas), em vez de uma única publicação final consolidada.
Observações sobre o comportamento da transmissão
- Se não for possível finalizar a transmissão no próprio lugar (por exemplo, se a publicação for excluída durante a transmissão), o OpenClaw recorre ao envio de uma nova publicação final para que a resposta nunca seja perdida.
- Cargas contendo somente raciocínio são suprimidas das publicações do canal, incluindo texto que chega como uma citação em bloco
> Thinking. Defina/reasoning onpara ver o raciocínio em outras superfícies; a publicação final do Mattermost mantém somente a resposta. - Consulte Transmissão para ver a matriz de mapeamento de canais.
Reações (ferramenta de mensagens)
- Use
message action=reactcomchannel=mattermost. messageIdé a ID da publicação do Mattermost.emojiaceita nomes comothumbsupou:+1:(os dois-pontos são opcionais).- Defina
remove=true(booleano) para remover uma reação. - Eventos de adição e remoção de reações são encaminhados como eventos do sistema para a sessão roteada do agente, sujeitos às mesmas verificações de política de MD/grupo aplicadas às mensagens.
Exemplos:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=trueConfiguração:
channels.mattermost.actions.reactions: ativa/desativa ações de reação (padrão: verdadeiro).- Substituição por conta:
channels.mattermost.accounts.<id>.actions.reactions.
Botões interativos (ferramenta de mensagens)
Envie mensagens com botões clicáveis. Quando um usuário clica em um botão, o agente recebe a seleção e pode responder.
Os botões vêm da carga semântica presentation (nas respostas normais do agente e em message action=send). O OpenClaw renderiza botões de valor como botões interativos do Mattermost, mantém os botões de URL visíveis no texto da mensagem e converte menus de seleção em texto legível.
message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Yes","value":"yes"},{"label":"No","value":"no"}]}]}Campos dos botões da apresentação:
labelstringrequiredRótulo exibido (alias: text).
valuestringValor retornado ao clicar, usado como ID da ação (aliases: callback_data, callbackData). Obrigatório para um botão clicável, a menos que url esteja definido.
urlstringBotão de link; renderizado como texto label: url no corpo da mensagem, em vez de um botão interativo.
style"primary" | "secondary" | "success" | "danger"Estilo do botão. O Mattermost aplica o estilo padrão aos valores que não oferece suporte.
Para anunciar o suporte a botões no prompt de sistema do agente, adicione inlineButtons aos recursos do canal:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}Quando um usuário clica em um botão:
Verificação de acesso
Quem clicar deverá passar pelas mesmas verificações de política de MD/grupo aplicadas ao remetente de uma mensagem; cliques não autorizados recebem um aviso efêmero e são ignorados.
Botões substituídos por confirmação
Todos os botões são substituídos por uma linha de confirmação (por exemplo, "✓ Yes selecionado por @user").
O agente recebe a seleção
O agente recebe a seleção como uma mensagem de entrada (além de um evento do sistema) e responde.
Observações de implementação
- Os retornos de chamada dos botões usam verificação HMAC-SHA256 (automática, sem necessidade de configuração).
- Todo o bloco de anexo é substituído ao clicar; portanto, todos os botões são removidos juntos — não é possível removê-los parcialmente.
- IDs de ação que contêm hífens ou sublinhados são higienizadas automaticamente (limitação de roteamento do Mattermost).
- Cliques cujo
action_idnão corresponde a uma ação na publicação original são rejeitados com403("Unknown action").
Configuração e acessibilidade
channels.mattermost.capabilities: matriz de strings de recursos. Adicione"inlineButtons"para ativar a descrição da ferramenta de botões no prompt de sistema do agente.channels.mattermost.interactions.callbackBaseUrl: URL base externa opcional para retornos de chamada de botões (por exemplo,https://gateway.example.com). Use-a quando o Mattermost não puder acessar diretamente o Gateway pelo host ao qual ele está vinculado.- Em configurações com várias contas, você também pode definir o mesmo campo em
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Se
interactions.callbackBaseUrlfor omitido, o OpenClaw derivará a URL de retorno de chamada degateway.customBindHost+gateway.port(padrão: 18789) e, em seguida, recorrerá ahttp://localhost:<port>. O caminho do retorno de chamada é/mattermost/interactions/<accountId>. - Regra de acessibilidade: a URL de retorno de chamada do botão deve estar acessível a partir do servidor Mattermost.
localhostfunciona somente quando o Mattermost e o OpenClaw são executados no mesmo host/espaço de nomes de rede. channels.mattermost.interactions.allowedSourceIps: lista de IPs de origem permitidos para retornos de chamada de botões. Sem ela, somente origens de loopback (127.0.0.1,::1) são aceitas; portanto, um servidor Mattermost remoto deve ser incluído nessa lista, ou seus cliques serão rejeitados com403. Atrás de um proxy reverso, defina tambémgateway.trustedProxiespara que o IP real do cliente seja obtido dos cabeçalhos encaminhados.- Se o destino do retorno de chamada for privado, da tailnet ou interno, adicione o host/domínio dele a
ServiceSettings.AllowedUntrustedInternalConnectionsdo Mattermost.
Integração direta com a API (scripts externos)
Scripts externos e webhooks podem publicar botões diretamente pela API REST do Mattermost, em vez de passar pela ferramenta message do agente. Use buildButtonAttachments() do Plugin quando possível; se publicar JSON bruto, siga estas regras:
Estrutura da carga:
{ channel_id: "<channelId>", message: "Choose an option:", props: { attachments: [ { actions: [ { id: "mybutton01", // alphanumeric only - see below type: "button", // required, or clicks are silently ignored name: "Approve", // display label style: "primary", // optional: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // must match button id action: "approve", // ... any custom fields ... _token: "<hmac>", // see HMAC section below }, }, }, ], }, ], },}Geração do token HMAC
O Gateway verifica os cliques em botões com HMAC-SHA256. Scripts externos devem gerar tokens que correspondam à lógica de verificação do Gateway:
Derive o segredo do token do bot
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), codificado em hexadecimal.
Crie o objeto de contexto
Crie o objeto de contexto com todos os campos, exceto _token.
Serialização com chaves ordenadas
Faça a serialização com chaves ordenadas recursivamente e sem espaços (o Gateway também canoniza objetos aninhados e produz JSON compacto).
Assine a carga
HMAC-SHA256(key=secret, data=serializedContext)
Adicione o token
Adicione o resumo hexadecimal resultante como _token no contexto.
Exemplo em Python:
secret = hmac.new( b"openclaw-mattermost-interactions", bot_token.encode(), hashlib.sha256).hexdigest() ctx = {"action_id": "mybutton01", "action": "approve"}payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() context = {**ctx, "_token": token}Armadilhas comuns de HMAC
- O
json.dumpsdo Python adiciona espaços por padrão ({"key": "val"}). Useseparators=(",", ":")para corresponder à saída compacta do JavaScript ({"key":"val"}). - Sempre assine todos os campos do contexto (menos
_token). O Gateway remove_tokene depois assina tudo o que restar. Assinar apenas um subconjunto causa uma falha silenciosa de verificação. - Use
sort_keys=True— o Gateway ordena as chaves antes da assinatura, e o Mattermost pode reordenar os campos de contexto ao armazenar a carga. - Derive o segredo do token do bot (de forma determinística), não de bytes aleatórios. O segredo deve ser o mesmo no processo que cria os botões e no Gateway que faz a verificação.
Adaptador de diretório
O Plugin do Mattermost inclui um adaptador de diretório que resolve nomes de canais e usuários por meio da API do Mattermost. Isso permite usar destinos #channel-name e @username em openclaw message send e em entregas de Cron/Webhook.
Nenhuma configuração é necessária — o adaptador usa o token do bot definido na configuração da conta.
Várias contas
O Mattermost oferece suporte a várias contas em channels.mattermost.accounts:
{ channels: { mattermost: { accounts: { default: { name: "Primary", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Alerts", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}Os valores da conta substituem os campos de nível superior; channels.mattermost.defaultAccount seleciona qual conta será usada quando nenhuma for especificada.
Solução de problemas
Sem respostas nos canais
Verifique se o bot está no canal e mencione-o (oncall), use um prefixo de acionamento (onchar) ou defina chatmode: "onmessage".
Erros de autenticação ou de várias contas
- Verifique o token do bot, a URL base e se a conta está habilitada.
- Problemas com várias contas: as variáveis de ambiente se aplicam somente à conta
default. - Hosts Mattermost privados/da LAN precisam de
network.dangerouslyAllowPrivateNetwork: true(a proteção contra SSRF bloqueia IPs privados por padrão).
Falha nos comandos de barra nativos
Unauthorized: invalid command token.: o OpenClaw não aceitou o token de retorno de chamada. Causas comuns:- o registro do comando de barra falhou ou foi concluído apenas parcialmente na inicialização
- o retorno de chamada está chegando ao gateway/à conta incorretos
- o Mattermost ainda tem comandos antigos apontando para um destino de retorno de chamada anterior
- o Gateway foi reiniciado sem reativar os comandos de barra
- Se os comandos de barra nativos pararem de funcionar, verifique os logs em busca de
mattermost: failed to register slash commandsoumattermost: native slash commands enabled but no commands could be registered. - Se
callbackUrlfor omitido e os logs avisarem que o retorno de chamada foi resolvido para uma URL de local loopback comohttp://localhost:18789/..., essa URL provavelmente só será acessível quando o Mattermost estiver em execução no mesmo host/espaço de nomes de rede que o OpenClaw. Em vez disso, defina explicitamente umcommands.callbackUrlacessível externamente.
Problemas com botões
- Os botões aparecem como caixas brancas ou não aparecem: os dados do botão estão malformados. Cada botão de apresentação precisa de um
labele umvalue(botões sem um deles são descartados). - Os botões são renderizados, mas os cliques não fazem nada: verifique se o Gateway está acessível pelo servidor Mattermost, se o IP do servidor Mattermost está incluído em
channels.mattermost.interactions.allowedSourceIps(sem isso, somente local loopback é aceito) e seServiceSettings.AllowedUntrustedInternalConnectionsinclui o host de retorno de chamada para destinos privados. - Os botões retornam 404 ao serem clicados: o
iddo botão provavelmente contém hifens ou sublinhados. O roteador de ações do Mattermost falha com IDs não alfanuméricos. Use somente[a-zA-Z0-9]. - O Gateway registra
rejected callback source: o clique veio de um IP fora deinteractions.allowedSourceIps. Adicione o servidor Mattermost ou seu ponto de entrada à lista de permissões e definagateway.trustedProxiesquando estiver atrás de um proxy reverso. - O Gateway registra
invalid _token: incompatibilidade de HMAC. Verifique se todos os campos de contexto são assinados (não apenas um subconjunto), use chaves ordenadas e JSON compacto (sem espaços). Consulte a seção sobre HMAC acima. - O Gateway registra
missing _token in context: o campo_tokennão está no contexto do botão. Certifique-se de incluí-lo ao criar a carga útil da integração. - O Gateway rejeita o clique com
Unknown action:context.action_idnão corresponde a nenhumidde ação na publicação. Defina ambos com o mesmo valor sanitizado. - O agente não oferece botões: adicione
capabilities: ["inlineButtons"]à configuração do canal Mattermost.
Relacionado
- Roteamento de canais - roteamento de sessões para mensagens
- Visão geral dos canais - todos os canais compatíveis
- Grupos - comportamento de conversas em grupo e controle por menção
- Pareamento - autenticação por mensagem direta e fluxo de pareamento
- Segurança - modelo de acesso e reforço de segurança