Engine: deleteAddressNoteMessage drops the row from the store
and enqueues an address_note_message_remove op. Collab apply
mirrors the existing edit path. AddressNoteChange grows a
messageRemoved case.
GTK: right-click on a user message offers Edit and Delete.
Edit swaps the body label for an inline editor; Save commits
via editUserMessage. Delete confirms first, then removes the
row from the popover and via the engine.
Replace the per-event decorations-box rebuild with in-place
mutation: keep one box per address, attach/detach the bubble
when its count crosses zero. The popover always anchors to the
address label (looked up by address), so it sits in the same
spot whether triggered by the context menu or by clicking the
bubble. Avoids tearing down focused subtrees mid-event, which
was crashing gtk_label_grab_focus.
noteRemoved now carries the removed note so the UI can resolve
its anchor after the store has dropped it.
Create/update/delete notes, append/edit user messages. Each
mutation persists locally, refreshes the address-annotation
gutter, fans an op through collaboration, and reports via
onAddressNoteChanged. AI-backed replies land separately.