Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
e2796d4
fix(desktop): virtualize channel member lists (#4991)
wesbillman Aug 6, 2026
38bf642
ci: prove the relay-driven mesh lifecycle — discover, join, infer, de…
michaelneale Aug 6, 2026
96ae141
fix(desktop): skip native notifications outside app bundles (#5004)
wesbillman Aug 6, 2026
19b41e9
fix(desktop): stop rate-limited reconnect backfill from tearing down …
wesbillman Aug 6, 2026
5babb97
feat(desktop): show selected community in rail (#5000)
wesbillman Aug 6, 2026
480c41e
Improve desktop mobile pairing flow (#5024)
klopez4212 Aug 6, 2026
9213090
test(desktop): await thread scroll anchor (#3174)
cameronhotchkies Aug 6, 2026
6ca9641
Refine agent runtime controls (#5026)
klopez4212 Aug 6, 2026
bd2fdf4
fix(buzz-agent): classify read timeouts distinctly in LLM error messa…
wpfleger96 Aug 6, 2026
6eb6591
feat(identity): recover desktop identity from a signed-in phone (#4845)
tellaho Aug 6, 2026
c777d4f
chore(hooks): run desktop typecheck in pre-push (#5110)
wpfleger96 Aug 6, 2026
b08c8b1
fix(desktop): prevent sidebar prefs from reverting on stale-localStor…
wpfleger96 Aug 6, 2026
1399ec1
Alert community owners and admins when a new key joins (#4900)
tlongwell-block Aug 6, 2026
67b7734
fix(desktop): next/back navigation during key creation onboarding (#4…
tellaho Aug 7, 2026
f03de21
fix(desktop): preserve authoritative agent avatars (#4984)
tellaho Aug 7, 2026
769ac70
fix(media): require authenticated reads (#4610)
jmecom Aug 7, 2026
af73813
Merge remote-tracking branch 'upstream/main' into upstream-sync-20260807
adrienlacombe Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,10 @@ BUZZ_S3_ADDRESSING_STYLE=path
# BUZZ_MEDIA_MAX_CONCURRENT_UPLOADS=8
# BUZZ_MEDIA_MAX_CONCURRENT_UPLOADS_PER_PUBKEY=2
# BUZZ_MEDIA_UPLOADS_PER_MINUTE=30
# Require Blossom t=get auth and relay membership for GET/HEAD /media/*.
# Keep off until desktop/mobile/CLI clients that attach media read auth are deployed.
# BUZZ_REQUIRE_MEDIA_GET_AUTH=false
# Legacy alias accepted by the relay while rollout docs catch up:
# BUZZ_REQUIRE_MEDIA_READ_AUTH=false
# GET/HEAD /media/* always require Blossom t=get auth and relay membership.
# BUZZ_REQUIRE_MEDIA_GET_AUTH and BUZZ_REQUIRE_MEDIA_READ_AUTH are no longer
# read; setting either (including to false) changes nothing and the relay warns
# about it at startup.

# -----------------------------------------------------------------------------
# Ephemeral Channels (TTL testing)
Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,19 @@ jobs:
env:
RELAY_URL: ws://localhost:3000
GIT_CREDENTIAL_NOSTR_BIN: ${{ github.workspace }}/target/ci/git-credential-nostr
- name: Media read-auth e2e
# Reads require kind:24242 `t=get` auth, so these binaries are the only
# coverage that a real relay rejects bare reads and honours host- and
# hash-scoped tokens. They were #[ignore]d and selected by no CI job, so
# the lane never ran; select it here, where MinIO and the seeded
# 'localhost:3000' community already exist.
# --no-fail-fast: without it cargo stops after the first failing binary,
# so one broken case hides every later binary's result.
run: |
cargo test -p buzz-test-client --no-fail-fast --test e2e_media --test e2e_media_extended --test e2e_media_video -- --ignored --nocapture
env:
RELAY_URL: ws://localhost:3000
RELAY_HTTP_URL: http://localhost:3000
- name: Upload relay logs
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
Expand Down
111 changes: 111 additions & 0 deletions .github/workflows/mesh-lifecycle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: Mesh Lifecycle
# Relay-driven mesh lifecycle smoke: membership → signed discovery notes →
# relay-derived allowlist → join → CPU inference over QUIC → stranger denied
# (relay membership rejection + no routed inference, with a differential
# trusted-inference health proof so a dead serve node can't fake a denial).
# Runs the full Buzz "shared compute" join story with three real mesh-llm
# node processes on one runner, using the Buzz relay as the control plane
# (no hand-carried invite tokens). Mirrors the shape mesh-llm's own CI uses
# for its two-node smokes (tiny CPU model, one runner, real QUIC mesh).

on:
push:
branches: [main]
paths:
- 'crates/buzz-relay/examples/mesh_*.rs'
- 'crates/buzz-relay/Cargo.toml'
- 'crates/buzz-admin/**'
- 'crates/buzz-test-client/**'
- 'crates/buzz-ws-client/**'
- 'Cargo.lock'
- 'desktop/src-tauri/src/mesh_llm/**'
- 'scripts/ci-mesh-lifecycle-smoke.sh'
- 'scripts/start-relay-for-tests.sh'
- '.github/workflows/mesh-lifecycle.yml'
pull_request:
paths:
- 'crates/buzz-relay/examples/mesh_*.rs'
- 'crates/buzz-relay/Cargo.toml'
- 'crates/buzz-admin/**'
- 'crates/buzz-test-client/**'
- 'crates/buzz-ws-client/**'
- 'Cargo.lock'
- 'desktop/src-tauri/src/mesh_llm/**'
- 'scripts/ci-mesh-lifecycle-smoke.sh'
- 'scripts/start-relay-for-tests.sh'
- '.github/workflows/mesh-lifecycle.yml'
workflow_dispatch:

concurrency:
group: mesh-lifecycle-${{ github.event_name == 'pull_request' && github.ref || github.sha }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

env:
CARGO_TERM_COLOR: always

jobs:
lifecycle-smoke:
name: Relay-Driven Mesh Lifecycle Smoke
runs-on: ubuntu-24.04
timeout-minutes: 45
permissions:
contents: read
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- uses: cashapp/activate-hermit@cea9af7913204a965fd488637a8d1811bba2e616 # v1

- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2
with:
save-if: ${{ github.event_name != 'pull_request' }}

# The mesh-llm SDK downloads a signed native runtime (llama.cpp CPU
# build) on first init, and the serve node downloads the smoke model
# from HuggingFace on first run. Key on the lockfile so a mesh pin bump
# rolls the runtime cache; the model ref is stable.
- name: Restore mesh runtime + model caches
id: mesh-caches
uses: actions/cache/restore@caa296126883cff596d87d8935842f9db880ef25 # v5
with:
path: |
~/.cache/mesh-llm/native-runtimes
~/.cache/huggingface/hub
key: mesh-lifecycle-${{ runner.os }}-smollm2-135m-${{ hashFiles('Cargo.lock') }}
restore-keys: |
mesh-lifecycle-${{ runner.os }}-smollm2-135m-

- name: Start integration services
run: |
for attempt in 1 2 3; do
if docker compose up -d postgres redis minio minio-init; then
break
fi
if [ "$attempt" -eq 3 ]; then
echo "docker compose up failed after 3 attempts" >&2
exit 1
fi
echo "docker compose up failed (attempt $attempt), retrying in $((attempt * 5))s..." >&2
sleep $((attempt * 5))
done

- name: Run relay-driven mesh lifecycle smoke
run: ./scripts/ci-mesh-lifecycle-smoke.sh 2>&1 | tee /tmp/mesh-lifecycle-harness.log

- name: Save mesh runtime + model caches
if: github.ref == 'refs/heads/main' && steps.mesh-caches.outputs.cache-hit != 'true'
uses: actions/cache/save@caa296126883cff596d87d8935842f9db880ef25 # v5
with:
path: |
~/.cache/mesh-llm/native-runtimes
~/.cache/huggingface/hub
key: mesh-lifecycle-${{ runner.os }}-smollm2-135m-${{ hashFiles('Cargo.lock') }}

- name: Upload relay + harness logs
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: mesh-lifecycle-logs
path: |
/tmp/buzz-relay.log
/tmp/mesh-lifecycle-harness.log
if-no-files-found: ignore
9 changes: 5 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -905,10 +905,11 @@ Run `just test` for integration tests if you touched `buzz-relay`,
formatting via `stage_fixed`. Pre-commit runs fix variants in parallel (Rust
fmt, Tauri Rust fmt, desktop biome fix, web biome fix, mobile dart format).
Auto-fixable issues are fixed and re-staged; unfixable lint issues block the
commit. **Pre-push hooks** run clippy (workspace + Tauri) and fast unit tests
in parallel (Rust, desktop JS, Tauri Rust, mobile Flutter) — no overlap with
pre-commit. Builds are CI-only. Run `just fix-all` to auto-fix all formatting
in one shot. Run `just ci` for the full local gate. Run `just hooks` to
commit. **Pre-push hooks** run clippy (workspace + Tauri), desktop TypeScript
typechecking (`tsc --noEmit`), and fast unit tests in parallel (Rust, desktop
JS, Tauri Rust, mobile Flutter) — no overlap with pre-commit. Builds are
CI-only. Run `just fix-all` to auto-fix all formatting in one shot. Run
`just ci` for the full local gate. Run `just hooks` to
re-install hooks after env changes. Before agents run Git or hooks, activate the
repo's Hermit environment (`. ./bin/activate-hermit`); do not rewrite hook
commands to compensate for an unconfigured shell `PATH`.
Expand Down
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,6 @@ out of the box with `just setup` or `just relay`. Common overrides:
| `REDIS_URL` | `redis://localhost:6379` | |
| `BUZZ_REQUIRE_AUTH_TOKEN` | `false` | When true, REST requires NIP-98 (no `X-Pubkey` fallback) |
| `BUZZ_REQUIRE_RELAY_MEMBERSHIP` | `false` | When true, only pubkeys in `relay_members` can connect |
| `BUZZ_REQUIRE_MEDIA_GET_AUTH` | `false` | When true, `GET`/`HEAD /media/*` require Blossom kind 24242 `t=get` auth plus relay membership. |
| `BUZZ_DRAIN_JITTER_MS` | `0` (off) | Per-connection upper bound, in ms, for the random delay before each live WebSocket gets its `1012 Service Restart` close on graceful shutdown. `0` closes every socket at once (the previous behavior). A positive value spreads closes uniformly over `[1, value]` ms to avoid a reconnect thundering herd on rolling deploys. Values above `20000` are capped to `20000` (`MAX_DRAIN_JITTER_MS`) to leave close-frame delivery headroom under the relay's 30s hard-drain timeout. Empty or whitespace-only is treated as unset (off); a non-integer fails startup loudly. |
| `BUZZ_AUDIT_ENABLED` | `true` | Tamper-evident event/media audit log. Set `false`/`0`/`off` to skip its DB pool and writes. Does not disable the separate moderation audit trail. |
| `BUZZ_AUTO_MIGRATE` | `false` | Opt in with `true`/`1`/`yes`/`on` to run embedded SQLx migrations on relay startup |
Expand Down
Loading
Loading