Skip to content

Bump buzz-core/buzz-sdk pin to 209536ade (post-v0.5.3) + client-side follow-ups - #2

Merged
sboily merged 6 commits into
mainfrom
bump-buzz-pin
Jul 31, 2026
Merged

Bump buzz-core/buzz-sdk pin to 209536ade (post-v0.5.3) + client-side follow-ups#2
sboily merged 6 commits into
mainfrom
bump-buzz-pin

Conversation

@sboily

@sboily sboily commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Summary

Bumps the buzz-core/buzz-sdk git pin from acfbb1bb (v0.4.23, 2026-07-22) to 209536ade (post-v0.5.3, 2026-07-31) — 255 upstream commits. The public API over this range is purely additive (310 → 329 items, nothing removed or re-signatured), the huddle Opus wire protocol is byte-identical (wire.rs / jitter.rs / playout.rs blob hashes unchanged on both client and relay sides), and the NIP-OA spec + nip_oa.rs are untouched.

Also lands the client-side work the bump enables:

  • NIP-38 user status: build_user_status_event + BuzzClient.set_status (kind 30315, d:general).
  • NIP-OA agent resolution: verify_auth_tag binding, buzzkit.agents.verify_agent_profile, and BuzzClient.resolve_agent — mirrors buzz-cli #3178 (owner-scoped kind-30177 lookup, exactly one cryptographically valid auth tag with applying conditions required to assert ownership).
  • Reconnect: BuzzClient.close_code surfaces the WebSocket close code so caller-owned reconnect loops can honour 1012 (relay graceful restart, upstream #3774).
  • __version__ now derives from package metadata (was hardcoded and had drifted).

Behavioural changes validated

Upstream change Impact here
Channel names canonicalized, empty rejected (#2250) start_huddle names are safe; new test pins '###dev'dev and empty → ValueError
Presence heartbeat 30s→60s, TTL 90s→180s (#3783) Cadence is caller-driven in buzzkit; docstring documents both contracts (30s is safe on both relay generations)
REQ page ceiling honestly 1000 (#3635) No caller exceeds it (list_channels 500, resolve_agent 1000, no pagination-as-exhaustion logic)
Relay sends close 1012 on graceful drain (#3774) Surfaced via close_code
kind:9000 role auth now bidirectional (00ecf2cac) build_join_channel_event is a plain self-join (role=bot on self); ⚠️ worth one live check against an upgraded relay before the next release

Also picked up for free: IPv6 SSRF hardening in buzz-core::network (#2801), the invite v2 module, kinds 30177/30178.

Checks

cargo fmt / clippy -D warnings / cargo test (10) / ruff check + format / ty / pytest (30 passed, 1 skipped live-relay) all green locally.

sboily added 5 commits July 31, 2026 16:19
v0.4.23 -> post-v0.5.3 (2026-07-31). The public API is purely additive
over this range; the huddle wire protocol and NIP-OA are byte-identical.
Notable behavioural changes upstream: channel names are canonicalized
(leading '#' stripped, empty rejected), presence contract moved to a 60s
heartbeat against a 180s relay TTL, and the relay REQ page ceiling is
now honestly advertised as 1000. Brings in the IPv6 SSRF hardening
(#2801), the invite module, build_user_status, and kind 30177/30178.
…e codes

Follows the upstream pin bump with the client-side work it enables:

- build_user_status_event / BuzzClient.set_status — kind 30315 on
  d:general; blank text with no emoji clears the status.
- verify_auth_tag binding + buzzkit.agents.verify_agent_profile +
  BuzzClient.resolve_agent — mirrors buzz-cli #3178: agent-by-name
  lookup scoped to the owner's kind-30177 records, each candidate
  profile requiring exactly one cryptographically valid NIP-OA auth
  tag (conditions applying) to assert ownership.
- BuzzClient.close_code — surfaces the WebSocket close code so callers
  owning the reconnect loop can honour 1012 (relay graceful restart).
- Presence docstring documents the new 60s/180s heartbeat contract
  (older relays: 30s/90s); a canonicalization test pins the new
  create-channel name behaviour ('#' stripped, empty rejected).
The hardcoded string had already drifted (0.1.3 vs pyproject's 0.1.4);
importlib.metadata makes pyproject.toml the single source of truth.
Exposes the remaining zero-I/O buzz-sdk builders an agent needs to be a
first-class channel citizen, each with a thin BuzzClient method:

- threaded replies: reply_to/reply_root on build_message_event and
  send_message (NIP-10 root/reply markers)
- react / remove_reaction (kinds 7 / 5) — e.g. acknowledge a request
- edit_message (kind 40003) — refine streamed replies in place
- delete_message (kind 9005 tombstone, optional room-facing reason)
- set_topic (kind 9002), leave_channel (kind 9022)

Reactions and edits post over the HTTP bridge; the NIP-29 management
kinds (9005/9002/9022) publish over the WebSocket like join_channel.
@sboily

sboily commented Jul 31, 2026

Copy link
Copy Markdown
Owner Author

Added two more commits while we're here:

  • feat: message lifecycle — threaded replies (reply_to/reply_root), react/remove_reaction (kinds 7/5), edit_message (40003), delete_message (9005 tombstone with optional room-facing reason), set_topic (9002), leave_channel (9022). All pure buzz-sdk builders + thin client methods; reactions/edits go over the HTTP bridge, NIP-29 management kinds over the WebSocket. 4 new offline tests (34 total).
  • chore: bump version to 0.2.0 — merge, then git tag v0.2.0 && git push origin v0.2.0 cuts the PyPI release.

@sboily
sboily merged commit 0a147af into main Jul 31, 2026
1 check passed
@sboily
sboily deleted the bump-buzz-pin branch July 31, 2026 20:34
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.

1 participant