Repository admins can create, update and delete webhook endpoints, send
a ping, list the last 50 deliveries with their attempts, and redeliver
one as a new delivery. Secrets are generated by the API, returned once
and stored AES-256-GCM encrypted for apps/delivery to open. URLs that
resolve to private or reserved addresses are refused when saved;
delivery checks again on every send.
OutboxService now also hands each event to WebhookFanoutService, which
freezes the JSON body and queues one job per subscribed endpoint, keyed
by event and endpoint so a retried event queues nothing twice.