Root cause of the persistent "notification opens a dead page / no Join" bug:
openFromNotif gated the in-place open on `window.ME`, but ME is declared with
`let` — which never creates a global property — so window.ME was ALWAYS
undefined and every click hit the full-page-reload fallback. Use bare `ME`.
Also:
- Notifications fire instantly: never block on the DP download. Use the photo
only if already cached; warm the cache in the background + pre-warm all
contact DPs on chat load (precache-avatars IPC). Removes the ~2.5s lag.
- Wire call Join/Decline handlers BEFORE firing the OS notification so Join is
live the instant the invite popup appears (was dead until the toast settled).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>