Saxonberg Server API
    Preparing search index...

    Type Alias RosterFrame

    RosterFrame:
        | { action: "add"; handle: string; kind: "roster"; row: RosterRow }
        | { action: "remove"; handle: string; kind: "roster" }
        | { action: "snapshot"; kind: "roster"; rows: RosterRow[] }

    Payload of a world.social.roster frame (mirrors the server PresenceApi.RosterFrame). Rides the ordinary MessageFrame channel (empty body, structured payload). The client routes by action: snapshot replaces the whole roster, add upserts one row by handle, remove deletes by handle. A full snapshot arrives automatically on connect/reconnect — there is no request RPC.