* fix: load notification channels on mount in AlertsPanel
Channels only loaded when the Channels tab was visited, so opening Edit
Alert Rule before ever switching to that tab showed the channel picker
as empty even when channels existed.
(cherry picked from commit caed913ee91990a853f5a048849c67ed3f7c329e)
* fix: register login-alert route before auth middleware
Global JWT auth middleware ran before this internal
service-to-service route, rejecting it with 401 before
its own IP+token check ever ran — silently dropped every
SSH-login alert. Also surface non-OK responses instead of
swallowing them.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* test: add coverage for alert-notification fixes
Channel-load-on-mount, login-alert non-OK handling, and a
source-order guard for the route/auth-middleware regression.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* format AlertsPanel test with prettier
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Node's happy-eyeballs autoSelectFamily calls custom dns lookup functions
with all:true and expects the full address array back. Always replying
with a single (address, family) pair corrupted net's internal state,
surfacing as "Invalid IP address: undefined" instead of a real connect
error, breaking outbound notification delivery (webhook/ntfy).
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>