openclaw/docs/tools/reactions.md
Nick Sullivan 9369e36eb2 feat(whatsapp): subscribe to inbound reaction events
Subscribe to Baileys `messages.reaction` events and surface them as
system events for the agent session. Follows the same pattern used by
Signal and Slack: listen → parse → route → enqueueSystemEvent.

- Add `WebInboundReaction` type and `onReaction` callback to monitor
- Parse emoji, sender JID, target message ID from Baileys event
- Route via `resolveAgentRoute` and enqueue as system event
- Handle self-reaction attribution (reactionKey.fromMe → selfJid)
- Skip reaction removals (empty emoji) and status/broadcast JIDs
- Outer + inner try/catch for resilience against malformed events
- 13 unit tests (monitor-level + system event wiring)
- Changelog entry and docs updates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 10:38:02 -06:00

1.1 KiB

summary read_when
Reaction semantics shared across channels
Working on reactions in any channel

Reaction tooling

Shared reaction semantics across channels:

  • emoji is required when adding a reaction.
  • emoji="" removes the bot's reaction(s) when supported.
  • remove: true removes the specified emoji when supported (requires emoji).

Channel notes:

  • Discord/Slack: empty emoji removes all of the bot's reactions on the message; remove: true removes just that emoji.
  • Google Chat: empty emoji removes the app's reactions on the message; remove: true removes just that emoji.
  • Telegram: empty emoji removes the bot's reactions; remove: true also removes reactions but still requires a non-empty emoji for tool validation.
  • WhatsApp: empty emoji removes the bot reaction; remove: true maps to empty emoji (still requires emoji).
  • Signal: inbound reaction notifications emit system events when channels.signal.reactionNotifications is enabled.
  • WhatsApp: inbound reaction notifications are always surfaced as system events (no configuration required).