mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 21:50:42 +00:00
* bluebubbles: fall back unsupported reactions to love iMessage tapback only supports love/like/dislike/laugh/emphasize/question. Previously, `normalizeBlueBubblesReactionInput` threw when the input did not map to one of those (e.g. a non-standard unicode emoji like 👀 used to mean "seen, working on it"), which aborted the whole reaction request and left the user with no feedback. This splits the normalizer into a strict and lenient variant: - `normalizeBlueBubblesReactionInputStrict` throws on unsupported input and is used by validator-style callers (e.g. `resolveBlueBubblesAckReaction` in monitor-processing.ts) that rely on the throw to detect misconfigured ack reactions and skip them cleanly. This preserves the previous silent-skip + warn-once behavior for ack reactions configured with an unsupported emoji. - `normalizeBlueBubblesReactionInput` stays lenient and falls back to `love` (or `-love` when removing) on unsupported input, so agent-driven `sendBlueBubblesReaction` still produces a visible tapback instead of failing the whole reaction request. Contract errors (empty input) continue to bubble up. `love` is chosen over `like` as the neutral default: `❤️` reads as a general acknowledgment across chat norms, while `👍` carries an agreement connotation that does not match the "seen, working on it" semantic. * CHANGELOG: note BlueBubbles reaction fallback --------- Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
BlueBubbles extension (developer reference)
This package contains the BlueBubbles external channel plugin for OpenClaw.
If you’re looking for how to use BlueBubbles as an agent/tool user, see:
skills/bluebubbles/SKILL.md
Layout
- Package entry:
index.ts. - Channel implementation:
src/channel.ts. - Webhook handling:
src/monitor.ts(register per-account route viaregisterPluginHttpRoute). - REST helpers:
src/send.ts+src/probe.ts. - Runtime bridge:
src/runtime.ts(set viaapi.runtime). - Catalog entry for setup selection:
src/channels/plugins/catalog.ts.
Internal helpers (use these, not raw API calls)
probeBlueBubblesinsrc/probe.tsfor health checks.sendMessageBlueBubblesinsrc/send.tsfor text delivery.resolveChatGuidForTargetinsrc/send.tsfor chat lookup.sendBlueBubblesReactioninsrc/reactions.tsfor tapbacks.sendBlueBubblesTyping+markBlueBubblesChatReadinsrc/chat.ts.downloadBlueBubblesAttachmentinsrc/attachments.tsfor inbound media.buildBlueBubblesApiUrl+blueBubblesFetchWithTimeoutinsrc/types.tsfor shared REST plumbing.
Webhooks
- BlueBubbles posts JSON to the gateway HTTP server.
- Normalize sender/chat IDs defensively (payloads vary by version).
- Skip messages marked as from self.
- Route into core reply pipeline via the plugin runtime (
api.runtime) andopenclaw/plugin-sdkhelpers. - For attachments/stickers, use
<media:...>placeholders when text is empty and attach media paths viaMediaUrl(s)in the inbound context.
Config (core)
channels.bluebubbles.serverUrl(base URL),channels.bluebubbles.password,channels.bluebubbles.webhookPath.- Action gating:
channels.bluebubbles.actions.reactions(default true).
Message tool notes
- Reactions: the
reactaction requires atarget(phone number or chat identifier) in addition tomessageId. Example:action=react target=+15551234567 messageId=ABC123 emoji=❤️