# Changelog ## 1.7.9 (2026-08-07) ### Bug Fixes (Phase 1 — VNCmailgraph audit) - **Mail**: Network transport failures now throw `TransportError` instead of returning empty results, so offline/network-down is distinguishable from an empty folder (#C1) - **Mail**: Push handler now refreshes contacts and files on remote state changes (#H1) - **Calendar**: Recurrence expansion IDs use `::occurrence::` delimiter to prevent collision with shared-event prefixes (#C2) - **Calendar**: Cross-account event aggregation now deduplicates by UID + recurrenceId, preventing phantom duplicates (#C3) - **Calendar**: `calendarTasksEnabled` admin policy now enforced at runtime, not just in settings UI (#H13) - **Tasks**: All task mutations (update, delete, toggle) now have error handling with store error state (#H14) - **Settings**: `updateSetting()` now checks admin policy lock before writing; `force` opt-in for legitimate bypassers (#C7) - **Settings**: `autoSelectReplyIdentity` now defaults to `true` — auto-identity selection on by default (#H18) - **Templates**: HTML template bodies are now sanitized with DOMPurify on import to prevent stored XSS (#H7) - **Auth**: User authentication endpoints now rate-limited — 10 attempts per (IP + username) per 15 minutes (#H3) - **Auth**: Admin sessions now support token revocation via JTI blacklist on logout (#C4) - **Auth**: Secure cookie flag now derived from `x-forwarded-proto`, not `NODE_ENV` (#H8) - **Auth**: OAuth token exchange error logs no longer leak `access_token` (#H4) - **Auth**: `isHashed()` no longer accepts bcrypt prefixes — scrypt-only, preventing lockout from bcrypt passwords (#H9) - **Push**: WS→SSE fallback now awaits state snapshot before reconciliation to prevent missed deliveries (#H2) - **Push**: Offline event handler added — push transports pause when browser goes offline, reconnect on online (#C8) - **Index**: FTS5 schema-drop now logs a warning so operators know a rebuild is needed (#C6) --- ## 1.7.8 (2026-07-22) ### Features - **Unified Mailbox**: Account-bounded Unified Mailbox with opt-in cross-account aggregation (#509) - **Unified Mailbox**: Search in the unified views - **Unified Mailbox**: Live unified/All-Mail counters for shared and group accounts - **Mail**: Message-list category tabs - **Mail**: Drag-and-drop reorder for all folders - **Mail**: Collapse quoted reply text behind a "..." toggle (#480) - **Mail**: Bulk Not-Spam action in the junk selection toolbar - **Mail**: Unread count badge on the favicon - **Mail**: Message spacing setting (auto/always/edge-to-edge) - **Mail**: Open external links in a new tab (safely) - **Mail**: Strip external `url()`/`@import` from `