mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-12 03:05:45 +00:00
Two distinct user sends to a DM — a command followed by a pasted URL that iMessage renders as a standalone URL-balloon message — are delivered by Apple/BlueBubbles as two separate webhooks ~0.8-2.0 s apart. Without coalescing, the agent replies to the command alone before the URL arrives (the dump skill sees an empty payload), and the URL lands as a second queued turn. Opt-in behind channels.bluebubbles.coalesceSameSenderDms (default false). When set, DM messages with no associatedMessageGuid hash to dm:<chat>:<sender> so the debounce window merges text + URL-balloon into one merged agent turn. Group chats and legacy text+balloon pairs linked via associatedMessageGuid keep per-message keys. The default inbound debounce window widens from 500 ms to 2500 ms when the flag is on and no explicit messages.inbound.byChannel.bluebubbles is set, covering Apple's observed split-send cadence. Merged output is bounded (<=4000 chars text with an explicit truncation marker, <=20 attachments, first-plus-latest sampling beyond 10 source entries). Every source messageId folded into the merged view is committed to the inbound dedupe store after processing, so a later BlueBubbles MessagePoller replay of any individual source event is recognized as a duplicate. Tests (506 BlueBubbles tests passing, multiple new cases covering the on/off matrix, control-command override, orphan URL-balloon, group-chat preservation, default-window widening, replay-of-any-source-id dedupe, and the 25-message flood bound). Smoke tested end-to-end against live BlueBubbles webhook traffic: Dump+URL composed as one iMessage -> BB dispatches two webhooks ~1 s apart -> debouncer coalesces both under dm:<chat>:<sender> -> dump skill runs on merged payload in one turn. Also updates docs/channels/bluebubbles.md with a scenarios table, enablement guide, trade-offs, and three-layer troubleshooting checklist; docs/concepts/messages.md cross-references the control-command debounce exception. |
||
|---|---|---|
| .. | ||
| .generated | ||
| .i18n | ||
| assets | ||
| automation | ||
| channels | ||
| cli | ||
| concepts | ||
| debug | ||
| diagnostics | ||
| gateway | ||
| help | ||
| images | ||
| install | ||
| nodes | ||
| platforms | ||
| plugins | ||
| providers | ||
| refactor | ||
| reference | ||
| security | ||
| snippets/plugin-publish | ||
| start | ||
| tools | ||
| web | ||
| AGENTS.md | ||
| auth-credential-semantics.md | ||
| brave-search.md | ||
| ci.md | ||
| CLAUDE.md | ||
| date-time.md | ||
| docs.json | ||
| index.md | ||
| logging.md | ||
| nav-tabs-underline.js | ||
| network.md | ||
| perplexity.md | ||
| pi-dev.md | ||
| pi.md | ||
| prose.md | ||
| style.css | ||
| tts.md | ||
| vps.md | ||
| whatsapp-openclaw-ai-zh.jpg | ||
| whatsapp-openclaw.jpg | ||