85311684d9
GET /settings returns the Telegram webhook secret masked as "***<last4>". The frontend binds that masked value into its state, and any Save ships it back — the PUT handler then persisted the mask as the new secret, silently invalidating HMAC for every webhook-mode bot. The next GET re-masks the mask to itself, so the UI showed no corruption. Treat incoming values that begin with "***" as "unchanged" for the webhook-secret field. Empty strings still pass through (explicit clear).