+ Ships disabled; when enabled, defaults to dry-run / log-only — no mesh traffic
+ until you turn dry-run off. Requires Enable Notifications (above)
+ and environmental feeds to be on, since hazard events only flow when those are active.
+
+
+
+ {/* Status messages */}
+ {error && (
+
{error}
+ )}
+ {success && (
+
+ {success}
+
+ )}
+
+ {loading || !cfg ? (
+
Loading danger zones config...
+ ) : (
+ <>
+ upd({ enabled: v })}
+ helper="Master switch for the infrastructure danger-zone correlator"
+ />
+ upd({ dry_run: v })}
+ helper="When on, matches are logged but nothing is sent to the mesh. Turn off only after verifying dry-run output."
+ />
+
+ {/* Monitored roles */}
+
+ upd({ position_max_age_hours: v })}
+ min={1}
+ helper="Skip nodes whose last position is older than this"
+ />
+ upd({ default_buffer_mi: v })}
+ min={0}
+ step={0.5}
+ helper="Buffer used when a family has none set"
+ />
+ upd({ cooldown_minutes: v })}
+ min={0}
+ helper="Min time between repeat alerts per node+family"
+ />
+
+
+ {/* Per-family hazard config */}
+
+
+ {DZ_FAMILIES.map(meta => (
+ upd({ [meta.key]: c } as Partial)}
+ />
+ ))}
+
+
+ {/* Delivery */}
+
+
+
+ DELIVERY
+
+ upd({ delivery_type: v })}
+ options={DZ_DELIVERY_OPTIONS}
+ info="Where danger-zone alerts get delivered. Mesh DM unicasts to specific nodes; broadcast sends to a channel. Has no effect while dry-run is on."
+ />
+
+ {cfg.delivery_type === 'mesh_dm' && (
+ upd({ node_ids: v })}
+ helper="Nodes that receive direct messages"
+ valueType="node_id_hex"
+ />
+ )}
+
+ {cfg.delivery_type === 'mesh_broadcast' && (
+ upd({ broadcast_channel: v })}
+ helper="Select the mesh radio channel"
+ mode="single"
+ />
+ )}
+
+ {cfg.delivery_type === 'webhook' && (
+ upd({ webhook_url: v })}
+ placeholder="https://discord.com/api/webhooks/..."
+ helper="POST alert as JSON"
+ />
+ )}
+
+ {cfg.delivery_type === 'email' && (
+