openclaw-slack-buttons-hotfix
v0.1.2
Published
Hotfix channel plugin: makes OpenClaw presentation buttons render as real Slack Block Kit instead of a bullet-text list (upstream bug openclaw/openclaw#95440). Wraps the official @openclaw/slack plugin and bridges the missing renderPresentation/presentati
Maintainers
Readme
openclaw-slack-buttons-hotfix
Makes OpenClaw presentation buttons render as real Slack Block Kit buttons instead of a bullet-text list.
Hotfix for openclaw/openclaw#95440 (candidate upstream fix: PR #95463).
The bug
The official Slack plugin contains a complete Block Kit presentation renderer, but the
outbound adapter it registers with core (slackChannelOutbound) omits
renderPresentation and presentationCapabilities. Core delivery therefore assumes the
channel cannot render buttons and downgrades every presentation — including
{"blocks":[{"type":"buttons",...}]} — to plain text like:
• ✅ Approve
• ⏭️ SkipAffected: every openclaw message send --presentation and agent presentation send to
Slack, on 2026.6.x (verified still present in @openclaw/[email protected]).
Telegram is unaffected (it renders presentation buttons inside its own send path).
What this plugin does
It re-registers the official, unmodified Slack channel plugin under the same channel
id slack, with exactly two properties bridged onto the registered outbound adapter:
presentationCapabilities— so core knows Slack can render buttons/selects, andrenderPresentation— the same Block-Kit build the plugin's inner adapter already implements (via the plugin's own publicbuildSlackPresentationBlocks).
Everything else — auth, socket mode, inbound, interactive replies, threading, media —
is the official plugin, untouched. Channel takeover uses the sanctioned
channelConfigs.slack.preferOver mechanism, not monkey-patching.
Self-retiring: if the installed @openclaw/slack already exposes
renderPresentation (i.e. upstream shipped the fix), this plugin passes the official
plugin through completely unchanged. Once the fix is released you can simply uninstall.
Install
openclaw plugins install clawhub:openclaw-slack-buttons-hotfix # or npm:openclaw-slack-buttons-hotfix
openclaw plugins enable slack-buttons-hotfix
openclaw plugins disable slack # the wrapper serves the "slack" channel instead
openclaw gateway restartWhy disable the stock plugin: with both enabled, core keeps routing the channel to the
stock plugin — preferOver in this plugin's manifest only prevents core from
auto-re-enabling the stock plugin later (e.g. because channels.slack is configured).
The official @openclaw/slack package itself must stay installed (this plugin loads
its code); only the plugin entry is disabled.
Your existing channels.slack config (tokens, allowlists, capabilities) is used as-is —
this plugin serves the same channel id. If your config uses a plugins.allow allowlist,
add "slack-buttons-hotfix" (the installer usually does this for you).
Verify
openclaw message send --channel slack --target <your-dm> --json \
--message "button test" \
--presentation '{"blocks":[{"type":"buttons","buttons":[{"label":"Tap me","value":"ok","style":"success"}]}]}'You should see a real tappable button, and the JSON receipt should report
parts[0].kind: "card" (broken installs report "text"). Taps arrive back as inbound
text equal to the button value (same behavior as Telegram inline buttons).
Uninstall (after upstream fixes #95440)
openclaw plugins enable slack
openclaw plugins disable slack-buttons-hotfix
openclaw plugins uninstall slack-buttons-hotfix
openclaw gateway restartLicense
MIT
