Feature: mentions bar with conversation partners (klonkt-demo-u02)
Implicit mentions leave the text and become an editable "To:" bar above the
reply editor: the parent author plus the thread's ancestor authors as chips.
Removing a chip stops addressing that partner (no mention anchor, no Mention
tag, no inbox ping); explicit @mentions typed in the text keep working via the
existing resolveMentionsInText path.
- getInteractions: each thread node gets "participants" (author + ancestor
chain via the byId map, own nodes skipped, deduped, capped at 8) and carries
actor_uri now.
- reply-editor partial: the bar renders server-side with a hidden "mentions"
JSON field carrying the full list, so the no-JS path addresses everyone; the
JS removes chips and mirrors the remaining list into the field.
- deliverReply({mentions}): undefined = legacy parent-only behavior; an array
(possibly empty) = the kept list drives the mention prefix, the Mention tags
(mentionTags reads the content anchors) and the per-actor inbox pings.
to_actor/to_handle follow the kept list (parent when kept, else the first
chip, else null -> the note addresses Public only).
- deliverOutboxUpdate: an edit reuses the OLD content's leading mention anchors
instead of rebuilding just to_actor, so co-mentions survive edits (legacy
rows fall back as before).
- Interact page passes the target author as the single chip. Full-screen
mobile keeps the top bar above the mentions bar (flex order).
4 new tests (participant chains, multi-chip tags + to_actor, empty bar goes
Public-only, co-mentions survive edits); 97 green. Browser-verified: bar shows
@bob + @alice on a nested reply, removing @alice updates the hidden field, the
sent reply mentions and addresses only @bob; no console errors.
Co-Authored-By: Claude Opus 4.8 <noreply@…>