13 · Desktop、Web、Mobile 与 CLI
四类客户端共享 Relay 协议,但能力并不对称。Desktop 是完整的本地主权运行时;Web 是浏览器受限版;Mobile 聚焦通信、配对、媒体与 Push;CLI 是可脚本化、也最适合 Agent 调用的稳定表面。Admin Web 则单独承载社区运维。
1. 能力矩阵
| 表面 | 技术 | 强项 | 主要约束 |
|---|---|---|---|
| Desktop | Tauri 2 + React 19 + Rust | 密钥、本地文件/Git、Agent sidecar、语音/媒体、系统通知/更新 | native 后端复杂、跨 OS 差异 |
| Web | React 19 + Vite + isomorphic-git | 无安装访问、基础协作和浏览器 Git | 浏览器密钥/文件/进程权限受限 |
| Mobile | Flutter + Riverpod | 设备配对、相机/媒体、Push、移动通信 | Agent/本地开发工具能力有限 |
| CLI | Rust + Clap | JSON、stdin、自动化、Agent 可调用、Git/Repo 工具 | 体验偏脚本,需明确认证环境 |
| Admin Web | React + Vite | 社区成员、配置和运维表面 | 与普通用户 UI/权限分离 |
2. Desktop 双层架构
React frontend
├─ TanStack Router / Query
├─ channel/message/thread/DM/project UI
└─ Tauri invoke/events
│
▼
Tauri Rust backend
├─ keychain / identity / backup / pairing
├─ native WebSocket + event sync
├─ managed Agent/ACP/MCP processes
├─ local Git / terminal / repo paths
├─ media validation/transcode/download
├─ huddle audio/STT/TTS
├─ updater / deep link / notifications
└─ local migration / archive / secure store前端不直接获得私钥或任意 shell 权限,而是调用细粒度 Tauri commands。sidecar bundle 包含 buzz-acp、buzz-agent、buzz-dev-mcp、git-credential-nostr、buzz CLI。
3. Desktop 为什么复杂
desktop/src-tauri 的模块量甚至像第二个后端,因为它承担服务器不能替用户完成的工作:
- OS keyring 与加密 identity backup。
- Agent 进程发现、配置、恢复、日志、升级与团队快照。
- 本地 repo clone/branch/diff/push/terminal。
- 相机/媒体转码和本地文件导出。
- 实时音频、jitter buffer、STT/TTS、PTT 与防睡眠。
- 历史本地数据迁移到 Relay/新模型。
这让 Desktop 成为能力最强表面,也形成高耦合热点。命令接口、状态机和本地存储 schema 必须像服务端 API 一样治理。
4. Desktop 前端状态
React 侧用 TanStack Query 管服务器状态、Router 管页面、virtualization 管长消息列表,Tiptap/Markdown/Diff 组件渲染内容。Event sync 将 WebSocket 增量写入 query/cache;用户动作通过 Tauri 或 SDK 发布 event。
关键不是“React 组件树”,而是两种状态的分界:
- Relay 权威:频道成员、事件、workflow、repo metadata。
- 本地权威:私钥、repo path、Agent 进程、OS 权限、临时音频设备。
混淆两者会导致重启后错误恢复,或 UI cache 被误当权限依据。
5. Web
Web 与 Desktop 共享 React/TanStack/nostr-tools 的主要交互范式,但没有 Tauri native shell。它使用浏览器 storage、WebSocket/HTTP 和 isomorphic-git/LightningFS 覆盖可行的 Git 工作流。
不能把 Desktop command 在浏览器里简单 polyfill:密钥安全、shell、任意本地 repo、长期 Agent sidecar 和系统级音频处理都需要不同产品边界。
6. Mobile
Flutter 客户端使用 Riverpod/Hooks,依赖覆盖:
- Nostr/WebSocket/HTTP 与 secure storage。
- QR scanner、ECDH 相关 crypto,用于 NIP-AB pairing。
- image picker、camera、video、file selector、photo manager。
- badge、app links、share、open file。
- Markdown/code rendering。
Mobile 目录有独立测试和 iOS/Android release 脚本。README 把 mobile 标为“being wired up”,但代码体量显示它已不是占位;更准确的状态是主要交互已建设、发行与所有桌面能力对齐仍在推进。
7. CLI 是 Agent 的稳定 ABI
CLI 顶层命令覆盖 agents、messages、channels、canvas、reactions、emoji、DM、users、workflows、feed/social、notes、repos/protection、patch/PR/issues、upload/media、memory/pack、moderation。
重要工程特征:
- 默认输出 JSON,便于
jq、脚本和 LLM 工具解析。 - 统一错误类别与退出码,区分 user/auth/server。
- 支持 NIP-98 私钥签名与 token。
- 大正文支持 stdin,避开 shell interpolation。
- 参数类型在 Clap 层先校验 UUID/enum 等。
Agent prompt 中常被建议使用 buzz messages get 等命令补上下文,因此 CLI 命令稳定性直接影响 Agent 行为。
8. Admin Web
Admin Web 独立 package,避免把社区高权限操作混入普通客户端 bundle。它应只通过 admin scope/API 工作;前端隐藏按钮不是权限控制,Relay 仍执行 scope、role 与 tenant gate。
9. 跨端协议一致性
buzz-sdk、buzz-core 与 conformance tests 是 Rust 侧真相;TS/Dart 客户端需要对齐:
- kind 数值和 lifecycle。
- tag marker/coordinate 规范化。
- event ID 序列化与 Schnorr 签名。
- channel/DM privacy 预期。
- reconnect/since/EOSE 行为。
多语言复制常量是漂移风险,适合通过 fixtures、生成物或 conformance suite 缩短反馈。
10. 源码入口
desktop/package.json:前端技术栈与质量命令。desktop/src-tauri/tauri.conf.json:sidecars、bundle 与窗口配置。desktop/src-tauri/src/lib.rs:native runtime 接线。desktop/src/app/AppShell.tsx:前端 shell。web/package.json:Web 技术栈。mobile/pubspec.yaml:Flutter 能力面。crates/buzz-cli/src/lib.rs:完整命令树。crates/buzz-cli/TESTING.md:命令级 live test 契约。