Map the discovered device id to an AdapterConfig and add it via the
manager (which persists it). Returns the new adapter id. Throws if the device is
unknown — the same end state as hand-editing config/adapters.yaml.
The current device set (for discovery.list).
Run one scan pass (for discovery.scan), resolving only once the pass is COMPLETE.
DiscoveryProvider.start() is fire-and-forget by contract, so awaiting it proved
nothing: the caller replied to discovery.scan from the pre-scan device set, which
on the first click is empty — the whole scan (800ms passive + up to 5s active per
NIC on the real REAC provider) was still running. The click looked like a no-op, and
the second click returned what the first had since found.
Providers that can run one deterministic pass expose an awaitable AwaitableScanProvider.scan beyond the base contract (import('./reac-discovery.js').ReacDiscoveryProvider does); we await it when present
and fall back to start() otherwise, so a provider without one still works — it just
cannot promise a complete set on return.
Optionalopts: DiscoveryOptionsBegin scanning (idempotent). Listeners are already bound at construction.
Optionalopts: DiscoveryOptionsStop scanning and detach listeners (idempotent).
Where discovery could not look, and why — shipped alongside list in every
discovery.list reply.
Without this the controller narrowed the provider's knowledge down to a device array on its way to the wire, so "the REAC probe has no CAP_NET_RAW" and "the network is empty" left here as the same message.
Bridges a DiscoveryProvider to the AdapterManager + the server.