fix(beeper): store plain text, resume backfilled history, classify link previews - #571
Conversation
roborev: Combined Review (
|
|
looking |
70f80ae to
8f69b64
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
c1831cf to
7f84fb9
Compare
roborev: Combined Review (
|
roborev: Combined Review (
|
c781e2d to
e0c61fe
Compare
roborev: Combined Review (
|
e0c61fe to
8e384f0
Compare
roborev: Combined Review (
|
8e384f0 to
49649e3
Compare
roborev: Combined Review (
|
…nk previews - Keep PostgreSQL attachment metadata and derived repairs retryable. - Skip unchanged tail-only chats during daily probes. - Walk cursorless and event-only pages to find older backfills. - Keep canceled tail scans due so interrupted syncs resume immediately. - Refresh derived text and analytics link metadata consistently. - Avoid cache invalidation when a derivation pass scans no messages. - Invalidate analytics caches after derived-data repairs. - Exclude Matrix reply fallbacks from bodies, snippets, and search. - Strip terminal controls from decoded and rendered message text. Generated with Codex Co-authored-by: Wes McKinney <wesmckinn+git@gmail.com> Co-authored-by: Codex <noreply@openai.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
49649e3 to
ff42707
Compare
roborev: Combined Review (
|
Beeper's API returns HTML in a message's
textfield for some messages and plain text for others, with no field distinguishing them. msgvault stored it verbatim, so message bodies, snippets and the search index carried raw markup — on a large archive roughly 10% of messages held<a href>tags, andtarget="_blank"swamped searches for the ordinary word "target". Text is now converted when it is HTML and left untouched when it is not, so messages containing<or&survive intact.A chat whose backfill had completed only ever synced forward. Beeper Desktop keeps filling in a network's older history for hours or weeks after it is linked, and that history arrives with old timestamps — it neither advances the chat's last activity nor falls in the reconcile window, so it was never archived. Completed chats now re-check their oldest end once a day and resume the backfill when Beeper has added more behind them. Syncs report how many chats they reopened.
Media that arrives as a forwarded link preview — an Instagram reel, an x.com post — now records the URL it previews in
attachments.attachment_metadata. That distinguishes media a sender composed from a public post they forwarded, which matters because forwarded previews can dominate an archive's bytes while remaining recoverable from their URL. Download behaviour is unchanged; everything is still archived.Existing archives repair themselves: each source re-derives its stored text and attachment metadata once, on its next sync, and reports what it fixed. To repair on demand instead of waiting, or to finish an interrupted pass:
It reads the verbatim payload archived with every message, so it needs no provider connection and repairs messages Beeper no longer holds. Only derived columns are rewritten — raw payloads, downloaded media and sync cursors are untouched — so it is idempotent. The pass is registered per source type, so other importers that archive raw payloads can opt in without a new command.
🤖 Generated with Claude Code