Serializable wire representation of a config field for API consumers
(RPC dispatch, gateway, TUI). Single source of truth — replaces the
gateway’s local ListEntry and the RPC dispatch’s ad-hoc JSON.
One row emitted by the Configurable derive’s integration_descriptor()
method on structs annotated with #[integration(...)]. Used for nested
toggleable configs (e.g. BrowserConfig, CronConfig) where the
integration is “active” iff a named bool field on the struct is true.
One row emitted by the Configurable derive’s nested_option_entries()
method — every #[nested] Option<XConfig> field on a struct shows up here
with its present bit and the per-field #[display_name = "..."] /
#[description = "..."] metadata. The integrations registry consumes
this verbatim instead of carrying its own per-field hand-list.
Tab grouping for config fields and UI surfaces. Each variant maps to a
tab in the TUI and gateway dashboard. Serializes to its PascalCase
variant name on the wire.
Stable wire-form for an addable section — a HashMap<String, T> (Map) or
Vec<T> (List) field whose value type implements Configurable. The
dashboard / CLI use this to surface + Add affordances without
hardcoding the section list. Auto-discovered by the Configurable derive.
Sentinel rendered for unset / None / empty config values during display.
Never a valid stored value: the write path rejects it so it cannot round-trip
into persisted config.
Per-field secret operations the Configurable derive emits for every
#[secret] field. Generalizes mask / restore / encrypt / decrypt / is_set
across the supported shapes — String, Option<String>, Vec<String>,
HashMap<String, String>, and Option<HashMap<String, String>> — so adding
a new shape is a single trait impl rather than a fourth branch in the macro.