Added
- Sessions (Baileys): pre-connection chat history is now persisted. On a fresh link Baileys pushes the recent (and, with
BAILEYS_SYNC_FULL_HISTORY=true, full) message history viamessaging-history.set; these batches are now mapped and saved into the messages table for the chat view, so a newly linked session shows past conversations instead of an empty panel. The batches are de-duplicated and stamped with each message's real timestamp, and are persisted only (no webhook/hook/websocket dispatch, since they predate the live session). Sender push-names from the history are also harvested so chats show names rather than bare ids, and each chat's last-message preview and sort time are seeded from the history so the chat list no longer reads "No messages yet". - Sessions (Baileys): chat display names are now backfilled on connect. Baileys 6.7.x frequently skips the initial app-state sync (the state machine goes Online before it runs when the first history notification is non-processable) and the
PUSH_NAMEsync can fail to decrypt, so chats showed bare ids/numbers. On connection open the adapter now fetches group subjects viagroupFetchAllParticipatingand re-triggers an app-state resync (best-effort) to recover saved contact names; both are non-fatal and complement the push-names that arrive on live messages. - Webhooks: an opt-in
WEBHOOK_CONTACT_DETAILSflag enriches themessage.receivedpayload's sendercontactobject with the free, already-cached WhatsApp contact fields —id,number,shortName,type,isMyContact,isWAContact,isBusiness,isEnterprise,verifiedName,verifiedLevel,isBlocked, andlabels(IDs) — alongside the existingname/pushName. Off by default (the payload keeps the minimalname/pushName). All fields are read synchronously from the contact already fetched per message, so no extra WhatsApp API calls are made (profile picture and about/status are intentionally excluded to avoid rate-limit/ban risk).
Fixed
- Sessions (Baileys): when a session is logged out — unlinked from the phone or via the API — the now-invalid on-disk auth state is cleared, so re-linking shows a fresh QR instead of getting stuck silently reloading the dead credentials. (#453 — thanks @ulises2k)
- Webhooks: registering a webhook (
POST /sessions/:id/webhooks) to a host whose DNS lookup rejects (NXDOMAIN, or a transientEAI_AGAIN/ESERVFAILunder resolver pressure) now returns400 Could not resolve host: <host> (<code>)instead of a generic500 Internal server error. The SSRF guard's DNS deadline already mapped resolution timeouts and empty results to a 4xx; a rejected lookup leaked the raw DNS error, which surfaced as an intermittent 500 during back-to-back session-create → webhook-register flows. - Infrastructure: the dashboard config form no longer shows Server, Webhook, and Rate-Limit sections that were never persisted — they returned a fake "saved" while silently discarding every value. The form now exposes only the settings it actually writes (Database, Redis/Queue, Storage, Engine); the removed settings remain configurable via environment variables.
- Infrastructure: data export/import (the documented backup and SQLite↔PostgreSQL migration flow) is now complete. It previously exported and restored only sessions, webhooks, messages, and message batches — so a restore silently lost all message templates and stored Baileys messages (cascade-deleted with the old sessions and never re-imported) and dropped every webhook's filters, causing a filtered webhook to come back firing on all events. Templates, stored Baileys messages, and webhook filters now round-trip intact.
- Engine selection: pinning the engine from the environment works again after the v0.7.1 compose change. The bundled compose files forward
ENGINE_TYPEinto the container again (- ENGINE_TYPE=${ENGINE_TYPE:-}) and the app treats a blank value as unset, so an.env/hostENGINE_TYPE=baileysis honoured while the dashboard's Infrastructure > Engine selection still wins when no engine is pinned..env.exampleno longer shipsENGINE_TYPEpre-pinned. Upgrade note: if you relied onENGINE_TYPE=baileysin your.env, confirm the active engine after upgrading. (#453 — thanks @ulises2k)
Security
- Infrastructure: configuration values saved from the dashboard are now rejected if they contain a line break, which could otherwise write an extra
KEY=valueline intodata/.env.generatedand inject an arbitrary environment variable on the next boot.