Fixed
- The OpenAPI contract now describes the webhook
filtersshape on all three DTOs —conditionswith its 1..20 bounds — instead of a bare object schema. Runtime validation is unchanged. GET /infra/confignow resolves each field with boot precedence — host env, then project.env, thendata/.env.generated— so Compose-setENGINE_TYPE/DATABASE_TYPE/REDIS_ENABLEDno longer read back as first-run defaults (#1313, #1082).
Security
- Status media is served as an inert download:
image/svg+xmlin any form becomesapplication/octet-streamwithContent-Disposition: attachment, matching the chat-media route. - Session credential directories (engine profiles, Baileys auth state) are created
0o700and re-tightened on every start. - Webhook HMAC secrets require 16+ characters when set (existing secrets keep working; re-saving a short one fails); ingress event payloads persist credential and signature headers redacted; delivery-failure errors redact host:port; the ingress reflections answer
text/plain. - ⚠️ Breaking (config). With
WEBHOOK_SSRF_PROTECT=false, deliveries no longer follow redirects — setWEBHOOK_SSRF_REDIRECTS=truefor a receiver behind a 3xx;SSRF_ALLOWED_HOSTSentries are now pinned to their resolved addresses (and must resolve at registration time). - ⚠️ Breaking (config). Plugin installs from a URL require a
#sha256=<64 hex>pin whenNODE_ENV=production(the compose default). Action required: catalog installs without a pin fragment now fail — pin the URL or setPLUGIN_INSTALL_REQUIRE_PIN=false; SECURITY.md documents the plugin trust model.
Added
- Weekly scheduled security scan (
security-scan.yml): re-runs the dependency audits and scans the publishedlatestimage on both architectures; also dispatchable on demand. - Client wire-shape gate (
check:contract-shapes, CI lint job): checks the JavaScript, Python, Go and Java clients' and the dashboard's wire types against the OpenAPI schemas, field by field — 113 pairs gated. Two Go wire bugs it surfaced are fixed:WebhookResponse.EventsandChatHistoryMessage.MentionedIdswere modelled as strings where the wire carries arrays.