Skip to content

fix(desktop): ingest remote-owned channel agents - #4964

Open
cmyk wants to merge 10 commits into
block:mainfrom
Peakhunter:fix/remote-owned-channel-agent-ingestion-current
Open

fix(desktop): ingest remote-owned channel agents#4964
cmyk wants to merge 10 commits into
block:mainfrom
Peakhunter:fix/remote-owned-channel-agent-ingestion-current

Conversation

@cmyk

@cmyk cmyk commented Aug 5, 2026

Copy link
Copy Markdown

What this fixes

Hermes supports Buzz through its documented integration option 3: the native Buzz Gateway platform. In that setup Hermes runs remotely as a normal Hermes Gateway — not as a process launched or managed by Buzz Desktop. This keeps Hermes's full tools, memory, sessions, skills, approvals, and cron behaviour while letting people talk to it from Buzz.

That remote architecture exposed a gap in Buzz Desktop. The Gateway identity could join a channel, exchange messages, and publish encrypted Activity, but Desktop primarily recognized agents from its local managed-agent list or relay directory. A remote-owned Gateway agent could therefore work in the channel while still being omitted from observer ingestion and its profile Channels section, and completed tray activity could fall back to Agent .

This PR is the Buzz Desktop part of the end-to-end integration. It discovers agent candidates from authoritative channel membership, but trusts them only when their relay profile says they are an agent and names the current Buzz user as owner. It then includes that verified remote-owned agent in Activity ingestion, profile channel projection, and tray-name hydration—without pretending that Desktop manages the remote Hermes process.

Hermes native Buzz Gateway (option 3)
  ├─ ordinary signed Buzz messages
  └─ encrypted owner-only Activity events
                    │
                    ▼
              Buzz relay
                    │
                    ▼
              Buzz Desktop
       Activity · profile Channels · tray Recent

Companion work

The complete path spans three components:

Related but not a dependency of this ingestion fix: merged #4913, allow shared agent mentions, supplies the channel-authorized @Hermes autocomplete/mention path used during live acceptance. The older competing mention implementation #4602 is superseded by #4913.

The native Gateway's broader messaging reliability work is tracked separately in Hermes PRs NousResearch/hermes-agent#74823 (newly joined channel discovery) and NousResearch/hermes-agent#75049 (active-thread mention policy). Those improve option-3 operation but are not code dependencies of this Desktop patch.

Summary

  • ingest observer events from remote-owned agents discovered through authoritative channel membership, while requiring an agent profile owned by the current user
  • batch and cache profile hydration so large member sets stay within relay query limits
  • show authoritative channel membership in remote-agent profiles and hydrate human-readable names in the macOS tray's Recent section
  • keep the native tray payload narrow by removing the agent pubkey after the frontend resolves the display label
  • cover ownership filtering, query chunking, channel projection, tray hydration, and the live profile flow with regression tests

Related Issue

N/A — no matching open issue found.

Before & After Screenshots

Before: a remote-owned channel agent could be absent from observer ingestion and its profile Channels section; completed tray activity could retain an Agent <pubkey> fallback.

After — remote-owned Hermes profile lists its authoritative channels:
Screenshot 2026-08-05 at 21 43 18 Remote-owned-agent ingestion:tray PR profile pane hermes channles

After — authoritative Channel Members shows the human owner and Hermes:
Screenshot 2026-08-05 at 21 47 01 Remote-owned-agent ingestion:tray PR Channel members

After — Hermes activity reaches the Activity pane and executes the terminal tool:
Screenshot 2026-08-05 at 22 07 11 Remote-owned-agent ingestion:tray PR activity

After — the channel receives the exact terminal result:
Screenshot 2026-08-05 at 22 14 41 Remote-owned-agent ingestion:tray PR channel response

After — the macOS menu-bar Recent section shows Hermes rather than a pubkey fallback:
Remote-owned-agent ingestion:tray PR Menu bar showing recent Hermes

Validation

Current-upstream candidate: a847f38886e9db0829470847ab593a39ddb87d33

  • pnpm --dir desktop test — 4,363 passed
  • pnpm --dir desktop typecheck
  • Biome check on all changed Desktop files
  • pnpm --dir desktop check:file-sizes
  • pnpm --dir desktop build:e2e
  • focused Playwright profile regression — 1 passed
  • git diff --check origin/main...HEAD
  • DCO trailers present on all five commits
  • added-line credential scan — clean

Manual UI acceptance used acceptance-only SHA 2508b4f3, which combined the then-current version of this patch with the separate mention-autocomplete candidate. The screenshots above exercise only this PR's remote-agent ingestion, profile, Activity, channel-response, and tray behavior. This candidate was rebased through current main at ccdaa161; its stable aggregate patch ID exactly matches the reviewed candidate, and upstream changed none of this patch's ten touched paths. After the docs-only rebase, the 21 focused unit tests, typecheck, Biome, file-size gate, diff check, and focused Playwright regression were rerun successfully.

Desktop Activity acceptance follow-up

Mac acceptance found and closed two downstream Desktop gaps in the remote-owned-agent path:

  • Observer-derived channel activity now reaches both the main-channel composer footer and an open-thread composer footer. Matching thread typing remains included, and pubkeys are deduplicated case-insensitively.
  • A trusted active external-agent pubkey now survives the Activity display-roster join when it is absent from local managed agents, relay descriptors, and channel members carrying the bot role. The fallback uses the already-hydrated verified profile for the public display name and pubkey.

This does not broaden agent eligibility or weaken ownership/observer trust gates: the roster fallback only supplies presentation metadata for pubkeys already present in the trusted working signal.

Public-safe acceptance evidence on the PR-head reconciliation:

  • focused Activity regression: 3/3 passed;
  • relevant channel/Activity tests: 288/288 passed;
  • full Desktop tests: 4,366/4,366 passed;
  • Biome and TypeScript typecheck passed;
  • the reconciled patch changes only ChannelPane.tsx, threadComposerActivity.ts, and ChannelPane.activity.test.mjs;
  • the helper and focused regression files are byte-identical to the Mac-tested source versions;
  • the accepted Peakhunter UI visibly showed the external agent Activity status beneath the composer before PR-head reconciliation.

@cmyk

cmyk commented Aug 6, 2026

Copy link
Copy Markdown
Author

Cross-component release coordination needed

This PR is independently reviewable, but the complete remote Hermes experience is release-coupled across Hermes, the Buzz relay, and Buzz Desktop:

User-visible capability Required change Current status
Mention an externally hosted Hermes agent #4913 included in the shipped Desktop build Merged; inclusion in the currently distributed 0.5.5 build is not identifiable from the version
Preserve owner authorization for direct-member Activity #4616 deployed on the relay Open
Emit native remote-turn Activity NousResearch/hermes-agent#80217 Open
Render remote Activity, profile Channels, and tray identity This PR, #4964 Open
Discover channels joined after Gateway startup NousResearch/hermes-agent#74823 Open
Apply thread-aware mention policy NousResearch/hermes-agent#75049 Open

These are mostly not source-level merge dependencies: each change can be reviewed and merged independently. They are, however, end-to-end release dependencies. A user cannot verify the complete feature until compatible revisions are shipped together.

Could maintainers please help establish a coordinated acceptance target by confirming:

  1. the exact Desktop build commit that contains merged fix(desktop): allow shared agent mentions #4913;
  2. review/merge disposition for relay fix(auth): preserve NIP-OA owner for direct members #4616 and Desktop fix(desktop): ingest remote-owned channel agents #4964;
  3. when fix(auth): preserve NIP-OA owner for direct members #4616 reaches the hosted relay;
  4. the first uniquely identifiable Desktop build containing fix(desktop): allow shared agent mentions #4913 and, once merged, fix(desktop): ingest remote-owned channel agents #4964;
  5. an end-to-end hosted-service acceptance run after those deployments.

The PR description already documents the architecture and contains UI evidence from the integrated acceptance candidate. What is missing now is release provenance and coordinated rollout, not another implementation branch.

@cmyk

cmyk commented Aug 11, 2026

Copy link
Copy Markdown
Author

@thomaspblock Does this have a chance to get reviewed?

cmyk and others added 10 commits August 14, 2026 16:31
Signed-off-by: Schrödinger’s Cat <62413+cmyk@users.noreply.github.com>
(cherry picked from commit 0aa87f1)
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
(cherry picked from commit faf16b9)
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
(cherry picked from commit 4055c02)
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
(cherry picked from commit 47b0608)
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
(cherry picked from commit a847f38)
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Schrödinger’s Cat <62413+cmyk@users.noreply.github.com>
(cherry picked from commit e03db9c)
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Schrödinger’s Cat <62413+cmyk@users.noreply.github.com>
(cherry picked from commit 1eb220c)
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
Signed-off-by: Reinhold <310554180+reinhold-ph@users.noreply.github.com>
@reinhold-ph
reinhold-ph force-pushed the fix/remote-owned-channel-agent-ingestion-current branch from 56b1ec4 to aaed72c Compare August 14, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants