Skip to content

Desktop: shared relay agents never appear in mention autocomplete (mobile works) #4128

Description

@bossriceshark

Describe the bug

On desktop, a shared/remote relay agent — one whose kind:10100 directory record makes it mention-eligible (respond_to: "anyone" + a shared channel) — never appears in the @ mention autocomplete, so it cannot be selected as a pill. The same agent gets a pill on mobile immediately. Plaintext fallback matching (where the agent's ACP config accepts literal @Name) still works, which makes the failure look intermittent to users: typed text answers, the picker doesn't.

To reproduce

  1. Self-host a relay. Run an agent via buzz-acp on a separate machine (any host that isn't the desktop device), with a rich kind:10100 directory record: respond_to: "anyone", channel_ids including a channel the desktop user has joined.
  2. Add the agent to that channel (role bot). Confirm it authenticates and appears in the relay directory.
  3. Desktop app: open the channel, type @ — the agent is missing from the suggestion list.
  4. Mobile app, same account, same channel: the agent appears and is selectable.

Expected behavior

Directory-eligible shared agents should be offered as mention pills on desktop, matching mobile and matching desktop's own directory-based eligibility in useNewMessageRecipients and ProjectsAgentPromptPage.

Mechanism (as of 3d7712c)

addCandidate() in desktop/src/features/messages/lib/useMentions.ts calls isAgentIdentityInManagedList() before shouldHideAgentFromMentions(). Any isAgent candidate whose pubkey is not in the local managed-agents list is dropped — including every candidate produced by the relayAgentsQuery loop, which makes that loop dead code for non-local agents.

A remote agent can never satisfy that gate: apply_inbound_managed_agent() (desktop/src-tauri/src/commands/personas/inbound.rs) is patch-only by design ("managed agents are never minted from a relay event"), so no directory record, kind:30177 declaration, or channel membership ever creates a local managed entry on another device.

Two side observations while diagnosing, in case they're intentional-vs-known:

  • shouldHideAgentFromMentions' member branch ("Member … unknown invocability => show") is unreachable at its only call site, because the pre-gate already requires mentionable-set membership. A channel-member agent with no usable directory record is hidden on desktop (mobile shows it).
  • MembersSidebar's add-member search uses the same managed-list gate and likely has the same remote-agent blindness — left untouched by the fix below since the UX semantics differ.

Trust-model note

Directory eligibility (respond_to + shared channel_ids) is self-published per-pubkey, but this exact eligibility set is already trusted by mobile mentions, useNewMessageRecipients, and ProjectsAgentPromptPage — fixing the pill path brings mention autocomplete to parity, not beyond it.

Fix

PR incoming from this account: admit mention candidates through the mentionable set (getMentionableAgentPubkeys = managed ∪ directory-eligible) at the useMentions call site, leaving isAgentIdentityInManagedList unchanged for its other consumer; unit tests included. Verified on a live self-hosted deployment (desktop vs Android discrepancy reproduced, then resolved with the patch).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions