Mattermost
Client REST v4 par interrogation et WebSocket. Par défaut, le bot interroge les canaux toutes les 3 secondes pour les nouveaux posts ; définissez listen_mode = "websocket" pour une diffusion d’événements quasi en temps réel via une connexion WebSocket persistante. Les posts de réponse sont toujours envoyés via POST /api/v4/posts, quel que soit le mode d’écoute.
Qui peut parler à l’agent
Les expéditeurs entrants sont filtrés par rapport au peer set résolu pour l’agent lié, issu de la configuration peer_groups à laquelle l’agent appartient. La correspondance supprime le @ initial et est insensible à la casse par rapport à l’identifiant d’expéditeur natif du canal. Un ensemble vide refuse tout le monde ; un ensemble contenant "*" accepte n’importe qui ; sinon, seuls les pairs externes listés (et les agents pairs) sont acceptés. Ceci est distinct de l’appairage de la passerelle (gateway.require_pairing), qui authentifie les clients HTTP/WebSocket, et non les expéditeurs des canaux de discussion.
Un groupe de pairs pour mattermost définit channel à mattermost, liste les expéditeurs autorisés dans external_peers (pour mattermost, l’UUID de l’utilisateur Mattermost (et non un nom d’utilisateur) ; ["*"] accepte tout le monde), nomme éventuellement des agents pairs pour la distribution inter-agents, une liste de blocage ignore, et une output_modality (mirror, voice ou text). Consultez Peer Groups pour la référence des champs.
Où définir ce paramètre :
Tableau de bord de la passerelle
Ouvrez /config/peer_groups dans le tableau de bord web.
zerocode
Dans le volet Config, sous Peer groups.
Pour ajouter un humain spécifique à la liste d’autorisation, copiez son ID utilisateur depuis System Console → User Management. Mattermost effectue la correspondance avec l’UUID de l’utilisateur, et non un nom d’utilisateur, et ne résout pas les noms d’utilisateur au moment de la réception du message.
Démarrage rapide
Configurez un canal Mattermost (url plus un secret bot_token, voir Authentification) via l’une des interfaces ci-dessous. Cela seul vous offre :
- Détection automatique de chaque canal que le bot peut lire dans toutes les équipes dont il fait partie.
- Canaux DM et DM de groupe découverts automatiquement et interrogés en même temps que les canaux d’équipe.
- Les nouveaux MP (créés après le démarrage du bot) sont récupérés lors de la prochaine actualisation de découverte, qui a lieu toutes les 60 secondes.
mention_onlyest contourné dans les canaux de messages privés et de groupes privés (afin que les conversations en tête-à-tête ne nécessitent pas de mentionner le bot avec @).
Pour restreindre le bot, affinez avec channel_ids, team_ids ou discover_dms.
Configuration
bot_token et password sont des secrets :
channels.mattermost.<alias>.bot_tokenest un secret. Stocké chiffré, jamais en clair dansconfig.toml. Définissez-le via l’une de ces méthodes, qui chiffrent à l’écriture :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez-y le champ channels.mattermost.<alias>.bot_token.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.bot_token (la saisie est masquée).
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.bot_token # demande une saisie masquée, stocke de manière chiffrée
Référence des champs
approval_timeout_secs
Secondes d’attente de l’approbation de l’opérateur pour les outils always_ask avant refus automatique. Mattermost demande l’approbation en publiant un message préfixé par un jeton et en lisant la réponse de l’opérateur ; ce délai couvre donc le temps nécessaire à un humain pour remarquer le message et y répondre.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.approval_timeout_secs.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.approval_timeout_secs.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.approval_timeout_secs <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__approval_timeout_secs=
bot_token 🔑
Jeton d’accès du bot Mattermost. Lorsqu’il n’est pas défini, le canal revient au flux de connexion utilisant login_id + password.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.bot_token.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.bot_token.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.bot_token # entrée masquée, stockée chiffrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__bot_token=
channel_ids
Identifiants de canaux auxquels restreindre le bot. Vide ou ["*"] = découverte automatique de tous les canaux que le bot peut lire (publics, privés, DM, DM de groupe) et interrogation de chacun d’eux. Des identifiants explicites désactivent la découverte et limitent le bot aux seuls canaux listés. Migré depuis l’ancien champ singulier channel_id.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.channel_ids.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.channel_ids.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.channel_ids <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__channel_ids=
discover_dms
Lorsque la valeur est true (par défaut), la découverte automatique inclut les canaux de MP (type=D) et de MP de groupe (type=G). Définissez la valeur sur false pour restreindre le bot aux canaux d’équipe publics et privés uniquement. Sans effet lorsque channel_ids liste des ID explicites. La valeur par défaut est true au point d’appel via discover_dms.unwrap_or(true).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.discover_dms.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.discover_dms.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.discover_dms <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__discover_dms=
excluded_tools
Outils exclus de la spécification d’outils de ce canal. Lorsque ce paramètre est défini, ces outils ne sont pas exposés au modèle lors des réponses via ce canal.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.excluded_tools.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.excluded_tools.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.excluded_tools <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__excluded_tools=
interrupt_on_new_message
Lorsque cette option est définie sur true, un message Mattermost plus récent provenant du même expéditeur dans le même canal annule la requête en cours et démarre une nouvelle réponse en conservant l’historique.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.interrupt_on_new_message.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.interrupt_on_new_message.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.interrupt_on_new_message <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__interrupt_on_new_message=
listen_mode
Mode d’écoute : "polling" (API REST toutes les 3 s, par défaut) ou "websocket" (connexion WebSocket persistante à /api/v4/websocket pour une distribution des événements en quasi temps réel). Le mode WebSocket réduit la charge du serveur et fournit les événements plus rapidement, mais nécessite un serveur Mattermost compatible WebSocket (v4.0+).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.listen_mode.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.listen_mode.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.listen_mode <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__listen_mode=
login_id
Identifiant de connexion (e-mail ou nom d’utilisateur) pour le flux de connexion par mot de passe. Utilisé uniquement lorsque bot_token n’est pas défini ; login_id et password doivent être définis ensemble.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.login_id.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.login_id.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.login_id <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__login_id=
mention_only
Lorsque la valeur est true, le bot ne répond qu’aux messages qui le mentionnent avec @. Les autres messages du canal sont silencieusement ignorés. Les canaux de MP et de MP de groupe contournent toujours ce filtre : une conversation directe en 1:1 (ou en petit groupe) ne comporte aucun bruit ambiant à filtrer, donc chaque message est considéré comme adressé au bot.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.mention_only.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.mention_only.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.mention_only <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__mention_only=
password 🔑
Mot de passe du compte pour le flux de connexion. Utilisé uniquement lorsque bot_token n’est pas défini ; login_id et password doivent être définis ensemble.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.password.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.password.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.password # entrée masquée, stockée chiffrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__password=
proxy_url
URL de proxy par canal (http, https, socks5, socks5h). Remplace le paramètre global [proxy] pour ce canal uniquement.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.proxy_url.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.proxy_url.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.proxy_url <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__proxy_url=
purpose_as_instructions
Injecter l’objectif du canal Mattermost de chaque salle dans le prompt système en tant que contexte fourni par le canal, permettant à une salle de spécialiser l’agent. Désactivé par défaut, car l’activer relève d’une décision de confiance : l’objectif peut être modifié par toute personne disposant de manage_*_channel_properties, ce qui, avec les schémas de permissions par défaut, correspond à chaque membre du canal, et le texte est transmis au prompt système. Ces éditeurs peuvent donc orienter l’agent dans cette salle, y compris avec un texte formulé comme une instruction, et ils n’ont pas besoin d’être des pairs ZeroClaw autorisés. Cette orientation ne peut toutefois pas dépasser les permissions existantes de l’agent : le texte du prompt n’accorde aucun outil, n’élargit aucun groupe de pairs et ne modifie aucun niveau d’autonomie. N’activez cette option que lorsque les éditeurs de la salle sont dignes de confiance pour les capacités configurées de l’agent.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
/config/channels/mattermost ouvrez cette page et définissez le champ channels.mattermost.<alias>.purpose_as_instructions.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.purpose_as_instructions.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.purpose_as_instructions <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__purpose_as_instructions=
reply_min_interval_secs
Plancher de cadencement sortant par (canal, destinataire) en secondes. Plage : 0..=REPLY_MIN_INTERVAL_MAX_SECS (0 désactive).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.reply_min_interval_secs.
zerocode
Dans le panneau Config, définissez le champ channels.mattermost.<alias>.reply_min_interval_secs.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.reply_min_interval_secs <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__reply_min_interval_secs=
reply_queue_depth_max
Profondeur de la file d’attente de régulation sortante par (canal, destinataire). Plage : 0..=REPLY_QUEUE_DEPTH_CEILING. Lorsque reply_min_interval_secs > 0 et que cette valeur est 0, le wrapper de régulation substitue DEFAULT_REPLY_QUEUE_DEPTH (16). Lorsque la file d’attente est pleine, l’envoi le plus récent est abandonné et un WARN est journalisé.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.reply_queue_depth_max.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.reply_queue_depth_max.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.reply_queue_depth_max <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__reply_queue_depth_max=
team_ids
Identifiants d’équipe auxquels restreindre la découverte automatique. Vide = découvrir dans toutes les équipes auxquelles le bot appartient. Non vide = découvrir uniquement les canaux publics/privés dont le team_id figure dans cette liste. Les messages directs et les messages directs de groupe (qui n’ont pas d’équipe) sont régis par discover_dms à la place.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.team_ids.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.team_ids.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.team_ids <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__team_ids=
thread_replies
Lorsque la valeur est true (par défaut), les réponses sont regroupées en fil de discussion sur la publication d’origine. Lorsque la valeur est false, les réponses sont envoyées à la racine du canal.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.thread_replies.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.thread_replies.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.thread_replies <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__thread_replies=
url*
URL du serveur Mattermost (par ex. "https://mattermost.example.com").
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et définissez le champ channels.mattermost.<alias>.url.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.url.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.url <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_channels__mattermost__<alias>__url=
Découverte de canaux
Il existe deux modes de portée.
- Découverte automatique (lorsque
channel_idsest vide ou défini sur["*"]). Au démarrage, puis toutes les 60 secondes, le bot appelleGET /api/v4/users/me/channels, filtre le résultat selonteam_ids(canaux publics/privés) etdiscover_dms(messages directs/messages directs de groupe), puis interroge chaque canal restant. Les nouveaux messages directs créés en cours d’exécution apparaissent lors de la prochaine actualisation. - Explicite (lorsque
channel_idsest une liste non vide d’ID autres que*). Au démarrage, le bot appelleGET /api/v4/channels/{id}pour chaque entrée afin de connaître sontype(afin de savoir lesquels sont des DM pour le contournementmention_only), puis interroge exactement ces canaux indéfiniment. Aucune redécouverte périodique.
Dans les deux modes, chaque canal possède son propre curseur since : le bot suit le create_at le plus élevé qu’il a traité par canal et le transmet sous la forme since=<ms> lors de l’appel GET /api/v4/channels/{id}/posts suivant. Les curseurs ne se mélangent pas entre les canaux, de sorte qu’un canal peu actif ne supprime pas les messages d’un canal très actif.
Mode WebSocket
Définissez listen_mode = "websocket" pour passer de l’interrogation REST à une connexion WebSocket persistante (wss://<server>/api/v4/websocket). Le mode WebSocket :
- Diffuse les nouvelles publications en quasi temps réel (sans délai d’interrogation de 3 secondes).
- Réduit la charge HTTP sur le serveur Mattermost (une connexion au lieu de N requêtes toutes les 3 s).
- Renvoie les sessions ayant échoué au superviseur de canal partagé, qui se reconnecte avec un backoff exponentiel borné en utilisant les valeurs
reliability.channel_initial_backoff_secsetreliability.channel_max_backoff_secsconfigurées. - Nécessite Mattermost v4.0+ (l’endpoint
/api/v4/websocket).
La découverte de canaux, mention_only, thread_replies, la transcription audio et l’autorisation par groupe de pairs fonctionnent de manière identique dans les deux modes.
Compromis :
- Le mode WebSocket doit maintenir une connexion TCP+TLS persistante.
- Pendant une fenêtre de reconnexion, des messages publiés dans un canal peuvent être manqués car cet écouteur ne demande pas encore la reprise/relecture de connexion Mattermost. L’interrogation rattrape le retard via les curseurs
since=. - Le mode d’interrogation est plus résistant aux interruptions réseau transitoires, au prix d’un trafic HTTP constant.
Pour revenir en arrière, définissez listen_mode = "polling" (ou supprimez le champ ; le polling est la valeur par défaut).
Approbation de l’outil via le chat (approval_timeout_secs)
Lorsqu’un outil nécessite une approbation (il figure dans always_ask, ou le profil de risque ne l’approuve pas automatiquement), l’agent publie la demande dans le canal d’où provient le message et attend. Il existe deux façons de répondre, et les options disponibles dépendent de listen_mode.
Répondez avec le token. Cela fonctionne dans tous les modes d’écoute :
APPROBATION REQUISE [a1b2c3]
Outil : shell
Arguments : command: pwd
Réponse : "a1b2c3 yes", "a1b2c3 no" ou "a1b2c3 always"
a1b2c3 yes
a1b2c3 no
a1b2c3 always
A reply that matches a pending token is consumed as a decision and never reaches the model.
Toucher une réaction. Cette option nécessite listen_mode = "websocket". Le bot place ✅ et ❌ sur son propre message d’invite ; toucher l’une d’elles répond à l’invite. Les réactions parviennent au bot sous forme d’événements WebSocket reaction_added, et l’écouteur en mode polling lit les messages sans jamais les voir ; avec listen_mode = "polling", aucun emoji n’est donc ajouté : un bouton qui ne fait silencieusement rien sur une invite de sécurité est pire que pas de bouton. Si vous voulez des approbations en un seul geste, définissez listen_mode = "websocket" (voir Mode WebSocket).
always n’a pas d’émoji, et c’est volontaire. Il accorde une entrée de liste d’autorisation limitée à la session plutôt que d’autoriser un seul appel, et un appui accidentel à côté de ✅ serait un moyen trop facile d’élargir une session. Passer à always reste donc une décision à saisir explicitement.
Mattermost ne propose pas de boutons de message interactifs ici. Ceux-ci envoient leurs données à une URL d’intégration, ce qui nécessite un point de terminaison HTTP entrant que le bot ne peut pas exposer depuis un client par interrogation (polling) ou WebSocket ; les réactions sont l’action en un clic qui fonctionne sur la connexion que le bot maintient déjà.
Qui peut répondre, et où. Le jeton est un corrélateur, et non un mot de passe : il circule en clair dans le canal, donc chaque membre peut le lire. Deux conditions doivent donc être réunies. L’utilisateur qui répond doit appartenir au groupe de pairs de l’alias, c’est-à-dire à la même autorité qui détermine les messages auxquels l’agent donne suite. Et la réponse doit arriver dans le canal où l’invite a été publiée : un même bot dessert plusieurs canaux, donc un jeton transmis dans un autre salon n’est pas une réponse valide, même si l’utilisateur est autorisé. La liaison s’effectue par canal et non par fil, si bien qu’une réponse dans le canal plutôt que dans le fil de l’invite est acceptée. Une réponse ou une action qui échoue à l’une de ces vérifications est consignée au niveau WARN et ignorée ; l’invite reste ouverte afin qu’un opérateur autorisé puisse toujours y répondre au bon endroit.
Tout le monde dans le canal peut lire les arguments de l’outil. L’invite comprend le nom de l’outil et un résumé de ses arguments. Acheminez les demandes d’approbation vers un canal dont vous acceptez que les membres puissent voir ces informations.
approval_timeout_secs borne l’attente. La valeur par défaut est de 300 secondes, et 0 refuse immédiatement au lieu de désactiver l’approbation : un zéro permet donc de refuser tous les outils soumis à approbation, et non d’attendre indéfiniment. En cas de dépassement du délai, la demande est refusée et le jeton est supprimé, si bien qu’une réponse ou un appui tardif ne peut plus approuver un appel que personne n’attend. Un dépassement de délai ou un système de demande injoignable est enregistré comme un refus décidé par le runtime de sa propre initiative, et non comme un refus de la part d’un humain.
Les décisions sont définitives : retirer une réaction ne rétracte pas une réponse, et la première réponse valide met fin à la question pour les deux chemins.
S’il est impossible au bot de placer l’emoji, ce qui est le plus souvent un problème de permissions, il journalise failed to seed Mattermost approval reaction au niveau WARN et l’invite fonctionne toujours par réponse.
Note: the instruction to preserve “purpose_as_instructions” exactly applies, and the English phrase “purpose as instructions” is translated while the identifier and backticked code stay unchanged.
Désactivé par défaut. Lorsqu’il est activé, la description du canal (channel purpose) de chaque salon Mattermost est injectée dans le prompt système de l’agent en tant que contexte fourni par le canal, afin qu’un salon puisse spécialiser l’agent sans qu’une entrée de configuration soit nécessaire pour chaque salon :
[channels.mattermost.default]
purpose_as_instructions = true
Définissez l’objectif d’un canal pour décrire à quoi sert cette salle, par exemple « Maintenance de paquets Arch Linux pour les dépôts AUR ». L’agent le considère comme une référence faisant autorité concernant l’orientation de la salle, son ton et les compétences à utiliser.
Il ne fait pas autorité sur les règles de l’agent. Le texte injecté est étiqueté comme fourni par le canal et se voit explicitement refuser tout pouvoir d’accorder des capacités, d’assouplir des restrictions ou de prévaloir sur les règles de fonctionnement ; en cas de conflit, ce sont les règles qui s’appliquent. Il ne peut ni activer un outil, ni élargir un groupe de pairs, ni modifier un niveau d’autonomie.
Ce que cette option accorde, et à qui
Activer cette option est une décision de confiance, et il vaut la peine d’être franc sur sa nature plutôt que de laisser celle-ci être déduite de l’avertissement ci-dessus.
Le but est régi par les permissions manage_public_channel_properties / manage_private_channel_properties de Mattermost, qui, dans les schémas par défaut, sont accordées à chaque membre du canal. Il s’agit généralement d’un groupe plus large que les personnes qui contrôlent cette configuration, et il ne recoupe pas nécessairement les peer_groups de l’alias : un membre qui n’est pas un pair ZeroClaw autorisé, et qui ne peut donc pas obtenir de l’agent une réponse directe, peut tout de même modifier le but de la salle.
Le texte atteint le prompt système. Le cadrage qui l’entoure indique au modèle que le texte est fourni par le canal, décrit la pièce plutôt que de commander l’agent, et ne remplace jamais ses règles. Mais le cadrage est un fort a priori, non une frontière. Un texte qui se présente comme une instruction peut influencer ce que l’agent fait dans cette pièce, et aucun échappement n’y change rien ; c’est du langage naturel, et le modèle le lit comme tel.
Donc, la décision que prend cette fonctionnalité, explicitement : activer purpose_as_instructions pour un alias donne à toute personne pouvant modifier l’objet des salons concernés la capacité d’orienter l’agent à cet endroit, dans les limites des permissions que l’agent possède déjà. Ne l’activez que lorsque cet ensemble de personnes est digne de confiance pour les capacités configurées de l’agent. Dans le cas contraire, laissez-la désactivée (valeur par défaut), ou restreignez manage_*_channel_properties dans votre schéma de permissions aux personnes qui devraient en disposer.
Ce que l’objectif ne peut toujours pas faire, c’est élargir ces capacités. Il ne peut pas activer un outil, ajouter un pair, modifier un niveau d’autonomie, ni approuver son propre appel d’outil : ces décisions relèvent de la configuration et du chemin d’approbation, et aucun des deux ne lit le texte de l’invite.
Structurellement, le texte est contenu. Avant l’injection, il est aplati en une seule ligne, les chevrons et les caractères de contrôle étant supprimés, de sorte qu’il ne peut ni fermer sa propre section, ni en ouvrir une autre, ni forger un titre Markdown qui semble appartenir à une autre partie de l’invite de l’opérateur. Il est également limité à 500 caractères, au-dessus de la limite de 250 caractères imposée par Mattermost à ce champ (l’en-tête du canal en autorise 1024), de sorte qu’aucun usage légitime n’est tronqué, tandis qu’un serveur compromis ne peut pas coller une invite entière.
Une modification du objet prend effet au message suivant, avec un délai qui dépend de listen_mode :
listen_mode | Les modifications de l’objectif prennent effet |
|---|---|
websocket | Presque immédiatement, à partir de l’événement channel_updated |
polling | Au message suivant l’actualisation de la découverte toutes les 60 secondes |
Vider l’objectif d’un canal arrête l’injection ; il n’est pas conservé à partir d’une valeur précédente. Les salons sans objectif n’apportent rien.
Pour revenir en arrière, définissez purpose_as_instructions = false (ou supprimez le champ ; la désactivation est la valeur par défaut). Aucun état de canal n’a besoin d’être nettoyé, car rien n’est mis en cache pour un alias qui n’a pas activé cette option.
Messages directs
Mattermost classe les canaux par type :
type | sens |
|---|---|
O | Canal d’équipe public. |
P | Canal d’équipe privé. |
G | Message direct de groupe (DM multi-utilisateurs). |
D | Message direct (1:1). |
G et D sont traités de manière identique par ZeroClaw : aucun ne comporte de team_id, tous deux sont contrôlés par discover_dms, et tous deux contournent implicitement mention_only (une conversation privée n’a aucun bruit ambiant à filtrer).
L’autorisation des expéditeurs de DM passe toujours par le résolveur de groupe de pairs du canal, comme pour tout autre canal. discover_dms est un paramètre de réglage, pas une frontière de sécurité ; ce sont les groupes de pairs qui décident qui est autorisé à s’adresser à l’agent.
Exécution de threads
- La publication entrante se trouve dans un fil de discussion existant (
root_idest défini) → la réponse arrive toujours dans ce fil, quel que soitthread_replies. - Le post entrant est de premier niveau et
thread_replies = true(par défaut) → la réponse ouvre un fil de discussion ancré sur le post entrant. - L’envoi entrant est de premier niveau et
thread_replies = false→ la réponse est publiée à la racine du canal.
Gestion du contexte
Lorsqu’une conversation Mattermost se déroule dans un fil de discussion, ce fil constitue sa propre conversation. ZeroClaw dérive une clé de session distincte par fil, de sorte que chaque fil possède une fenêtre de contexte et un historique indépendants : les messages d’un fil ne débordent jamais dans un autre, et l’agent ne voit pas les échanges antérieurs d’un fil voisin. Pour Mattermost, ce comportement est contrôlé par thread_replies : lorsqu’il est activé, les messages de premier niveau ouvrent un fil et chaque fil constitue une conversation distincte ; lorsqu’il est désactivé, les réponses sont publiées à la racine du canal et l’historique est indexé par expéditeur et par cible plutôt que par fil.
- L’isolation est l’objectif. Le contexte de chaque thread est autonome : il ne fuit pas en dehors du thread, et rien de l’extérieur du thread ne s’y infiltre. Les threads parallèles conservent des états conversationnels distincts, de sorte que des tâches sans rapport ne se contaminent jamais entre elles.
- Les threads longs font croître le contexte. Un thread accumule l’historique tant qu’il reste actif, donc un thread très long finit par remplir la fenêtre de contexte du modèle comme toute autre conversation longue. Démarrez un nouveau thread pour réinitialiser.
- Le travail en cours est limité à chaque fil de discussion. Un nouveau message dans un fil n’annule pas une réponse en cours dans un autre ; la tâche de chaque fil est indépendante.
Définissez le comportement du thread sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/channels/mattermost et activez ou désactivez le champ channels.mattermost.<alias>.thread_replies.
zerocode
Dans le volet Config, définissez le champ channels.mattermost.<alias>.thread_replies.
zeroclaw config
zeroclaw config set channels.mattermost.<alias>.thread_replies true # réponses en fil de discussion activées
zeroclaw config set channels.mattermost.<alias>.thread_replies false # réponses à la racine du canal
Authentification
Deux chemins :
- Jeton de bot (recommandé). Créez-le dans System Console → Integrations → Bot Accounts, copiez le jeton d’accès et stockez-le dans
bot_token. Les jetons restent valides après les rotations de mot de passe et sont plus faciles à révoquer. - Flux de connexion. Définissez
login_id(email ou nom d’utilisateur) etpassword. Le bot appellePOST /api/v4/users/loginau démarrage et met en cache le jeton de session renvoyé en mémoire. Aucune persistance sur disque.
bot_token l’emporte lorsque les deux sont définis.
Messages vocaux
Lorsque [transcription] est configuré et qu’un post entrant contient une pièce jointe audio (type MIME audio/* ou extension ogg/mp3/m4a/wav/opus/flac) sans corps de texte, le fichier audio est téléchargé via GET /api/v4/files/{file_id} et acheminé vers le fournisseur de transcription configuré. La transcription est préfixée [Voice] et devient le contenu du message. Les pièces jointes dépassant 25 Mo ou la durée limite définie par transcription.max_duration_secs sont ignorées avec un avertissement WARN.
Configuration
- Dans Mattermost : Console système → Intégrations → Comptes de bot → Ajouter un compte de bot. Définissez un nom d’utilisateur (par ex.
zeroclaw), activez les portées souhaitées. - Copiez le jeton d’accès. Stockez-le dans votre backend de secrets ZeroClaw.
- Invitez le bot dans les équipes où vous souhaitez qu’il soit actif. Pour la découverte automatique des MP, aucune invitation supplémentaire n’est nécessaire : tout utilisateur peut envoyer un MP au bot.
- Créez le canal
mattermost.<alias>en référençant le jeton via la passerelle, zerocode, ouzeroclaw config set. - Liez le canal à un agent dans
[agents.<alias>]viachannels = ["mattermost.<alias>"].
Notes opérationnelles
- La fréquence d’interrogation est de 3 secondes par canal. N canaux découverts = N appels HTTP toutes les 3 secondes vers le serveur Mattermost. Les configurations auto-hébergées par défaut gèrent cela facilement ; si vous êtes sur un tenant cloud partagé avec des limites de débit strictes, envisagez de restreindre la portée avec
channel_idsouteam_ids. - L’identité du bot est récupérée une fois via
GET /api/v4/users/meet mise en cache pour toute la durée de vie du processus. Les changements de nom d’utilisateur nécessitent un redémarrage. - Le jeton de session du flux de connexion par mot de passe est conservé uniquement en mémoire. Un redémarrage relance la connexion.