zenkey-fleet 0.9.0

Fleet engine for keyspace-v2 Zenoh tooling: disciplined fan-in queries, liveliness roster, registry-slice sets, schema-aware decode, live key-tree monitoring — the shared core of zenctl and zengui
Documentation

zenkey-fleet

The fleet engine for keyspace-v2 Zenoh tooling — the shared core of the zenctl and zengui explorers:

  • query — the RFC 05 §2.1 fan-in discipline (fleet_get: target All, consolidation None, attribution by the reply's own key), in exactly one place. Answers carry zenoh's refcounted ZBytes — no per-reply copies.
  • registrySliceSet: registry slices from the live bus (introspect fan-in) or local registry/*.toml dirs, one type either way, with precedence-correct subject refinement (shared zenkey::pattern matcher) and an on-disk cache.
  • decode (feature decode, default) — the RFC 08 §7 pipeline: SchemaStore lazily fetches each producer's served describe schema set, decode_sample turns wire bytes into named-field JSON with honest structural fallback; encoding resolution is sample > registry > sniff. decode-protobuf adds dynamic protobuf via the served FileDescriptorSet, decode-cdr adds XCDR1 (DDS / ROS 2) against a served cdr field list.
  • body (feature decode) — the other direction: prepare_publish / prepare_request turn a typed body into the bytes that actually ship, encoded against the served schema and labelled with the declared Encoding. Encode resolution is declared > registry > the schema kind's native encoding (never a sniff of the operator's text). A body that could not be encoded is reported as such — BodySource distinguishes encoded, as-typed, and raw, so no caller can ship an unencoded payload silently.
  • write — the only two ways an explorer writes: Publication (a declared publisher with the closed QoS enum applied — send, and since #115 retire, the RFC 04 §1.2 tombstone; there is deliberately no bare-put and no bare-delete helper) and call, the disciplined RPC. check_retire is the class guard: state keys pass, everything else prices the operator act (--i-know), wildcards refuse outright.
  • subMonitor: subscription multiplexing + liveliness watching (with history(true) — the roster arrives on join) into a bounded broadcast of events. Overflow surfaces as an explicit Dropped(n); render loops pull the immutable KeyTreeSnapshot on the stats tick, so a hot bus cannot melt a UI.
  • stats / tree — per-key rate/byte counters (EWMA, SourceInfo gap counting) and the chunk-grouped snapshot they build.
  • roster / admin — the liveliness roster and raw @/** admin-space access.

Sessions opened here are deliberately un-namespaced (RFC 09 §5): an explorer sees the wire as it really is. Do not "fix" that.