You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- LINE/context and routing synthesis: fix group/room peer routing and command-authorization context propagation, and keep processing later events in mixed-success webhook batches. (from #21955, #24475, #27035, #28286) Thanks @lailoo, @mcaxtr, @jervyclaw, @Glucksberg, and @Takhoffman.
121
121
- LINE/status/config/webhook synthesis: fix status false positives from snapshot/config state and accept LINE webhook HEAD probes for compatibility. (from #10487, #25726, #27537, #27908, #31387) Thanks @BlueBirdBack, @stakeswky, @loiie45e, @puritysb, and @mcaxtr.
122
122
- LINE cleanup/test follow-ups: fold cleanup/test learnings into the synthesis review path while keeping runtime changes focused on regression fixes. (from #17630, #17289) Thanks @Clawborn and @davidahmann.
123
+
- Mattermost/interactive buttons: add interactive button send/callback support with directory-based channel/user target resolution, and harden callbacks via account-scoped HMAC verification plus sender-scoped DM routing. (#19957) thanks @tonydehnke.
- Python's `json.dumps` adds spaces by default (`{"key": "val"}`). Use
307
+
`separators=(",", ":")` to match JavaScript's compact output (`{"key":"val"}`).
308
+
- Always sign **all** context fields (minus `_token`). The gateway strips `_token` then
309
+
signs everything remaining. Signing a subset causes silent verification failure.
310
+
- Use `sort_keys=True` — the gateway sorts keys before signing, and Mattermost may
311
+
reorder context fields when storing the payload.
312
+
- Derive the secret from the bot token (deterministic), not random bytes. The secret
313
+
must be the same across the process that creates buttons and the gateway that verifies.
314
+
315
+
## Directory adapter
316
+
317
+
The Mattermost plugin includes a directory adapter that resolves channel and user names
318
+
via the Mattermost API. This enables `#channel-name` and `@username` targets in
319
+
`openclaw message send` and cron/webhook deliveries.
320
+
321
+
No configuration is needed — the adapter uses the bot token from the account config.
322
+
178
323
## Multi-account
179
324
180
325
Mattermost supports multiple accounts under `channels.mattermost.accounts`:
@@ -197,3 +342,10 @@ Mattermost supports multiple accounts under `channels.mattermost.accounts`:
197
342
- No replies in channels: ensure the bot is in the channel and mention it (oncall), use a trigger prefix (onchar), or set `chatmode: "onmessage"`.
198
343
- Auth errors: check the bot token, base URL, and whether the account is enabled.
199
344
- Multi-account issues: env vars only apply to the `default` account.
345
+
- Buttons appear as white boxes: the agent may be sending malformed button data. Check that each button has both `text` and `callback_data` fields.
346
+
- Buttons render but clicks do nothing: verify `AllowedUntrustedInternalConnections` in Mattermost server config includes `127.0.0.1 localhost`, and that `EnablePostActionIntegration` is `true` in ServiceSettings.
347
+
- Buttons return 404 on click: the button `id` likely contains hyphens or underscores. Mattermost's action router breaks on non-alphanumeric IDs. Use `[a-zA-Z0-9]` only.
348
+
- Gateway logs `invalid _token`: HMAC mismatch. Check that you sign all context fields (not a subset), use sorted keys, and use compact JSON (no spaces). See the HMAC section above.
349
+
- Gateway logs `missing _token in context`: the `_token` field is not in the button's context. Ensure it is included when building the integration payload.
350
+
- Confirmation shows raw ID instead of button name: `context.action_id` does not match the button's `id`. Set both to the same sanitized value.
351
+
- Agent doesn't know about buttons: add `capabilities: ["inlineButtons"]` to the Mattermost channel config.
0 commit comments