feat(mobile): per-user device bindings, multi-user Inbox routing, and admin-mediated authorization
- Device→user bindings persisted in config table (auth.rs), loaded at plugin start - RelayApp now routes Inbox responses per-user via UserChannelApi, never globally - New mobile_bind_device LLM tool for admin-mediated device→user assignment - Per-user event forwarders (events.rs) with per-user debounced notifiers - Config listener (auth::config_listener) refreshes bindings cache reactively - Reconcile loop catches users who unlock after boot - Hello/Logout treated as device-registry ops (no user resolution needed) - Unbound device payloads are silently dropped - RelayAgent::authorize_client → bind_device (atomic bind + authorize) - Approval rules seed mobile_bind_device/revoke_device as require
This commit is contained in:
@@ -22,6 +22,7 @@ use tokio::sync::broadcast;
|
||||
use crate::approval::ApprovalApi;
|
||||
use crate::chat_hub::ChatHubApi;
|
||||
use crate::events::GlobalEvent;
|
||||
use crate::inbox::InboxApi;
|
||||
|
||||
/// Resolves an unlocked user's channel handle.
|
||||
///
|
||||
@@ -51,6 +52,12 @@ pub trait UserChannelHandle: Send + Sync {
|
||||
/// The user's approval manager — resolve pending tool-call approvals.
|
||||
fn approval(&self) -> Arc<dyn ApprovalApi>;
|
||||
|
||||
/// The user's Inbox — the unified view over pending approvals,
|
||||
/// clarifications and MCP elicitations. Channel adapters that bridge the
|
||||
/// whole Inbox (e.g. the mobile connector) use this instead of wiring
|
||||
/// `approval()`/clarification/elicitation separately.
|
||||
fn inbox(&self) -> Arc<dyn InboxApi>;
|
||||
|
||||
/// Subscribe to the user's server→client event stream.
|
||||
/// Events are scoped to this user; no cross-user leakage.
|
||||
fn subscribe(&self) -> broadcast::Receiver<GlobalEvent>;
|
||||
|
||||
Reference in New Issue
Block a user