mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-10 00:16:59 +00:00
Memory pruning drops DM messages out of the cache but left the per-relay paging cursors untouched, so a relay still claimed to have delivered the dropped band (reachedUntil deep, or done) and the demand-driven loader never re-requested it — a silent hole until app restart. - Prune NIP-17 too: pruneMessagesToTheLatestOnly now reaps both NIP-04 (PrivateDmEvent) and NIP-17 (WrappedEvent rumors) on one merged top-N cut, so a conversation is cut at a single time point (no NIP-04-without -NIP-17 holes). NIP-17 is the actual memory-pressure driver. - HostStub carries the host's createdAt, so a decrypted rumor self- describes its outer gift-wrap time (the time the cursor pages by; the rumor's own time is the message time, not the wrap time). - RelayLoadingCursors.rewindTo() pulls a relay's reached cursor up past the pruned band, clears done, and un-arms it (demand-driven re-fetch); advance() now resumes from the rewound reached point instead of the floor. - LocalCache.pruneOldMessages accumulates the newest pruned created_at per relay (outer-wrap time for gift wraps, event time for NIP-04), filtered below each cursor's floor, then rewinds giftWrapHistory + rooms-list nip04History (account-wide) and the per-conversation nip04History. The gift-wrap window is account-global, so pruning one room rewinds the shared sweep; the interference is bounded (already-held wraps short- circuit in consumeRegularEvent, re-fetch is demand-gated). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>