openclaw/docs
Nick Sullivan 5571967ebd feat(whatsapp): inbound reaction events (#1)
* 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>

* revert changelog entry to avoid merge conflicts

The inbound reaction feature is internal plumbing, not user-facing enough
to warrant a changelog entry that will conflict with active PRs.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(whatsapp): handle reaction removals and improve sender detection

- Emit reaction events with isRemoval flag instead of skipping them
- Fall back to chatJid for DM sender when reaction.key is missing
- Add chatType and accountId to reaction logs for observability
- Update tests to reflect new removal handling behavior

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(whatsapp): gate reactions by DM/group access controls

Address Codex review - reactions now respect the same access controls
as messages (dmPolicy, allowlists, etc). Self-reactions bypass the
check since they're our own actions, not inbound events.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: remove unused senderName field from reaction type

Baileys reaction events don't include push names, so this field
was dead interface pollution. (Cursor review)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(whatsapp): update reaction docs + suppress pairing for reactions

- Update docs: reaction removals now emit events with isRemoval=true
- Pass no-op sendMessage to access control to prevent pairing messages
  being sent when unknown users react (pairing is for messages, not reactions)

(Cursor review)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Nick Sullivan <nick@technick.ai>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 10:44:00 -06:00
..
_layouts refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
assets Add files via upload 2026-01-29 23:37:32 -05:00
automation refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
channels feat(whatsapp): inbound reaction events (#1) 2026-01-30 10:44:00 -06:00
cli refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
concepts refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
debug refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
diagnostics refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
experiments refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
gateway refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
help refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
hooks refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
images docs: add group flow diagram 2026-01-10 20:05:22 +01:00
install refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
nodes refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
platforms refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
plugins refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
providers fix: migrate legacy gateway services 2026-01-30 04:01:31 +01:00
refactor refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
reference refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
security refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
start docs: update lore with final form 2026-01-30 07:26:07 +00:00
tools feat(whatsapp): inbound reaction events (#1) 2026-01-30 10:44:00 -06:00
web refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
_config.yml refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
bedrock.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
brave-search.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
broadcast-groups.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
CNAME refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
date-time.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
debugging.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
docs.json refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
environment.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
hooks.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
index.md docs: move WhatsApp image below dashboard 2026-01-30 06:55:15 +01:00
logging.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
multi-agent-sandbox-tools.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
network.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
northflank.mdx refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
perplexity.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
plugin.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
prose.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
railway.mdx refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
render.mdx refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
scripts.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
testing.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
token-use.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
tts.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
tui.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
vps.md refactor: rename to openclaw 2026-01-30 03:16:21 +01:00
whatsapp-openclaw.jpg refactor: rename to openclaw 2026-01-30 03:16:21 +01:00