feat: IMAP CONDSTORE fast-path, JMAP blob TTL, offline compose queue UI

- IMAP CONDSTORE (RFC 7162): skip sync when HIGHESTMODSEQ is unchanged;
  refresh only changed flags via CHANGEDSINCE on incremental sync
- JMAP blob expiry: re-fetch email bodies older than 7 days (schema v8→v9
  adds nullable cachedAt column to email_bodies)
- Offline compose queue: expose stuck pending_changes rows via
  observeFailedMutations / retryMutation / discardMutation; surface them
  in a FailedMutationBanner on the mailbox list screen
- Unit tests for all three features (236 passing)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Thomas Güttler
2026-04-20 06:32:33 +02:00
co-authored by Claude Sonnet 4.6
parent 650c7a70f5
commit d5a5c7fbe3
11 changed files with 585 additions and 37 deletions
+5 -1
View File
@@ -1,6 +1,10 @@
# Later
Push to guettli@thomas-guettler via ssh+git
LINTING.md
---
Sieve: JMAP, easy. Per IMAP...
---