Instalação
- Registro npm
- Checkout local
Configuração rápida
Verifique se o Plugin está disponível
@openclaw/mattermost com o comando acima e reinicie o Gateway caso ele já esteja em execução.Crie um bot do Mattermost
Copie a URL base
https://chat.example.com). Uma /api/v4 ao final é removida automaticamente.Configure o OpenClaw e inicie o Gateway
channels.mattermost.network.dangerouslyAllowPrivateNetwork: true (por conta: channels.mattermost.accounts.<id>.network.dangerouslyAllowPrivateNetwork).Comandos de barra nativos
Os comandos de barra nativos são opcionais. Quando ativados, o OpenClaw registra comandos de barraoc_* em todas as equipes das quais o bot participa e recebe POSTs de callback no servidor HTTP do Gateway.
/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
Observações sobre o comportamento
nativeenativeSkillsusam"auto"por padrão, que resulta em desativado para o Mattermost. Defina-os explicitamente comotrue.callbackPathusa/api/channels/mattermost/commandpor padrão.- Se
callbackUrlfor omitido, o OpenClaw derivahttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>. Hosts de vinculação curinga (0.0.0.0,::) recorrem alocalhost. - 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 acionador, criados por outras integrações, permanecem intactos (o registro os ignora); os comandos criados pelo bot são atualizados ou recriados quando a URL de callback diverge.
- Os callbacks de comando são validados com os tokens específicos de cada comando retornados pelo Mattermost quando o OpenClaw registra comandos
oc_*. - O OpenClaw atualiza o registro atual dos comandos do Mattermost antes de aceitar cada callback; assim, tokens obsoletos de comandos de barra excluídos ou regenerados deixam de ser aceitos sem que seja necessário reiniciar o Gateway.
- A validação do callback falha de forma fechada 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, as consultas simultâneas são consolidadas e o início de novas consultas tem limitação de frequência por comando para restringir a pressão de repetição.
- Os callbacks de barra falham de forma fechada quando o registro falhou, a inicialização foi 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
Requisito de acessibilidade
- 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 faça proxy reverso de/api/channels/mattermost/commandpara o OpenClaw. - Uma verificação rápida é
curl https://<gateway-host>/api/channels/mattermost/command; uma solicitação GET deve retornar405 Method Not Alloweddo OpenClaw, e não404.
Lista de permissões de saída do Mattermost
Lista de permissões de saída do Mattermost
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-as no host do Gateway se preferir variáveis de ambiente:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Outras contas devem usar valores de configuração.MATTERMOST_URL não pode ser definido por meio de um .env do workspace; consulte Arquivos .env do workspace.Modos de chat
O Mattermost responde automaticamente às DMs. O comportamento nos canais é controlado porchatmode:
- oncall (padrão)
- onmessage
- onchar
oncharainda responde a @menções explícitas.channels.mattermost.requireMentionainda é respeitado, maschatmodeé preferível. As configuraçõesgroups.<channelId>.requireMentionpor canal prevalecem sobre ambos.- 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 ou prefixo
onchar, permitindo que as conversas de vários turnos na thread continuem fluindo. A participação é lembrada por 7 dias após a última resposta do bot nessa thread e persiste após reinicializações do Gateway. Threads que o bot apenas observou não são afetadas; inicie uma nova mensagem no nível superior para voltar a exigir uma menção explícita.
Threads e sessões
Usechannels.mattermost.replyToMode para controlar se as respostas em canais e grupos permanecem no canal principal ou iniciam uma thread sob a publicação acionadora.
off(padrão): responde em uma thread somente quando a publicação recebida já está em uma.first: para publicações de canal/grupo no nível superior, inicia uma thread sob essa publicação e encaminha a conversa para uma sessão com escopo de thread.allebatched: atualmente têm o mesmo comportamento quefirstno Mattermost, pois, depois que o Mattermost tem uma raiz de thread, os trechos e as mídias subsequentes continuam nessa mesma thread.- As mensagens diretas usam
offpor padrão, mesmo quandoreplyToModeestá definido.
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 no nível superior inicia uma thread do Mattermost respaldada por uma sessão nova e independente.
- As sessões com escopo de thread usam o ID da publicação acionadora como raiz da thread.
firsteallsão atualmente equivalentes porque, depois que o Mattermost tem uma raiz de thread, os trechos e as mídias subsequentes continuam nessa mesma thread.- As substituições por tipo de conversa prevalecem sobre
replyToMode. Sem uma substituiçãodirect, 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(recomenda-se usar IDs de usuário). channels.mattermost.groupAllowFromaceita entradasaccessGroup:<name>. Consulte Grupos de acesso.- As substituições de menção por canal ficam em
channels.mattermost.groups.<channelId>.requireMentionou emchannels.mattermost.groups["*"].requireMentionpara um padrão. - A correspondência de
@usernameé mutável e só é ativada 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 runtime: se a seção
channels.mattermostestiver completamente ausente, o runtime falhará de forma fechada usandogroupPolicy="allowlist"nas verificações de grupo (mesmo quechannels.defaults.groupPolicyesteja definido) e registrará um aviso uma única vez.
Destinos para entrega de saída
Use estes formatos de destino comopenclaw message send ou cron/webhooks:
Nova tentativa do canal de DM
Quando o OpenClaw envia para um destino de MD do Mattermost e precisa primeiro resolver o canal direto, por padrão ele tenta novamente em caso de falhas transitórias na criação do canal direto. Usechannels.mattermost.dmChannelRetry para ajustar esse comportamento globalmente para o Plugin do Mattermost ou channels.mattermost.accounts.<id>.dmChannelRetry para uma conta. Padrõ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 espera exponencial com jitter 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 são tentados novamente.
Streaming de pré-visualização
O Mattermost transmite o raciocínio, a atividade das ferramentas e o texto parcial da resposta para uma publicação de pré-visualização em rascunho, que é finalizada no mesmo lugar quando é seguro enviar a resposta final. No modopartial, a pré-visualização é atualizada com o mesmo ID de publicação, em vez de inundar o canal com mensagens para cada fragmento. No modo block, a pré-visualização alterna entre o texto concluído e os blocos 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. Respostas finais com mídia/erro cancelam as edições pendentes da pré-visualização e usam a entrega normal, em vez de efetivar uma publicação de pré-visualização descartável.
O streaming de pré-visualização fica ativado por padrão no modo partial. Configure por meio de channels.mattermost.streaming.mode (valores escalares/booleanos legados de streaming são migrados por openclaw doctor --fix):
Modos de streaming
Modos de streaming
partial(padrão): uma publicação de pré-visualização que é editada à medida que a resposta aumenta e, em seguida, finalizada com a resposta completa.blockalterna a pré-visualização entre o texto concluído e os blocos 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 de ferramentas paralelas e consecutivas compartilham a publicação atual de atividade das ferramentas.progressmostra uma pré-visualização de status durante a geração e publica a resposta final somente após a conclusão.offdesativa o streaming de pré-visualização. Comstreaming.block.enabled: 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 do streaming
Observações sobre o comportamento do streaming
- Se o stream não puder ser finalizado no mesmo lugar (por exemplo, se a publicação for excluída durante o stream), 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 Streaming para ver a matriz de mapeamento dos canais.
Reações (ferramenta de mensagens)
- Use
message action=reactcomchannel=mattermost. messageIdé o 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. - Os eventos de adição/remoção de reações são encaminhados como eventos de sistema para a sessão roteada do agente, sujeitos às mesmas verificações de política de MD/grupo aplicadas às mensagens.
channels.mattermost.actions.reactions: ativa/desativa ações de reação (padrão: true).- 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ânticapresentation (em respostas normais do agente e em message action=send). O OpenClaw renderiza botões de valor como botões interativos do Mattermost, mantém botões de URL visíveis no texto da mensagem e converte menus de seleção em texto legível.
text).callback_data, callbackData). Obrigatório para um botão clicável, a menos que url esteja definido.label: url no corpo da mensagem, em vez de um botão interativo.inlineButtons aos recursos do canal:
Verificação de acesso
Botões substituídos por confirmação
O agente recebe a seleção
Observações sobre a implementação
Observações sobre a implementação
- Os retornos de chamada dos botões usam verificação HMAC-SHA256 (automática, nenhuma configuração necessária).
- 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 contendo hifens ou sublinhados são higienizados 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(“Ação desconhecida”).
Configuração e acessibilidade
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 dos botões (por exemplo,https://gateway.example.com). Use-a quando o Mattermost não puder acessar o Gateway diretamente no host de associação.- Em configurações com várias contas, também é possível definir o mesmo campo em
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Se
interactions.callbackBaseUrlfor omitido, o OpenClaw deriva a URL de retorno de chamada degateway.customBindHost+gateway.port(padrão: 18789) e, em seguida, recorre 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 ser acessível pelo servidor Mattermost.
localhostfunciona somente quando o Mattermost e o OpenClaw são executados no mesmo host/namespace de rede. channels.mattermost.interactions.allowedSourceIps: lista de permissões de IPs de origem para retornos de chamada dos 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, caso contrário seus cliques serão rejeitados com403. Atrás de um proxy reverso, defina tambémgateway.trustedProxiespara que o IP real do cliente seja derivado dos cabeçalhos encaminhados.- Se o destino do retorno de chamada for privado/da tailnet/interno, adicione seu host/domínio a
ServiceSettings.AllowedUntrustedInternalConnectionsdo Mattermost.
Integração direta com a API (scripts externos)
Scripts externos e webhooks podem publicar botões diretamente por meio da API REST do Mattermost, em vez de passar pela ferramentamessage do agente. Prefira a ferramenta message do OpenClaw. Para integrações diretas, importe buildButtonAttachments de @openclaw/mattermost/api.js; ao publicar JSON bruto, siga estas regras:
Estrutura da carga:
Derive o segredo do token do bot
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), codificado em hexadecimal.Crie o objeto de contexto
_token.Serialize com as chaves ordenadas
Assine a carga
HMAC-SHA256(key=secret, data=serializedContext)Adicione o token
_token no contexto.Armadilhas comuns de HMAC
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 de contexto (exceto
_token). O Gateway remove_tokene, em seguida, assina tudo o que resta. Assinar apenas um subconjunto causa uma falha silenciosa na verificação. - Use
sort_keys=True— o Gateway ordena as chaves antes de assinar, e o Mattermost pode reordenar os campos de contexto ao armazenar o payload. - 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 habilita destinos#channel-name e @username em entregas de openclaw message send e cron/webhook.
Nenhuma configuração é necessária — o adaptador usa o token do bot da configuração da conta.
Várias contas
O Mattermost oferece suporte a várias contas emchannels.mattermost.accounts:
channels.mattermost.defaultAccount seleciona qual conta é usada quando nenhuma é especificada.
Solução de problemas
Nenhuma resposta nos canais
Nenhuma resposta nos canais
chatmode: "onmessage".Erros de autenticação ou de várias contas
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 privados/LAN do Mattermost precisam de
network.dangerouslyAllowPrivateNetwork: true(a proteção contra SSRF bloqueia IPs privados por padrão).
Falha nos comandos de barra nativos
Falha nos comandos de barra nativos
Unauthorized: invalid command token.: o OpenClaw não aceitou o token de callback. Causas comuns:- o registro do comando de barra falhou ou foi concluído apenas parcialmente na inicialização
- o callback está chegando ao Gateway ou à conta incorreta
- o Mattermost ainda tem comandos antigos apontando para um destino de callback anterior
- o Gateway foi reiniciado sem reativar os comandos de barra
- Se os comandos de barra nativos pararem de funcionar, verifique nos logs a presença 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 callback foi resolvido para uma URL de loopback comohttp://localhost:18789/..., essa URL provavelmente só poderá ser acessada quando o Mattermost estiver em execução no mesmo host/namespace de rede que o OpenClaw. Em vez disso, defina explicitamente umcommands.callbackUrlacessível externamente.
Problemas com botões
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 de 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 pode ser acessado pelo servidor do Mattermost, se o IP do servidor do Mattermost está incluído em
channels.mattermost.interactions.allowedSourceIps(sem essa configuração, apenas loopback é aceito) e seServiceSettings.AllowedUntrustedInternalConnectionsinclui o host do callback 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 que contêm caracteres 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 do Mattermost ou seu ingresso à 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 estão sendo 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 o payload 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 do Mattermost.
Relacionados
- Roteamento de canais — roteamento de sessões para mensagens
- Visão geral dos canais — todos os canais compatíveis
- Grupos — comportamento de chats em grupo e controle por menção
- Emparelhamento — autenticação de mensagens diretas e fluxo de emparelhamento
- Segurança — modelo de acesso e reforço de segurança