Describe the bug
A managed agent can only be @mentioned from the machine that runs it. From any
other client on the same relay, the agent produces no autocomplete entry, so the
sent message carries no p tag and the agent's harness never dispatches. The
message lands in the channel as plain text and nothing happens.
There is no error and no UI signal that this is unsupported — the agent shows in
the member list, its kind:0 profile resolves, and it replies normally when
mentioned from its host machine. The failure is indistinguishable from a
misconfiguration, which makes it expensive to diagnose.
This blocks the "one shared agent on an always-on host" setup: today every person
has to run their own copy of every agent, producing duplicate identities with
duplicate display names.
Steps to reproduce
- Point two Buzz clients (A and B) at the same relay.
- On A, create a managed agent, add it to a channel, set
respond_to to
anyone, and start it. Confirm it is a bot member of that channel.
- On A,
@mention the agent in that channel — it autocompletes and replies.
- On B, open the same channel and type
@ followed by the agent's name.
- No autocomplete entry appears. Sending the text anyway produces an event with
no p tag, and the agent never runs.
Expected behavior
The agent appears in B's autocomplete and is mentionable, producing the same
p-tagged event that A produces.
Version and platform
- Buzz version: v0.4.26 desktop (also reproduces on current
main)
- OS: macOS
Logs / additional context
Two independent causes, either of which is sufficient on its own.
1. The desktop app never publishes the kind:10100 agent profile it reads back.
list_relay_agents queries {"kinds":[10100]} unfiltered, and
agents_from_events parses the result into RelayAgentInfo. But no code path in
desktop/src-tauri ever publishes a 10100 event — the only publisher in the
repo is buzz channels set-add-policy in the CLI, which writes only
channel_add_policy. The relay does not synthesize one either;
handle_agent_profile just reads channel_add_policy off it as a side effect.
So relayAgentsQuery.data is empty for any desktop-created agent, and the entire
relay-agent branch of getMentionableAgentPubkeys is unreachable in practice.
2. isAgentIdentityInManagedList drops every non-locally-managed agent.
Added in a4dfead ("fix(desktop): prefer live agent mentions", #2149), the gate at
useMentions.ts addCandidate runs before shouldHideAgentFromMentions and
discards any candidate with isAgent === true whose pubkey is not in the
locally managed set. A remote agent that is a bot channel member enters via
the members loop with isAgent set from member.role === "bot" and is dropped
there.
First released in v0.4.20; git diff v0.4.26 HEAD on useMentions.ts and
agentAutocompleteEligibility.ts is empty, so current main behaves the same.
On a fix
I prototyped against the real eligibility functions. No single-signal change
works — each one either fails to unblock the remote agent or un-hides an identity
that your existing tests require to stay hidden:
|
must be |
swap gate to mentionable |
bypass gate for members |
mira — agent-flagged profile, channel member, no runtime |
HIDDEN |
HIDDEN |
SHOWN ✗ |
quinn — relay-only, allowlists the viewer, not a member |
HIDDEN |
SHOWN ✗ |
HIDDEN |
remote agent — directory-backed, respond_to: anyone, bot member |
SHOWN |
SHOWN |
SHOWN |
| locally managed agent |
SHOWN |
SHOWN |
SHOWN |
(mira and quinn are the existing fixtures behind "own profile-only agents
are hidden from channel mentions" and "relay-only agents stay hidden from
channel mentions even when allowlisted".)
Two rules satisfy all four rows:
- Gate on managed OR (in the directory and invocable by me and a
member of a channel I share); or
- require channel overlap in both branches of
relayAgentIsSharedWithUser —
its allowlist branch currently ignores channelIds entirely — and then gate on
the resulting mentionable set.
Either way, cause 1 has to be fixed first: with no 10100 record published, every
rule that keeps mira hidden also keeps the remote agent hidden. The client
change alone is a no-op.
I read #2149 as deliberate rather than accidental — it is solving real clutter
from stale and duplicate agent identities using the only liveness signal
available at the time ("does this machine run it"). Publishing the directory
record supplies a better signal, so the filter can keep its intent without
excluding remote agents.
Happy to open a PR for either or both halves if you'd like — flagging first per
CONTRIBUTING.
Related but distinct: #1743 covers a resolved mention not being delivered to an
offline agent; this is a mention that cannot be resolved at all from another
device.
Describe the bug
A managed agent can only be
@mentionedfrom the machine that runs it. From anyother client on the same relay, the agent produces no autocomplete entry, so the
sent message carries no
ptag and the agent's harness never dispatches. Themessage lands in the channel as plain text and nothing happens.
There is no error and no UI signal that this is unsupported — the agent shows in
the member list, its kind:0 profile resolves, and it replies normally when
mentioned from its host machine. The failure is indistinguishable from a
misconfiguration, which makes it expensive to diagnose.
This blocks the "one shared agent on an always-on host" setup: today every person
has to run their own copy of every agent, producing duplicate identities with
duplicate display names.
Steps to reproduce
respond_totoanyone, and start it. Confirm it is abotmember of that channel.@mentionthe agent in that channel — it autocompletes and replies.@followed by the agent's name.no
ptag, and the agent never runs.Expected behavior
The agent appears in B's autocomplete and is mentionable, producing the same
p-tagged event that A produces.Version and platform
main)Logs / additional context
Two independent causes, either of which is sufficient on its own.
1. The desktop app never publishes the kind:10100 agent profile it reads back.
list_relay_agentsqueries{"kinds":[10100]}unfiltered, andagents_from_eventsparses the result intoRelayAgentInfo. But no code path indesktop/src-tauriever publishes a 10100 event — the only publisher in therepo is
buzz channels set-add-policyin the CLI, which writes onlychannel_add_policy. The relay does not synthesize one either;handle_agent_profilejust readschannel_add_policyoff it as a side effect.So
relayAgentsQuery.datais empty for any desktop-created agent, and the entirerelay-agent branch of
getMentionableAgentPubkeysis unreachable in practice.2.
isAgentIdentityInManagedListdrops every non-locally-managed agent.Added in a4dfead ("fix(desktop): prefer live agent mentions", #2149), the gate at
useMentions.tsaddCandidateruns beforeshouldHideAgentFromMentionsanddiscards any candidate with
isAgent === truewhose pubkey is not in thelocally managed set. A remote agent that is a
botchannel member enters viathe members loop with
isAgentset frommember.role === "bot"and is droppedthere.
First released in v0.4.20;
git diff v0.4.26 HEADonuseMentions.tsandagentAutocompleteEligibility.tsis empty, so currentmainbehaves the same.On a fix
I prototyped against the real eligibility functions. No single-signal change
works — each one either fails to unblock the remote agent or un-hides an identity
that your existing tests require to stay hidden:
swap gate to mentionablebypass gate for membersmira— agent-flagged profile, channel member, no runtimequinn— relay-only, allowlists the viewer, not a memberrespond_to: anyone, bot member(
miraandquinnare the existing fixtures behind "own profile-only agentsare hidden from channel mentions" and "relay-only agents stay hidden from
channel mentions even when allowlisted".)
Two rules satisfy all four rows:
member of a channel I share); or
relayAgentIsSharedWithUser—its allowlist branch currently ignores
channelIdsentirely — and then gate onthe resulting mentionable set.
Either way, cause 1 has to be fixed first: with no 10100 record published, every
rule that keeps
mirahidden also keeps the remote agent hidden. The clientchange alone is a no-op.
I read #2149 as deliberate rather than accidental — it is solving real clutter
from stale and duplicate agent identities using the only liveness signal
available at the time ("does this machine run it"). Publishing the directory
record supplies a better signal, so the filter can keep its intent without
excluding remote agents.
Happy to open a PR for either or both halves if you'd like — flagging first per
CONTRIBUTING.
Related but distinct: #1743 covers a resolved mention not being delivered to an
offline agent; this is a mention that cannot be resolved at all from another
device.