Fixes
Phantom identity from device-suffixed LID mapping
Baileys' lidMapping.getPNForLID() returns a full device JID (1XXXXXXXXXX:0@s.whatsapp.net). Using it raw as a phone number shifted the last-10-digits hash by one character (the :0 device index rode along), creating a phantom contact — exception-list matches by hash silently failed and exempted users still got asked for approval. resolvePhoneNumber() now jidDecodes the result and returns the bare number.
Exception fallback by reply JID
When the live hash doesn't match the exception list, the requester's stored contact is resolved by their full JID and that contact's hash is checked — protects against stale/rotated hashes.
WA version fetch cached
fetchLatestBaileysVersion() (scrapes GitHub on every call) is now cached for 1h with in-flight dedup — auto-reconnects no longer block on GitHub being reachable.
Test fixture
Global jidDecode mock now mirrors real behavior (returns undefined for inputs without @); was returning a user for any string, which masked the LID slow path in tests.
4 new tests; 742/742 passing.