Files
hermes-agent/plugins/platforms/buzz/plugin.yaml
T
Teknium 972f0314de feat(buzz): compose thread-topology cluster — reply_in_thread opt-out, NIP-10 root anchoring on all send paths, _PLATFORM_DEFAULTS tier
Compose/fix-up on top of the cherry-picked cluster commits:

- Unify the config surface: platforms.buzz.reply_to_mode: off (PlatformConfig
  field, as Discord/Telegram) and extra.reply_in_thread: false (the key Slack
  users know; env BUZZ_REPLY_IN_THREAD) are equivalent opt-outs, bridged
  through _apply_yaml_config and honored by send(), send_image(), and
  _standalone_send (cron delivery).
- Progress/status bubbles honor the opt-out too: gateway/run.py resolves
  _progress_reply_in_thread from the Buzz adapter (mirroring the Slack path)
  so the synthetic-thread fallback and the progress reply anchor are both
  suppressed when the user asked for flat replies (#75082, #95842).
- Deduplicate NIP-10 parsing: inbound session thread_id now reuses
  _extract_thread_root (marked root > reply > legacy positional e-tag)
  instead of a second inline root-marker-only scan.
- display_config: add buzz to _PLATFORM_DEFAULTS at TIER_MEDIUM — with
  edit_message now implemented, accumulate-style progress works, but without
  the entry Buzz inherited the verbose _GLOBAL_DEFAULTS and every interim
  update became a permanent channel post (#95841).
- plugin.yaml optional_env + platform docs for the new keys.
- contributors/emails mappings for the cherry-picked authors.
2026-08-31 07:30:44 -07:00

64 lines
2.7 KiB
YAML

name: buzz-platform
label: Buzz
kind: platform
version: 1.0.0
description: >
Buzz gateway adapter for Hermes Agent.
Connects to a Buzz community relay (Block's open-source human+agent
collaboration platform built on Nostr) and relays messages between
channels/DMs and the Hermes agent. Pure stdlib — shells out to the
buzz CLI binary (JSON in/out); no Python packages required.
author: Nous Research
# ``requires_env`` entries are surfaced in ``hermes config`` UI via the
# platform-plugin env var injector in ``hermes_cli/config.py``.
requires_env:
- name: BUZZ_RELAY_URL
description: "Base URL of the Buzz community relay (e.g. https://mycommunity.communities.buzz.xyz)"
prompt: "Buzz relay URL"
password: false
- name: BUZZ_PRIVATE_KEY
description: "Nostr private key for the agent's Buzz identity (nsec or hex) — the only Buzz secret"
prompt: "Nostr private key (nsec or hex)"
password: true
optional_env:
- name: BUZZ_TRANSPORT
description: "Inbound transport: auto (WebSocket w/ poll fallback, default), websocket, or poll"
prompt: "Transport (auto/websocket/poll)"
password: false
- name: BUZZ_AUTH_TAG
description: "Optional NIP-OA owner-attestation auth tag JSON for NIP-42 WebSocket auth"
prompt: "NIP-OA auth tag JSON (or empty)"
password: false
- name: BUZZ_CHANNELS
description: "Comma-separated channel UUIDs to watch (default: all joined channels)"
prompt: "Channel UUIDs (comma-separated)"
password: false
- name: BUZZ_HOME_CHANNEL
description: "Channel UUID for cron / notification delivery (defaults to the first watched channel)"
prompt: "Home channel UUID (or empty)"
password: false
- name: BUZZ_ALLOWED_USERS
description: "Comma-separated npubs or hex pubkeys allowed to talk to the agent"
prompt: "Allowed users (comma-separated)"
password: false
- name: BUZZ_ALLOW_ALL_USERS
description: "Allow any community member to talk to the agent (true/false)"
prompt: "Allow all users? (true/false)"
password: false
- name: BUZZ_POLL_INTERVAL
description: "Seconds between inbound poll sweeps (default: 4)"
prompt: "Poll interval seconds"
password: false
- name: BUZZ_CLI_PATH
description: "Path to the buzz CLI binary (default: 'buzz' on PATH, then ~/bin/buzz)"
prompt: "buzz CLI path (or empty)"
password: false
- name: BUZZ_CREDENTIALS_FILE
description: "JSON credentials file holding the nsec (fallback when BUZZ_PRIVATE_KEY is unset)"
prompt: "Credentials file path (or empty)"
password: false
- name: BUZZ_REPLY_IN_THREAD
description: "Thread replies under the triggering message (true/false, default: true); false posts flat to the channel timeline"
prompt: "Reply in thread? (true/false)"
password: false