Add [[whatsapp_apple]] and [imessage] schedules registered as generic
scheduler jobs, map whatsapp and apple_messages sources to them so Sync now
and source status work, and record a sync_runs row for every iMessage import.
The iMessage run row carries progress: processed, added, updated and error
counts (skipped messages) are checkpointed after each page and written in
final or partial form before the run completes or fails.
A scheduled iMessage import that clears archived dates invalidates the
analytics cache marker so the next check does a full rebuild. This also
applies when the import then fails or is cancelled; the import error is kept.
An imported iMessage that lost its text and attributed body now has its
stored body and search entry cleared on reimport. An attributed body that
cannot be decoded is not treated as empty content: reimporting an archived
message with such a body is skipped and the stored body and search entry are
kept. A message row that was updated before a later write failed is counted
as updated, not only as a skip, so the cache invalidation that keys off the
counters still runs.
The iMessage run row records additions explicitly instead of deriving them
by subtraction: a new message committed before a later write failed counts
as added, a changed existing one as updated, and a message that never
reached the archive only as skipped, so counters are exact and never
negative.
The [[whatsapp_apple]] path and [imessage] db_path settings are normalized
like the other path settings: ~ is expanded and, with an explicit --config,
relative paths resolve against the config directory. Empty keeps meaning the
default location.
- feat(status): report whether a sync run measured its source
- fix(status): stop calling measured runs unmeasured, and stale ones fresh
Generated with Codex
Generated with Claude Code (claude-opus-5-5)
Co-Authored-By: Noogram <noreply@noogram.org>
Signed-off-by: Emmanuel Sérié <emmanuel@serie.dev>
Co-authored-by: Wes McKinney <wesmckinn+git@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Depends on #1142.
Reports whether Apple-source sync runs actually measured their source, records missing or unreadable attempts as unmeasured, and exposes that state and reason through the API and Sources UI.