GUI、CLI、C FFI 与 UniFFI 宿主契约¶
依赖:client_runtime.md、shared.md。宿主负责稳定数据位置、用户动作和事件呈现,不复制 SDK 状态机。
pub trait ClientHost: Send + Sync {
fn local_store_location(
&self,
actor: &AuthenticatedActor,
) -> Result<LocalStoreLocation, ClientHostError>;
fn create_runtime(
&self,
location: LocalStoreLocation,
) -> Result<Box<dyn ClientRuntime>, ClientHostError>;
async fn connect_after_user_action(
&self,
runtime: &dyn ClientRuntime,
request: ConnectRequest,
) -> Result<(), ClientHostError>;
async fn present(
&self,
event: ClientEvent,
) -> Result<(), ClientHostError>;
}
pub trait BindingEventStream: Send + Sync {
async fn next_exported_event(
&self,
) -> Result<Option<ClientEvent>, ClientHostError>;
}
前置条件¶
- 生产宿主必须按 endpoint、tenant、user 隔离
Persistent本地库;内存库只能在显式测试配置下请求。 - 建立网络连接必须源自用户登录或显式重连动作,不得在界面挂载时用默认身份自动连接。
- 绑定层只能从
BindingEventStream逐项读取 SDK 事件,不能重新解析同步帧或维护第二套 pending、游标、未读逻辑。
后置条件¶
- GUI/CLI 在 runtime 创建后通过
connect_after_user_action调用ClientRuntime::connect;路径稳定性使关闭重开可恢复本地状态。 - 创建群在收到
MembersUpdated或明确失败事件前仅显示 pending;未支持能力返回UnsupportedCapability或明确禁用,禁止产生本地伪成功。 - C FFI、UniFFI 与 Tauri 对批量 SDK 事件逐项导出,不得只保留首项。宿主按
ClientEvent终态更新 UI,并呈现连接、重置和顶号状态。
错误¶
- 无法提供稳定路径时返回
StablePathUnavailable或PersistentStoreRequired,不得静默回退内存库。 EventExportFailed必须保留未导出事件的可恢复顺序,禁止丢弃批次。