Onlyne v1 wire protocol (decisions D3, D4, D8, D9, D10, D11, D16).
Pure data: every type here is serde-only, so the protocol travels into the server, the client, the gateway plugins, and the machine-readable schema export from one definition. This crate holds tokio, a database, and a transport in none of its code paths.
Layers, bottom up:
- [
envelope]: the unified message (§3). Text plus at most one inline image. - [
frame]: the multiplexed request/response/event wrapper (§4) and the closed [frame::ErrorCode] set. - [
event]: the observation plane (§9), at-most-once with cursor resync. - [
ops]: the client-to-server and admin vocabularies (§6, §8). - [
adapter]: the one adapter protocol mounted on both sides (§7).
Compatibility posture: [PROTOCOL_VERSION] is checked at handshake and a
mismatch answers [frame::ErrorCode::ProtocolVersion]. Legacy layouts and
legacy databases are refused at startup by the binaries that load them.
Frame typing
[Frame<R = ClientOp>] is the single wrapper for client, admin, and gateway surfaces.
[AdminFrame] and [GatewayFrame] provide typed aliases for the admin and gateway vocabularies.
All three surfaces use the same JSON layout with f, id, op, and args fields.
Cross-vocabulary decoding fails by design and keeps each socket vocabulary closed.