mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-05 19:28:25 +00:00
Two app payload kinds already round-tripped through the protocol layer and then stopped at the feed: a kind:1009 edit was indexed but nothing drew it, and a kind:1210 system row was filtered out of the message list entirely. Edits reuse the overlay rail the other chat protocols already use. `latestMarmotEdit()` picks the winner off a message's own `edits` children, and it is deliberately read-side: the transport cannot stop a member from sending a well-formed 1009 that names someone else's message, so the reader is the one that has to check the author matches. Ties on the same second resolve by event id, otherwise two devices of one account could leave two readers rendering different text for the same message forever, with neither of them wrong. `RenderConcordEditedNote` was already exactly the renderer this needs, so it loses the protocol from its name and gains a Marmot caller. System rows needed somewhere to go. `ChatFeedRowRenderer` is a hook the feed consults per item: a renderer claims a note, or the ordinary bubble draws it. That keeps a Marmot-shaped row out of the generic chat feed, which serves four other protocols. `MarmotSystemRowRenderer` reads the row's structured fields rather than its `text`, so the caption is localized here instead of being whatever string the sender happened to compose; `text` stays as the fallback for a row whose fields we cannot read. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016kCuA6tc4JQzHPCDd39GHq