Follow-up to #1806, which decoded the raw fields but left them
unfriendly to read:
- Detail sidepanel no longer falls through to a generic "Raw" row for
CONTROL packets -- proper Subtype/Filter/Tag/Since/SNR/Pubkey rows
with byte offsets, matching the ADVERT/TRACE field-table pattern.
- DISCOVER_REQ's filter byte is a per-type bitmask (firmware checks
`filter & (1 << ADV_TYPE_x)`); now rendered as type names
(Companion/Repeater/Room Server/Sensor) instead of raw hex.
- DISCOVER_RESP's node_type nibble gets the same human-readable label
(shares the ADV_TYPE_* enum already used for ADVERT roles).
- SNR converted from the wire int8 (value*4) to real dB, matching the
/4.0 conversion TRACE's snrValues already apply in both decoders.
- Responder pubkey (full 32B or 8B prefix) resolved to a clickable
node link in the detail panel via /api/nodes/{pubkey}, which already
handles prefix resolution server-side (#772); falls back to the
first 8 hex chars when unresolved. The packet-row preview (rendered
per-row, no live lookup) always shows the 8-hex-char form.
Frontend-only (public/packets.js) -- the ingestor's decodeControl()
already emits every field used here (#1806); this just makes the
existing data readable.