Unambiguous storage key for a message: <chatId>:<id> with % and :
percent-escaped in each part, so the single raw : always separates the
two. Ids without : or % (WhatsApp JIDs, Telegram/Discord numbers…) get
the exact same key as before; ids that do contain them (Twilio's
whatsapp:+1555… chat ids) no longer collide — the former plain
${chatId}:${id} mapped ('a:b', 'c') and ('a', 'b:c') to one key.
Persistent stores that wrote keys in the old format read and delete through
legacyMessageKey as a fallback (see the store READMEs).
Unambiguous storage key for a message:
<chatId>:<id>with%and:percent-escaped in each part, so the single raw:always separates the two. Ids without:or%(WhatsApp JIDs, Telegram/Discord numbers…) get the exact same key as before; ids that do contain them (Twilio'swhatsapp:+1555…chat ids) no longer collide — the former plain${chatId}:${id}mapped('a:b', 'c')and('a', 'b:c')to one key.Persistent stores that wrote keys in the old format read and delete through legacyMessageKey as a fallback (see the store READMEs).