DatabaseMerger
Folds the contents of one device database (source) into another (dest) when both turn out to belong to the same physical node reached over different transports (BLE / TCP / USB). Called once, by DatabaseManager.associateNode, the first time a secondary transport learns a myNodeNum that another transport already claimed.
Every per-device table is unified so switching transport is seamless: messages (+FTS), reactions, contact mute/read settings, nodes and their notes, per-node metadata, the audit log (each session's received-packet history — the source of the telemetry timelines, position history, and traceroute results the UI reconstructs), traceroute positions, and discovery sessions. Where the same row exists on both sides the destination is preferred (it will be refreshed by the same radio's re-dump on connect); source-only rows and strictly newer history are brought over. Packets/reactions in source and dest already share the same myNodeNum (same node), so no key remapping is needed there; autoincrement-keyed rows (packets, discovery) are re-inserted with fresh ids to avoid collisions.