v0.10.10
Added
-
Text statuses keep their posted look. The background color and font of a text status are now
captured on ingest (from the Baileys engine, which carries them on the wire) and rendered in the
dashboard viewer — colored bubble with white text and an approximated font family — instead of
every text story looking identical. The fields already existed on the API and SDKStatusRecord
shapes; whatsapp-web.js does not expose styling, so statuses from that engine render as before. -
New statuses now appear in the dashboard in real time. A freshly ingested contact status is
broadcast over the websocket asstatus.received(same payload as the webhook), and the Status
tab refreshes immediately instead of waiting for a focus refetch — including while a contact's
viewer is already open.
Changed
- Status font selection now follows the real WhatsApp font enum.
POST /sessions/:id/status/send-textaccepts the font indices that actually exist on the wire — 0
(default), 1, 2, 6 (system bold), 7, 8, 9, 10 — instead of a 0–5 range that included
non-existent indices 3–5 and rejected the valid 6–10. The dashboard viewer renders the full
enum (bold/script/serif/mono slots approximated with generic families), and the compose
dropdown offers the same set.
Fixed
-
Backup restores no longer drop group sender attribution. The data import now carries the
authorcolumn (the export already wrote it), so a backup→restore keeps each group message's
stable sender identity instead of collapsing attribution back to display names. -
Group messages now carry a stable sender identity, so same-named participants no longer blur
together. Group messages persist the participant JID (newauthorcolumn onmessages) next
to the sender's display name, and the dashboard keys attribution runs and sender colors on that
identity instead of the name — two participants who share a pushName now get separate runs in
distinct colors instead of collapsing into one misattributed thread. Live, history-backfilled,
and websocket-delivered messages all carry it; legacy rows fall back to name-keying. -
Contacts with both a @lid and a phone identity now appear once in the status list. Statuses
arriving under a contact's @lid are resolved to their phone at read time — including mappings
learned after the status arrived — so the same person no longer shows as two rows, and the
per-contact endpoint matches rows stored under either form. -
The status seed no longer downloads media the store would discard. Media downloads during the
connect-time backfill are pre-gated at the store's own 10 MB cap instead of the looser global
media cap, so an over-cap blob is marked omitted without ever being fetched. -
Status store hardening. A
@lidquery on the per-contact status endpoint now also matches
rows stored under the contact's phone (forward resolution, mirroring the reverse); lid
resolution is guarded to@lidinputs so a phone-shaped JID can never collide with a lid key;
media skipped by the seed's download pre-gate is recorded asover_caprather than
engine_omitted; and a status ingest that finishes after its session was deleted no longer
dispatchesstatus.receivedfor the retired session. -
History backfill no longer marks the account's own posts. Backfilled outgoing group messages
are stored withauthorNULL, keeping the column's "null on outgoing" contract the attribution
logic relies on. -
Dashboard follow-through. A websocket reconnect now also refreshes the statuses list (a
story posted during the gap previously stayed invisible until a window-focus refetch); the
webhook editor offersstatus.receivedas an explicit subscription; and a styled status
bubble's timestamp inherits the bubble's text color instead of staying muted gray.