WhatsApp rejects handshakes advertising Baileys' baked-in stale protocol
version with a 405 close, so the plugin cycled starting->disconnected and
never issued a QR. connect() now fetches the current WA Web version per
socket build. /status also exposes lastError so this failure mode is
diagnosable from the documented troubleshooting surface.
The published bundled.js also failed to load entirely ("Dynamic require
of 'crypto' is not supported"): plugin bundles are ESM but Baileys is
CJS. bundlePluginEntry now injects the same createRequire banner as
dist/bin.js.
Verified end-to-end against an isolated fn serve: bundled.js loads,
status reaches awaiting-qr, /qr serves a scannable QR data URL,
/pair-code validates input, /logout clears auth state.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
WhatsApp Chat Plugin
WhatsApp Web (Baileys) bridge for Fusion. It pairs with your phone (QR or pairing code), keeps a background connection alive, forwards inbound direct text messages to a Fusion AI session, and sends the assistant reply back to WhatsApp.
No Meta Cloud app, webhook URL, verify token, or Graph API credentials are required.
Setup
- Enable/install the plugin in Plugin Manager.
- Configure
allowedSenders(empty means nobody is allowed). - Choose
pairingMode:qr(default): fetch QR from/api/plugins/fusion-plugin-whatsapp-chat/qrand scan in WhatsApp.code: setpairingPhoneNumber(E.164 digits without+) and request code via/pair-code.
- Confirm
/statusreportsconnected.
Settings
pairingMode:qrorcode.pairingPhoneNumber: E.164 digits without+(used forcodemode).allowedSenders: allowed WhatsApp JIDs or E.164 digits.agentSystemPrompt: system prompt for replies.historyTurnLimit: persisted turn window (default40).dedupeRetentionDays: replay-protection retention window for inbound message IDs (default7days). Rows older than this are pruned lazily whenever a new inbound message is processed.
Routes
GET /api/plugins/fusion-plugin-whatsapp-chat/statusGET /api/plugins/fusion-plugin-whatsapp-chat/qrPOST /api/plugins/fusion-plugin-whatsapp-chat/pair-codePOST /api/plugins/fusion-plugin-whatsapp-chat/logout
Storage and lifecycle
- Starts socket on
onLoad, stops ononUnload. - Persists transcript and dedupe state in:
whatsapp_chat_sessionswhatsapp_chat_dedupe
- Persists Baileys auth state in:
whatsapp_auth_credswhatsapp_auth_keys
- After restart, plugin reconnects automatically when auth is valid.
Troubleshooting
- Stuck
awaiting-qr: fetch a fresh QR and scan promptly. loggedOut: call/logout(or wait for clear) and re-pair.- Pair code not generated: ensure
pairingPhoneNumberis E.164 digits without+. - No replies: check
allowedSenders; empty list blocks all inbound messages by design.
Compliance warning
Baileys is an unofficial WhatsApp Web protocol client. Use may violate WhatsApp Terms of Service. This plugin is intended for self-hosted, single-user use at your own risk.