fix(desktop): fetch join policies through native networking - #2862
Conversation
45113e5 to
238526f
Compare
There was a problem hiding this comment.
🤖 hey @johnmatthewtennant — I like the direction here, native networking is clearly the right escape hatch for a CORS-restricted relay, and the redirect refusal + credential rejection are nice hardening on top. Two things I'd want changed before this goes in, plus a few smaller notes inline.
Blocking, both left as inline comments:
- the native command buffers the whole response body from an arbitrary user-entered relay (
response.json()) transportdefaults to"webview"— the broken path is the default a new caller gets
Non-blocking notes:
desktop/src/shared/api/invites.test.mjs still only exercises the webview branch (every getJoinPolicy call in it omits the transport arg). Worth one native-transport case that pins the command name fetch_join_policy, the relayUrl arg shape, and the mapping — the two branches aren't symmetric (webview unwraps raw.policy, native returns the already-unwrapped policy), and right now nothing on the TS side locks that down.
The reported bug still reproduces for invite-URL joins against the same relay, since getJoinPolicy on the invite path, acceptJoinPolicy, and claimInvite all stay on webview fetch. I get why (the description says as much) — could you file a follow-up issue and link it here so the remaining half doesn't get lost?
Nothing here looks wrong to me on the parts I didn't comment on: 404/non-success/malformed-JSON semantics match the old flow, and I ran the URL builder against .. traversal, %2F-encoded segments, IPv6 hosts, uppercase schemes, and bare ws:///foo — all either rejected or normalized sanely.
wpfleger96
left a comment
There was a problem hiding this comment.
🤖 Rechecked the review fixes at exact head 29b65c86e5a3013641be51277d812081a64c7422. The native response now has declared-length and streamed byte caps with both oversize cases tested; transport is required and explicit at every caller; the native TypeScript contract test is in place; stale route mocks are gone; the description is scoped to direct URL joins; and the remaining invite-path CORS work is linked as #2872. I don’t see any remaining blocker.
55ec210 to
aeb63dd
Compare
aeb63dd to
ac3f052
Compare
* origin/main: (70 commits) feat(relay): make Postgres pool size configurable, default 50 (#3191) Publish symbol-bearing debug relay images (#3250) feat(tracing): add datastore tracing plumbing (#2760) fix(buzz-acp): accept id-keyed config options when resolving model switch (#2795) fix(desktop): probe legacy Goose install dir on Windows (#3248) refactor(desktop): extract install command execution into install_exec (#3251) Polish composer activity layout and transitions (#3151) feat(invites): add use-limited invite links (#3141) fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0 floor (#3218) fix(desktop): preserve thread anchor through layout reflow (#3212) feat(search): parse from:/in:/after:/before: and pass them in the filter (#2871) fix(desktop): fetch join policies through native networking (#2862) fix(desktop): republish agent identity records when a persona rename propagates (#2607) fix(desktop): keep project Inbox previews compact (#3193) Inbox refactor (#2045) Fix composer selection formatting and drop overlay (#3172) Refine pending message status (#3153) feat(admin): show reported message content in report detail (#3149) fix(desktop): recover full local storage on startup (#3182) Replace mobile reconnect banners with skeleton shimmer (#3143) ... Co-authored-by: Tyler Longwell <tlongwell@block.xyz> Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
## Buzz Desktop release v0.5.0 ### Changes since v0.4.26: - feat(invites): add use-limited invite links ([#3141](#3141)) ([`d500c2d5c`](d500c2d)) - fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0 floor ([#3218](#3218)) ([`98a7b1334`](98a7b13)) - fix(desktop): preserve thread anchor through layout reflow ([#3212](#3212)) ([`9810d8545`](9810d85)) - feat(search): parse from:/in:/after:/before: and pass them in the filter ([#2871](#2871)) ([`cb2a265b5`](cb2a265)) - fix(desktop): fetch join policies through native networking ([#2862](#2862)) ([`0019f8076`](0019f80)) - fix(desktop): republish agent identity records when a persona rename propagates ([#2607](#2607)) ([`7ca0bbd94`](7ca0bbd)) - fix(desktop): keep project Inbox previews compact ([#3193](#3193)) ([`de1396050`](de13960)) - Inbox refactor ([#2045](#2045)) ([`2bd4c24b7`](2bd4c24)) - Fix composer selection formatting and drop overlay ([#3172](#3172)) ([`99da5b7eb`](99da5b7)) - Refine pending message status ([#3153](#3153)) ([`75588eaff`](75588ea)) - fix(desktop): recover full local storage on startup ([#3182](#3182)) ([`174c38e4b`](174c38e)) - fix(desktop): keep collapsed table separators out of spoilers ([#3169](#3169)) ([`4d8b676bb`](4d8b676)) - feat(desktop): redesign agent runtime settings ([#3093](#3093)) ([`d98da7389`](d98da73)) - fix(desktop): use forward slashes for git credential.helper on Windows ([#3023](#3023)) ([`899531684`](8995316)) - chore(desktop): add AgentCreationPreview file-size override to unblock main CI ([#3154](#3154)) ([`b92a1f4bf`](b92a1f4)) - fix(desktop): make the test loader work on Windows ([#2758](#2758)) ([`8bb43d519`](8bb43d5)) - fix(desktop): make lint and unit-test gates work on Windows ([#2943](#2943)) ([`545bb46b8`](545bb46)) - feat(desktop): add search to agent emoji picker ([#2630](#2630)) ([`313f793c8`](313f793)) - fix(desktop): keep identity key help dialog readable in dark mode ([#2854](#2854)) ([`be275cfc6`](be275cf)) - feat(acp): title agent sessions from the agent and channel name ([#3028](#3028)) ([`f2fe3b63c`](f2fe3b6)) - feat(git): use agent display name as git author name ([#3040](#3040)) ([`18eef633d`](18eef63)) - fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote DoS) ([#3135](#3135)) ([`31e2de196`](31e2de1)) - fix(desktop): read the newest pair-scoped harness log ([#3134](#3134)) ([`654f38490`](654f384)) - feat(desktop): handle project work from Inbox ([#3117](#3117)) ([`c5c4f390b`](c5c4f39)) - fix(desktop): clarify identity key button when key exists ([#2357](#2357)) ([`87b3fcd3c`](87b3fcd)) - Restore Goose and Buzz Agent to onboarding harness selection ([#2731](#2731)) ([`7fc0cc82d`](7fc0cc8)) - fix(desktop): render rich project work item content ([#3100](#3100)) ([`afb272bb7`](afb272b)) - feat(acp): bring your own harness (BYOH) — generic ACP runtime seam + settings gallery ([#2773](#2773)) ([`95fdf9788`](95fdf97)) - feat(desktop): use collective mesh routing for Auto ([#2825](#2825)) ([`16d4ec335`](16d4ec3)) - fix(desktop): strip legacy baked team instructions from stored prompts ([#3035](#3035)) ([`aee631448`](aee6314)) - feat(agents): lower default agent parallelism from 24 to 10 ([#3038](#3038)) ([`5d8ede446`](5d8ede4)) - Polish community rail and mobile pairing ([#2972](#2972)) ([`e6c90bb7c`](e6c90bb)) - fix(desktop): remove bundled libsystemd from AppImage ([#2353](#2353)) ([`a31fc4d2f`](a31fc4d)) - fix(desktop): make agent definition authoritative for model/provider/prompt ([#1968](#1968)) ([`8c0e8cb16`](8c0e8cb)) - chore(desktop): delete dead persona catalog UI cluster ([#2886](#2886)) ([`8e67cf399`](8e67cf3)) - fix(desktop): surface install failures hidden by curl-pipe exit codes ([#2892](#2892)) ([`166c6655e`](166c665)) - Refactor managed-agent runtime into cohesive modules ([#2974](#2974)) ([`74b63e184`](74b63e1)) - fix(desktop): make Linux AppImage GStreamer work on non-Debian distros ([#2176](#2176)) ([`cc6c4d347`](cc6c4d3)) - refactor(desktop): remove Agent directory section from Agents page ([#2290](#2290)) ([`5d1233e84`](5d1233e)) - fix(desktop): enable arboard Wayland backend so Linux copies reach the Wayland clipboard ([#2904](#2904)) ([`ab7aa8b12`](ab7aa8b)) - fix(desktop): supervise and re-arm relay-mesh runtime ([#2823](#2823)) ([`aa51dab9d`](aa51dab)) - fix(agents): run live Databricks discovery instead of the fallback list ([#2890](#2890)) ([`8eb6e3eb6`](8eb6e3e)) - fix(desktop): retire prepend mode on every reader wheel ([#2913](#2913)) ([`07d0265cf`](07d0265)) - fix(desktop): consolidate prepend scroll correction ([#2855](#2855)) ([`25e7864b3`](25e7864)) - fix(desktop): track concurrent agent turns up to the harness maximum ([#2882](#2882)) ([`20bff5910`](20bff59)) - fix(relay): preserve reconnect backoff ([#2759](#2759)) ([`499c5d349`](499c5d3)) - refactor(relay): expose reconnect timing policy ([#2310](#2310)) ([`2f0041595`](2f00415)) - fix(desktop): clear stale working badges on agent stop/restart ([#2803](#2803)) ([`a64cc71f6`](a64cc71)) - fix(desktop): surface agent rename relay profile sync failure as a warning toast ([#2279](#2279)) ([`5e3d2e484`](5e3d2e4)) - fix(discovery): inject PATH into Codex adapter planning ([#2767](#2767)) ([`6ab3835f3`](6ab3835)) **To release:** merge this PR. The tag and build will happen automatically. Signed-off-by: Wes <wesbillman@users.noreply.github.com>
…y-to-env * origin/main: (22 commits) Polish mobile message and search layouts (block#3121) Add mobile message image galleries (block#3312) chore(release): release Buzz Desktop version 0.5.0 (block#3213) feat(relay): make Postgres pool size configurable, default 50 (block#3191) Publish symbol-bearing debug relay images (block#3250) feat(tracing): add datastore tracing plumbing (block#2760) fix(buzz-acp): accept id-keyed config options when resolving model switch (block#2795) fix(desktop): probe legacy Goose install dir on Windows (block#3248) refactor(desktop): extract install command execution into install_exec (block#3251) Polish composer activity layout and transitions (block#3151) feat(invites): add use-limited invite links (block#3141) fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0 floor (block#3218) fix(desktop): preserve thread anchor through layout reflow (block#3212) feat(search): parse from:/in:/after:/before: and pass them in the filter (block#2871) fix(desktop): fetch join policies through native networking (block#2862) fix(desktop): republish agent identity records when a persona rename propagates (block#2607) fix(desktop): keep project Inbox previews compact (block#3193) Inbox refactor (block#2045) Fix composer selection formatting and drop overlay (block#3172) Refine pending message status (block#3153) ... Signed-off-by: npub1x4hk035p3p9q39a3fcrd2fe30lpkrhr5dwe0cqzzjphxyyh8m0gsq4vqap <356f67c681884a0897b14e06d527317fc361dc746bb2fc0042906e6212e7dbd1@buzz.block.builderlab.xyz> Co-authored-by: npub1x4hk035p3p9q39a3fcrd2fe30lpkrhr5dwe0cqzzjphxyyh8m0gsq4vqap <356f67c681884a0897b14e06d527317fc361dc746bb2fc0042906e6212e7dbd1@buzz.block.builderlab.xyz>
## Context Adding an existing community by relay URL could fail with `Community rejected: Load failed` even when its WebSocket endpoint was reachable. The Add Community flow fetched `/api/join-policy` from the WebView, so a relay without a matching CORS allowance blocked the policy request before the app could join it. ## Summary This bug fix fetches join policies through Tauri's native networking layer for direct URL joins. Invite-code discovery, policy acceptance, and signed invite claims remain on the WebView path so those operations can migrate together later. ## Changes - Uses native networking for Add Community and first-community direct URL join-policy requests. - Validates relay schemes, rejects URLs containing credentials, and refuses redirects. - Bounds declared and chunked native responses before JSON parsing. - Preserves existing `404`, non-success status, malformed JSON, and absent-policy behavior. - Requires every join-policy caller to choose its transport explicitly. Public relays using Buzz's default permissive CORS configuration are not known to be affected. ### Related issue Related to block#2872. ### Testing #### Reviewer-reproducible examples End-to-end red/green requires a relay with restrictive CORS and a Buzz identity authorized to join it. ##### Red: `main` From a clean checkout of `main`: ```bash . ./bin/activate-hermit just staging ``` In Buzz Desktop: 1. Add another community so the restrictive-CORS relay can be removed. 2. Remove that relay. 3. Open Add Community and enter the relay's WebSocket URL. 4. Select Add Community. Observed result: ```text Community rejected: Load failed ``` ##### Green: this PR From a clean checkout of this branch: ```bash . ./bin/activate-hermit just staging ``` Repeat the same steps above. Observed result: ```text The community rejoins successfully. ``` Supporting checks: - Six native join-policy tests, including oversized declared and chunked responses. - Four TypeScript API tests, including the native command contract. - E2E build and four focused onboarding and sidebar Playwright tests. - Full `just ci` and pre-push suites. - Builderbot, Kalvin, and minimize-diff review fanout found no actionable issues after the final rebase.
## Buzz Desktop release v0.5.0 ### Changes since v0.4.26: - feat(invites): add use-limited invite links ([block#3141](block#3141)) ([`d500c2d5c`](block@d500c2d)) - fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0 floor ([block#3218](block#3218)) ([`98a7b1334`](block@98a7b13)) - fix(desktop): preserve thread anchor through layout reflow ([block#3212](block#3212)) ([`9810d8545`](block@9810d85)) - feat(search): parse from:/in:/after:/before: and pass them in the filter ([block#2871](block#2871)) ([`cb2a265b5`](block@cb2a265)) - fix(desktop): fetch join policies through native networking ([block#2862](block#2862)) ([`0019f8076`](block@0019f80)) - fix(desktop): republish agent identity records when a persona rename propagates ([block#2607](block#2607)) ([`7ca0bbd94`](block@7ca0bbd)) - fix(desktop): keep project Inbox previews compact ([block#3193](block#3193)) ([`de1396050`](block@de13960)) - Inbox refactor ([block#2045](block#2045)) ([`2bd4c24b7`](block@2bd4c24)) - Fix composer selection formatting and drop overlay ([block#3172](block#3172)) ([`99da5b7eb`](block@99da5b7)) - Refine pending message status ([block#3153](block#3153)) ([`75588eaff`](block@75588ea)) - fix(desktop): recover full local storage on startup ([block#3182](block#3182)) ([`174c38e4b`](block@174c38e)) - fix(desktop): keep collapsed table separators out of spoilers ([block#3169](block#3169)) ([`4d8b676bb`](block@4d8b676)) - feat(desktop): redesign agent runtime settings ([block#3093](block#3093)) ([`d98da7389`](block@d98da73)) - fix(desktop): use forward slashes for git credential.helper on Windows ([block#3023](block#3023)) ([`899531684`](block@8995316)) - chore(desktop): add AgentCreationPreview file-size override to unblock main CI ([block#3154](block#3154)) ([`b92a1f4bf`](block@b92a1f4)) - fix(desktop): make the test loader work on Windows ([block#2758](block#2758)) ([`8bb43d519`](block@8bb43d5)) - fix(desktop): make lint and unit-test gates work on Windows ([block#2943](block#2943)) ([`545bb46b8`](block@545bb46)) - feat(desktop): add search to agent emoji picker ([block#2630](block#2630)) ([`313f793c8`](block@313f793)) - fix(desktop): keep identity key help dialog readable in dark mode ([block#2854](block#2854)) ([`be275cfc6`](block@be275cf)) - feat(acp): title agent sessions from the agent and channel name ([block#3028](block#3028)) ([`f2fe3b63c`](block@f2fe3b6)) - feat(git): use agent display name as git author name ([block#3040](block#3040)) ([`18eef633d`](block@18eef63)) - fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote DoS) ([block#3135](block#3135)) ([`31e2de196`](block@31e2de1)) - fix(desktop): read the newest pair-scoped harness log ([block#3134](block#3134)) ([`654f38490`](block@654f384)) - feat(desktop): handle project work from Inbox ([block#3117](block#3117)) ([`c5c4f390b`](block@c5c4f39)) - fix(desktop): clarify identity key button when key exists ([block#2357](block#2357)) ([`87b3fcd3c`](block@87b3fcd)) - Restore Goose and Buzz Agent to onboarding harness selection ([block#2731](block#2731)) ([`7fc0cc82d`](block@7fc0cc8)) - fix(desktop): render rich project work item content ([block#3100](block#3100)) ([`afb272bb7`](block@afb272b)) - feat(acp): bring your own harness (BYOH) — generic ACP runtime seam + settings gallery ([block#2773](block#2773)) ([`95fdf9788`](block@95fdf97)) - feat(desktop): use collective mesh routing for Auto ([block#2825](block#2825)) ([`16d4ec335`](block@16d4ec3)) - fix(desktop): strip legacy baked team instructions from stored prompts ([block#3035](block#3035)) ([`aee631448`](block@aee6314)) - feat(agents): lower default agent parallelism from 24 to 10 ([block#3038](block#3038)) ([`5d8ede446`](block@5d8ede4)) - Polish community rail and mobile pairing ([block#2972](block#2972)) ([`e6c90bb7c`](block@e6c90bb)) - fix(desktop): remove bundled libsystemd from AppImage ([block#2353](block#2353)) ([`a31fc4d2f`](block@a31fc4d)) - fix(desktop): make agent definition authoritative for model/provider/prompt ([block#1968](block#1968)) ([`8c0e8cb16`](block@8c0e8cb)) - chore(desktop): delete dead persona catalog UI cluster ([block#2886](block#2886)) ([`8e67cf399`](block@8e67cf3)) - fix(desktop): surface install failures hidden by curl-pipe exit codes ([block#2892](block#2892)) ([`166c6655e`](block@166c665)) - Refactor managed-agent runtime into cohesive modules ([block#2974](block#2974)) ([`74b63e184`](block@74b63e1)) - fix(desktop): make Linux AppImage GStreamer work on non-Debian distros ([block#2176](block#2176)) ([`cc6c4d347`](block@cc6c4d3)) - refactor(desktop): remove Agent directory section from Agents page ([block#2290](block#2290)) ([`5d1233e84`](block@5d1233e)) - fix(desktop): enable arboard Wayland backend so Linux copies reach the Wayland clipboard ([block#2904](block#2904)) ([`ab7aa8b12`](block@ab7aa8b)) - fix(desktop): supervise and re-arm relay-mesh runtime ([block#2823](block#2823)) ([`aa51dab9d`](block@aa51dab)) - fix(agents): run live Databricks discovery instead of the fallback list ([block#2890](block#2890)) ([`8eb6e3eb6`](block@8eb6e3e)) - fix(desktop): retire prepend mode on every reader wheel ([block#2913](block#2913)) ([`07d0265cf`](block@07d0265)) - fix(desktop): consolidate prepend scroll correction ([block#2855](block#2855)) ([`25e7864b3`](block@25e7864)) - fix(desktop): track concurrent agent turns up to the harness maximum ([block#2882](block#2882)) ([`20bff5910`](block@20bff59)) - fix(relay): preserve reconnect backoff ([block#2759](block#2759)) ([`499c5d349`](block@499c5d3)) - refactor(relay): expose reconnect timing policy ([block#2310](block#2310)) ([`2f0041595`](block@2f00415)) - fix(desktop): clear stale working badges on agent stop/restart ([block#2803](block#2803)) ([`a64cc71f6`](block@a64cc71)) - fix(desktop): surface agent rename relay profile sync failure as a warning toast ([block#2279](block#2279)) ([`5e3d2e484`](block@5e3d2e4)) - fix(discovery): inject PATH into Codex adapter planning ([block#2767](block#2767)) ([`6ab3835f3`](block@6ab3835)) **To release:** merge this PR. The tag and build will happen automatically. Signed-off-by: Wes <wesbillman@users.noreply.github.com>
학교가 자기 릴레이를 돌린다는 전제와, 앱이 그 릴레이로 들어가는 길을 안내하지 않는다는 사실 사이의 간극을 닫는 설계다. 조사에서 범위가 크게 줄었다. 릴레이 주소로 붙는 경로는 이미 동작한다 — canSubmit이 normalizedRelayUrl만으로 참이고 startConnection이 그대로 연결한다. 없는 것은 기능이 아니라 문이다. 진짜 문제는 이름표다. 정답인 두 칸이 전부 「초대받은 사람/구성원」으로 이름 붙어 있어 자기 릴레이를 띄운 사람은 둘 다 지나치고, 그가 자연스럽게 고르는 두 문은 둘 다 Builderlab으로 나간다. 병합 비용이 설계를 정했다. WelcomeSetup.tsx는 SchoolX가 건드린 적 없는 upstream 원본인데 upstream이 계속 고친다(block#2738, block#2862). 그래서 새 UI는 SchoolX 소유 파일에 두고 저쪽에는 렌더 줄만 남긴다. 계획서 점검에서 셋을 정정했다: DialogHeader는 존재하지 않고, HostedCommunityOnboarding에는 onConnect가 없으며, 막힌 그 다이얼로그는 WelcomeSetup:321이 띄우는 것이라 upstream 파일 하나로 끝난다. Signed-off-by: Dev_YongT <devyongt@gmail.com>
연결 경로를 새로 만들지 않는다. 릴레이 주소만으로 붙는 것은 이미 InviteRedeemForm이 한다 — canSubmit이 normalizedRelayUrl만으로 참이고 startConnection이 그대로 연결한다. 없던 것은 그 경로로 가는 문이다. 문구를 「소유자/구성원」이 아니라 「릴레이를 직접 운영하는가」로 가른다. 기존에 그 경로에 닿는 두 선택지가 「초대로 참여」와 「나는 구성원이다」로 이름 붙어 있어, 자기 릴레이를 막 띄운 사람은 자신을 그렇게 부르지 않으므로 둘 다 지나치고 호스팅 로그인으로 가는 문을 고른다. "초대 코드가 필요 없습니다"가 핵심 문장이다. 초대는 owner/admin만 발행할 수 있어 새 릴레이에는 부탁할 사람이 없고, 필요하다고 믿는 것 자체가 막다른 길이다. 별도 파일에 두는 이유는 병합 표면이다. 호출부 WelcomeSetup.tsx는 SchoolX가 건드린 적 없는 upstream 원본인데 upstream이 계속 고친다(block#2738, block#2862). 상태와 마크업을 전부 여기 두면 저쪽에는 렌더 줄만 남는다. i18n 키는 새 네임스페이스가 아니라 기존 app 아래에 넣었다 — 새로 만들면 en·ko·APP_I18N_NAMESPACES를 한 번에 바꿔야 하고 빠뜨리면 fallback이 구제하지 못한다(세션 C 사실 1번). Signed-off-by: Dev_YongT <devyongt@gmail.com>
## Buzz Desktop release v0.5.0 ### Changes since v0.4.26: - feat(invites): add use-limited invite links ([#3141](block/buzz#3141)) ([`a1a21319c`](block/buzz@a1a2131)) - fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0 floor ([#3218](block/buzz#3218)) ([`c1cc8d9d1`](block/buzz@c1cc8d9)) - fix(desktop): preserve thread anchor through layout reflow ([#3212](block/buzz#3212)) ([`c3e816140`](block/buzz@c3e8161)) - feat(search): parse from:/in:/after:/before: and pass them in the filter ([#2871](block/buzz#2871)) ([`f19d7bbf8`](block/buzz@f19d7bb)) - fix(desktop): fetch join policies through native networking ([#2862](block/buzz#2862)) ([`dfe141fd5`](block/buzz@dfe141f)) - fix(desktop): republish agent identity records when a persona rename propagates ([#2607](block/buzz#2607)) ([`d3b18b48c`](block/buzz@d3b18b4)) - fix(desktop): keep project Inbox previews compact ([#3193](block/buzz#3193)) ([`31663bffc`](block/buzz@31663bf)) - Inbox refactor ([#2045](block/buzz#2045)) ([`e5c883c25`](block/buzz@e5c883c)) - Fix composer selection formatting and drop overlay ([#3172](block/buzz#3172)) ([`9d46311fb`](block/buzz@9d46311)) - Refine pending message status ([#3153](block/buzz#3153)) ([`4f3794b0a`](block/buzz@4f3794b)) - fix(desktop): recover full local storage on startup ([#3182](block/buzz#3182)) ([`ffdaacefd`](block/buzz@ffdaace)) - fix(desktop): keep collapsed table separators out of spoilers ([#3169](block/buzz#3169)) ([`8c50f64a6`](block/buzz@8c50f64)) - feat(desktop): redesign agent runtime settings ([#3093](block/buzz#3093)) ([`293d57357`](block/buzz@293d573)) - fix(desktop): use forward slashes for git credential.helper on Windows ([#3023](block/buzz#3023)) ([`fa4a3190e`](block/buzz@fa4a319)) - chore(desktop): add AgentCreationPreview file-size override to unblock main CI ([#3154](block/buzz#3154)) ([`cba753e4c`](block/buzz@cba753e)) - fix(desktop): make the test loader work on Windows ([#2758](block/buzz#2758)) ([`8c5c0b078`](block/buzz@8c5c0b0)) - fix(desktop): make lint and unit-test gates work on Windows ([#2943](block/buzz#2943)) ([`35391d5d9`](block/buzz@35391d5)) - feat(desktop): add search to agent emoji picker ([#2630](block/buzz#2630)) ([`cc560186a`](block/buzz@cc56018)) - fix(desktop): keep identity key help dialog readable in dark mode ([#2854](block/buzz#2854)) ([`329f2176c`](block/buzz@329f217)) - feat(acp): title agent sessions from the agent and channel name ([#3028](block/buzz#3028)) ([`f5b3743d9`](block/buzz@f5b3743)) - feat(git): use agent display name as git author name ([#3040](block/buzz#3040)) ([`11fdc3dea`](block/buzz@11fdc3d)) - fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote DoS) ([#3135](block/buzz#3135)) ([`79895680d`](block/buzz@7989568)) - fix(desktop): read the newest pair-scoped harness log ([#3134](block/buzz#3134)) ([`07bfb3139`](block/buzz@07bfb31)) - feat(desktop): handle project work from Inbox ([#3117](block/buzz#3117)) ([`068e33717`](block/buzz@068e337)) - fix(desktop): clarify identity key button when key exists ([#2357](block/buzz#2357)) ([`efc097d6a`](block/buzz@efc097d)) - Restore Goose and Buzz Agent to onboarding harness selection ([#2731](block/buzz#2731)) ([`1eb717304`](block/buzz@1eb7173)) - fix(desktop): render rich project work item content ([#3100](block/buzz#3100)) ([`a5e457d82`](block/buzz@a5e457d)) - feat(acp): bring your own harness (BYOH) — generic ACP runtime seam + settings gallery ([#2773](block/buzz#2773)) ([`84701fecc`](block/buzz@84701fe)) - feat(desktop): use collective mesh routing for Auto ([#2825](block/buzz#2825)) ([`6c0e93e1f`](block/buzz@6c0e93e)) - fix(desktop): strip legacy baked team instructions from stored prompts ([#3035](block/buzz#3035)) ([`02227d761`](block/buzz@02227d7)) - feat(agents): lower default agent parallelism from 24 to 10 ([#3038](block/buzz#3038)) ([`8baed7af9`](block/buzz@8baed7a)) - Polish community rail and mobile pairing ([#2972](block/buzz#2972)) ([`4c47d7af5`](block/buzz@4c47d7a)) - fix(desktop): remove bundled libsystemd from AppImage ([#2353](block/buzz#2353)) ([`05394d35c`](block/buzz@05394d3)) - fix(desktop): make agent definition authoritative for model/provider/prompt ([#1968](block/buzz#1968)) ([`50a3dd7c4`](block/buzz@50a3dd7)) - chore(desktop): delete dead persona catalog UI cluster ([#2886](block/buzz#2886)) ([`7575f8d1c`](block/buzz@7575f8d)) - fix(desktop): surface install failures hidden by curl-pipe exit codes ([#2892](block/buzz#2892)) ([`806feb9ed`](block/buzz@806feb9)) - Refactor managed-agent runtime into cohesive modules ([#2974](block/buzz#2974)) ([`b1a983734`](block/buzz@b1a9837)) - fix(desktop): make Linux AppImage GStreamer work on non-Debian distros ([#2176](block/buzz#2176)) ([`53e1752d3`](block/buzz@53e1752)) - refactor(desktop): remove Agent directory section from Agents page ([#2290](block/buzz#2290)) ([`f756b5828`](block/buzz@f756b58)) - fix(desktop): enable arboard Wayland backend so Linux copies reach the Wayland clipboard ([#2904](block/buzz#2904)) ([`3f2f3964e`](block/buzz@3f2f396)) - fix(desktop): supervise and re-arm relay-mesh runtime ([#2823](block/buzz#2823)) ([`c9607bd0f`](block/buzz@c9607bd)) - fix(agents): run live Databricks discovery instead of the fallback list ([#2890](block/buzz#2890)) ([`7d64ca7a8`](block/buzz@7d64ca7)) - fix(desktop): retire prepend mode on every reader wheel ([#2913](block/buzz#2913)) ([`dba1ba5ae`](block/buzz@dba1ba5)) - fix(desktop): consolidate prepend scroll correction ([#2855](block/buzz#2855)) ([`797933e4d`](block/buzz@797933e)) - fix(desktop): track concurrent agent turns up to the harness maximum ([#2882](block/buzz#2882)) ([`3115a39a0`](block/buzz@3115a39)) - fix(relay): preserve reconnect backoff ([#2759](block/buzz#2759)) ([`cd949e75a`](block/buzz@cd949e7)) - refactor(relay): expose reconnect timing policy ([#2310](block/buzz#2310)) ([`94c91f110`](block/buzz@94c91f1)) - fix(desktop): clear stale working badges on agent stop/restart ([#2803](block/buzz#2803)) ([`da2580e51`](block/buzz@da2580e)) - fix(desktop): surface agent rename relay profile sync failure as a warning toast ([#2279](block/buzz#2279)) ([`4d91195e9`](block/buzz@4d91195)) - fix(discovery): inject PATH into Codex adapter planning ([#2767](block/buzz#2767)) ([`795f2d12e`](block/buzz@795f2d1)) **To release:** merge this PR. The tag and build will happen automatically. Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Context
Adding an existing community by relay URL could fail with
Community rejected: Load failedeven when its WebSocket endpoint was reachable. The Add Community flow fetched/api/join-policyfrom the WebView, so a relay without a matching CORS allowance blocked the policy request before the app could join it.Summary
This bug fix fetches join policies through Tauri's native networking layer for direct URL joins. Invite-code discovery, policy acceptance, and signed invite claims remain on the WebView path so those operations can migrate together later.
Changes
404, non-success status, malformed JSON, and absent-policy behavior.Public relays using Buzz's default permissive CORS configuration are not known to be affected.
Related issue
Related to #2872.
Testing
Reviewer-reproducible examples
End-to-end red/green requires a relay with restrictive CORS and a Buzz identity authorized to join it.
Red:
mainFrom a clean checkout of
main:. ./bin/activate-hermit just stagingIn Buzz Desktop:
Observed result:
Green: this PR
From a clean checkout of this branch:
. ./bin/activate-hermit just stagingRepeat the same steps above.
Observed result:
Supporting checks:
just ciand pre-push suites.