Mattermost
Durum: paketle birlikte gelen plugin (bot token + WebSocket olayları). Kanallar, gruplar ve DM’ler desteklenir. Mattermost, kendi kendine barındırılabilen bir ekip mesajlaşma platformudur; ürün ayrıntıları ve indirmeler için resmi site olan mattermost.com adresine bakın.Paketle birlikte gelen plugin
Mattermost, güncel OpenClaw sürümlerinde paketle birlikte gelen bir plugin olarak sunulur; bu nedenle normal paketlenmiş derlemelerde ayrı bir kurulum gerekmez. Eski bir derlemeyi veya Mattermost’u içermeyen özel bir kurulumu kullanıyorsanız, onu manuel olarak kurun: CLI ile kurulum (npm registry):Hızlı kurulum
- Mattermost plugin’inin kullanılabilir olduğundan emin olun.
- Güncel paketlenmiş OpenClaw sürümleri bunu zaten paketle birlikte sunar.
- Eski/özel kurulumlar bunu yukarıdaki komutlarla manuel olarak ekleyebilir.
- Bir Mattermost bot hesabı oluşturun ve bot token değerini kopyalayın.
- Mattermost base URL değerini kopyalayın (ör.
https://chat.example.com). - OpenClaw’u yapılandırın ve Gateway’i başlatın.
Yerel slash komutları
Yerel slash komutları isteğe bağlıdır. Etkinleştirildiğinde OpenClaw, Mattermost API üzerindenoc_* slash komutlarını kaydeder ve Gateway HTTP sunucusunda callback POST’larını alır.
native: "auto"Mattermost için varsayılan olarak devre dışıdır. Etkinleştirmek içinnative: trueayarlayın.callbackUrlatlanırsa OpenClaw, Gateway host/port +callbackPathüzerinden bir değer türetir.- Çoklu hesap kurulumlarında
commandsüst düzeyde veyachannels.mattermost.accounts.<id>.commandsaltında ayarlanabilir (hesap değerleri üst düzey alanları geçersiz kılar). - Komut callback’leri, OpenClaw’un
oc_*komutlarını kaydederken Mattermost’un döndürdüğü komut başına token’larla doğrulanır. - Kayıt başarısız olduğunda, başlangıç kısmi kaldığında veya callback token’ı kayıtlı komutlardan biriyle eşleşmediğinde slash callback’leri kapalı-güvenli şekilde başarısız olur.
- Erişilebilirlik gereksinimi: callback uç noktası Mattermost sunucusundan erişilebilir olmalıdır.
- Mattermost, OpenClaw ile aynı host/ağ namespace’inde çalışmıyorsa
callbackUrliçinlocalhostayarlamayın. - Bu URL
/api/channels/mattermost/commandyolunu OpenClaw’a reverse-proxy etmiyorsa,callbackUrliçin Mattermost base URL’nizi ayarlamayın. - Hızlı bir kontrol için
curl https://<gateway-host>/api/channels/mattermost/commandkullanın; bir GET isteği404değil, OpenClaw’dan405 Method Not Alloweddöndürmelidir.
- Mattermost, OpenClaw ile aynı host/ağ namespace’inde çalışmıyorsa
- Mattermost çıkış allowlist gereksinimi:
- Callback’iniz private/tailnet/internal adresleri hedefliyorsa, Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionsayarını callback host/domain’ini içerecek şekilde yapılandırın. - Tam URL’ler değil, host/domain girdileri kullanın.
- İyi:
gateway.tailnet-name.ts.net - Kötü:
https://gateway.tailnet-name.ts.net
- İyi:
- Callback’iniz private/tailnet/internal adresleri hedefliyorsa, Mattermost
Ortam değişkenleri (varsayılan hesap)
Ortam değişkenlerini tercih ediyorsanız bunları Gateway host’unda ayarlayın:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default) için geçerlidir. Diğer hesaplarda yapılandırma değerleri kullanılmalıdır.
Sohbet modları
Mattermost, DM’lere otomatik olarak yanıt verir. Kanal davranışıchatmode ile kontrol edilir:
oncall(varsayılan): kanallarda yalnızca @mention yapıldığında yanıt ver.onmessage: her kanal mesajına yanıt ver.onchar: bir mesaj bir tetikleyici önek ile başladığında yanıt ver.
onchar, açık @mention’lara yine de yanıt verir.channels.mattermost.requireMentioneski yapılandırmalarda dikkate alınır, ancakchatmodetercih edilir.
Thread’ler ve oturumlar
Kanal ve grup yanıtlarının ana kanalda mı kalacağını yoksa tetikleyen gönderinin altında bir thread mi başlatacağını kontrol etmek içinchannels.mattermost.replyToMode kullanın.
off(varsayılan): yalnızca gelen gönderi zaten bir thread içindeyse thread içinde yanıt ver.first: üst düzey kanal/grup gönderileri için, o gönderinin altında bir thread başlat ve konuşmayı thread kapsamlı bir oturuma yönlendir.all: bugün Mattermost içinfirstile aynı davranış.- Doğrudan mesajlar bu ayarı yok sayar ve thread’siz kalır.
- Thread kapsamlı oturumlar, tetikleyen gönderi kimliğini thread kökü olarak kullanır.
firstveallşu anda eşdeğerdir; çünkü Mattermost bir thread köküne sahip olduktan sonra, devam eden parçalar ve medya aynı thread içinde sürer.
Erişim denetimi (DM’ler)
- Varsayılan:
channels.mattermost.dmPolicy = "pairing"(bilinmeyen göndericiler bir eşleştirme kodu alır). - Şununla onaylayın:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Herkese açık DM’ler:
channels.mattermost.dmPolicy="open"artıchannels.mattermost.allowFrom=["*"].
Kanallar (gruplar)
- Varsayılan:
channels.mattermost.groupPolicy = "allowlist"(mention geçitli). - Göndericileri
channels.mattermost.groupAllowFromile allowlist’e ekleyin (kullanıcı kimlikleri önerilir). - Kanal başına mention geçersiz kılmaları
channels.mattermost.groups.<channelId>.requireMentionveya varsayılan içinchannels.mattermost.groups["*"].requireMentionaltında bulunur. @usernameeşleştirmesi değişkendir ve yalnızcachannels.mattermost.dangerouslyAllowNameMatching: trueolduğunda etkinleşir.- Açık kanallar:
channels.mattermost.groupPolicy="open"(mention geçitli). - Çalışma zamanı notu:
channels.mattermosttamamen eksikse, çalışma zamanı grup kontrolleri içingroupPolicy="allowlist"değerine geri döner (channels.defaults.groupPolicyayarlı olsa bile).
Giden teslimat için hedefler
Bu hedef biçimleriniopenclaw message send veya Cron/Webhook’larla kullanın:
- Bir kanal için
channel:<id> - Bir DM için
user:<id> - Bir DM için
@username(Mattermost API üzerinden çözülür)
64ifufp...) Mattermost’ta belirsizdir (kullanıcı kimliği mi kanal kimliği mi).
OpenClaw bunları önce kullanıcı olacak şekilde çözer:
- Kimlik bir kullanıcı olarak varsa (
GET /api/v4/users/<id>başarılı olursa), OpenClaw doğrudan kanalı/api/v4/channels/directüzerinden çözerek bir DM gönderir. - Aksi halde kimlik bir kanal kimliği olarak ele alınır.
user:<id> / channel:<id>).
DM kanal yeniden denemesi
OpenClaw bir Mattermost DM hedefine gönderim yaptığında ve önce doğrudan kanalı çözmesi gerektiğinde, varsayılan olarak geçici doğrudan kanal oluşturma hatalarını yeniden dener. Bu davranışı Mattermost plugin’i için genel olarak ayarlamak üzerechannels.mattermost.dmChannelRetry,
tek bir hesap için ise channels.mattermost.accounts.<id>.dmChannelRetry kullanın.
- Bu yalnızca DM kanal oluşturma (
/api/v4/channels/direct) için geçerlidir, her Mattermost API çağrısı için değil. - Yeniden denemeler; oran sınırlamaları, 5xx yanıtları ve ağ veya zaman aşımı hataları gibi geçici hatalara uygulanır.
429dışındaki 4xx istemci hataları kalıcı kabul edilir ve yeniden denenmez.
Önizleme akışı
Mattermost; düşünme, araç etkinliği ve kısmi yanıt metnini tek bir taslak önizleme gönderisi içinde akıtır; bu gönderi, son yanıt güvenle gönderilebildiğinde yerinde kesinleştirilir. Önizleme, kanalın parça başına mesajlarla doldurulması yerine aynı gönderi kimliği üzerinde güncellenir. Medya/hata sonlandırmaları bekleyen önizleme düzenlemelerini iptal eder ve geçici bir önizleme gönderisini boşaltmak yerine normal teslimatı kullanır.channels.mattermost.streaming ile etkinleştirin:
partialgenellikle tercih edilen seçenektir: yanıt büyüdükçe düzenlenen tek bir önizleme gönderisi, ardından tam yanıtla kesinleştirme.block, önizleme gönderisi içinde eklemeli taslak parçaları kullanır.progress, üretim sırasında bir durum önizlemesi gösterir ve son yanıtı yalnızca tamamlandığında gönderir.off, önizleme akışını devre dışı bırakır.- Akış yerinde kesinleştirilemezse (örneğin gönderi akış sırasında silinirse), OpenClaw yanıtın asla kaybolmaması için yeni bir son gönderi göndermeye geri döner.
- Kanal eşleme matrisi için Streaming bölümüne bakın.
Tepkiler (message aracı)
channel=mattermostilemessage action=reactkullanın.messageId, Mattermost gönderi kimliğidir.emoji,thumbsupveya:+1:gibi adları kabul eder (iki nokta üst üste işaretleri isteğe bağlıdır).- Bir tepkiyi kaldırmak için
remove=true(boolean) ayarlayın. - Tepki ekleme/kaldırma olayları, yönlendirilmiş agent oturumuna sistem olayları olarak iletilir.
channels.mattermost.actions.reactions: tepki eylemlerini etkinleştir/devre dışı bırak (varsayılan true).- Hesap başına geçersiz kılma:
channels.mattermost.accounts.<id>.actions.reactions.
Etkileşimli düğmeler (message aracı)
Tıklanabilir düğmeler içeren mesajlar gönderin. Bir kullanıcı bir düğmeye tıkladığında, agent seçimi alır ve yanıt verebilir. Kanal yeteneklerineinlineButtons ekleyerek düğmeleri etkinleştirin:
buttons parametresiyle message action=send kullanın. Düğmeler 2D bir dizidir (düğme satırları):
text(gerekli): görüntüleme etiketi.callback_data(gerekli): tıklamada geri gönderilen değer (eylem kimliği olarak kullanılır).style(isteğe bağlı):"default","primary"veya"danger".
- Tüm düğmeler bir onay satırıyla değiştirilir (ör. ”✓ Yes @user tarafından seçildi”).
- Agent seçimi gelen bir mesaj olarak alır ve yanıt verir.
- Düğme callback’leri HMAC-SHA256 doğrulaması kullanır (otomatik, yapılandırma gerekmez).
- Mattermost, API yanıtlarından callback verilerini çıkarır (güvenlik özelliği), bu nedenle tıklamada tüm düğmeler kaldırılır — kısmi kaldırma mümkün değildir.
- Tire veya alt çizgi içeren eylem kimlikleri otomatik olarak temizlenir (Mattermost yönlendirme sınırlaması).
channels.mattermost.capabilities: yetenek dizeleri dizisi. Agent sistem isteminde düğmeler aracı açıklamasını etkinleştirmek için"inlineButtons"ekleyin.channels.mattermost.interactions.callbackBaseUrl: düğme callback’leri için isteğe bağlı dış base URL (örneğinhttps://gateway.example.com). Mattermost, Gateway’e doğrudan bind host’u üzerinden ulaşamadığında bunu kullanın.- Çoklu hesap kurulumlarında aynı alanı
channels.mattermost.accounts.<id>.interactions.callbackBaseUrlaltında da ayarlayabilirsiniz. interactions.callbackBaseUrlatlanırsa OpenClaw callback URL’yigateway.customBindHost+gateway.portüzerinden türetir, ardındanhttp://localhost:<port>değerine geri döner.- Erişilebilirlik kuralı: düğme callback URL’si Mattermost sunucusundan erişilebilir olmalıdır.
localhostyalnızca Mattermost ve OpenClaw aynı host/ağ namespace’inde çalışıyorsa işe yarar. - Callback hedefiniz private/tailnet/internal ise host/domain’ini Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionsayarına ekleyin.
Doğrudan API entegrasyonu (harici betikler)
Harici betikler ve Webhook’lar, agent’ınmessage aracı üzerinden gitmek yerine düğmeleri doğrudan Mattermost REST API üzerinden gönderebilir.
Mümkün olduğunda extension içindeki buildButtonAttachments() işlevini kullanın; ham JSON gönderiyorsanız şu kurallara uyun:
Payload yapısı:
- Ekler üst düzey
attachmentsiçinde değil,props.attachmentsiçinde yer alır (aksi halde sessizce yok sayılır). - Her eylem için
type: "button"gerekir — bu olmadan tıklamalar sessizce yutulur. - Her eylem için bir
idalanı gerekir — Mattermost kimliksiz eylemleri yok sayar. - Eylem
iddeğeri yalnızca alfanümerik olmalıdır ([a-zA-Z0-9]). Tire ve alt çizgi Mattermost’un sunucu tarafı eylem yönlendirmesini bozar (404döndürür). Kullanmadan önce bunları çıkarın. context.action_id, düğme adı (örneğin “Approve”) ham kimlik yerine onay mesajında görünsün diye düğmeniniddeğeriyle eşleşmelidir.context.action_idzorunludur — etkileşim işleyicisi bu alan olmadan400döndürür.
- Gizli anahtarı bot token’dan türetin:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - Bağlam nesnesini
_tokendışındaki tüm alanlarla oluşturun. - Sıralanmış anahtarlarla ve boşluksuz serileştirin (Gateway, sıralanmış anahtarlarla
JSON.stringifykullanır; bu da sıkılaştırılmış çıktı üretir). - İmzalayın:
HMAC-SHA256(key=secret, data=serializedContext) - Elde edilen hex özeti bağlama
_tokenolarak ekleyin.
- Python’un
json.dumpsişlevi varsayılan olarak boşluk ekler ({"key": "val"}). JavaScript’in sıkılaştırılmış çıktısıyla ({"key":"val"}) eşleşmesi içinseparators=(",", ":")kullanın. - Her zaman tüm bağlam alanlarını (
_tokenhariç) imzalayın. Gateway_tokenalanını çıkarır, ardından kalan her şeyi imzalar. Bir alt kümeyi imzalamak sessiz doğrulama hatasına neden olur. sort_keys=Truekullanın — Gateway imzalamadan önce anahtarları sıralar ve Mattermost payload’u saklarken bağlam alanlarını yeniden sıralayabilir.- Gizli anahtarı rastgele baytlardan değil, bot token’dan türetin (deterministik). Düğmeleri oluşturan süreç ile doğrulayan Gateway için gizli anahtar aynı olmalıdır.
Dizin bağdaştırıcısı
Mattermost plugin’i, kanal ve kullanıcı adlarını Mattermost API üzerinden çözen bir dizin bağdaştırıcısı içerir. Bu,openclaw message send ve
Cron/Webhook teslimatlarında #channel-name ve @username hedeflerini etkinleştirir.
Yapılandırma gerekmez — bağdaştırıcı, hesap yapılandırmasındaki bot token’ı kullanır.
Çoklu hesap
Mattermost,channels.mattermost.accounts altında birden çok hesabı destekler:
Sorun giderme
- Kanallarda yanıt yok: botun kanalda olduğundan emin olun ve ondan söz edin (
oncall), bir tetikleyici önek kullanın (onchar) veyachatmode: "onmessage"ayarlayın. - Kimlik doğrulama hataları: bot token’ı, base URL’yi ve hesabın etkin olup olmadığını kontrol edin.
- Çoklu hesap sorunları: ortam değişkenleri yalnızca
defaulthesabı için geçerlidir. - Yerel slash komutları
Unauthorized: invalid command token.döndürüyor: OpenClaw callback token’ını kabul etmedi. Tipik nedenler:- slash komutu kaydı başarısız oldu veya başlangıçta yalnızca kısmen tamamlandı
- callback yanlış Gateway/hesaba gidiyor
- Mattermost hâlâ önceki bir callback hedefine işaret eden eski komutlara sahip
- Gateway, slash komutlarını yeniden etkinleştirmeden yeniden başlatıldı
- Yerel slash komutları çalışmayı bırakırsa şu günlükleri kontrol edin:
mattermost: failed to register slash commandsveyamattermost: native slash commands enabled but no commands could be registered. callbackUrlatlanmışsa ve günlüklerde callback’inhttp://127.0.0.1:18789/...olarak çözümlendiğine dair bir uyarı varsa, bu URL muhtemelen yalnızca Mattermost, OpenClaw ile aynı host/ağ namespace’inde çalıştığında erişilebilirdir. Bunun yerine açıkça dışarıdan erişilebilir bircommands.callbackUrlayarlayın.- Düğmeler beyaz kutular olarak görünüyor: agent hatalı biçimlendirilmiş düğme verileri gönderiyor olabilir. Her düğmede hem
texthemcallback_dataalanlarının bulunduğunu kontrol edin. - Düğmeler görüntüleniyor ama tıklamalar hiçbir şey yapmıyor: Mattermost sunucu yapılandırmasında
AllowedUntrustedInternalConnectionsiçine127.0.0.1 localhosteklendiğini ve ServiceSettings içindeEnablePostActionIntegrationdeğerinintrueolduğunu doğrulayın. - Düğmeler tıklamada 404 döndürüyor: düğme
iddeğeri büyük olasılıkla tire veya alt çizgi içeriyor. Mattermost’un eylem yönlendiricisi alfanümerik olmayan kimliklerde bozulur. Yalnızca[a-zA-Z0-9]kullanın. - Gateway günlüklerinde
invalid _token: HMAC uyuşmazlığı. Tüm bağlam alanlarını (bir alt küme değil) imzaladığınızı, sıralanmış anahtarlar kullandığınızı ve sıkılaştırılmış JSON kullandığınızı (boşluksuz) kontrol edin. Yukarıdaki HMAC bölümüne bakın. - Gateway günlüklerinde
missing _token in context:_tokenalanı düğmenin bağlamında yok. Entegrasyon payload’unu oluştururken bunun eklendiğinden emin olun. - Onay, düğme adı yerine ham kimliği gösteriyor:
context.action_id, düğmeniniddeğeriyle eşleşmiyor. İkisini de aynı temizlenmiş değere ayarlayın. - Agent düğmelerden habersiz: Mattermost kanal yapılandırmasına
capabilities: ["inlineButtons"]ekleyin.
İlgili
- Channels Overview — desteklenen tüm kanallar
- Pairing — DM kimlik doğrulaması ve eşleştirme akışı
- Groups — grup sohbeti davranışı ve mention geçitleme
- Channel Routing — mesajlar için oturum yönlendirme
- Security — erişim modeli ve sağlamlaştırma