@@ -57,9 +57,50 @@ The following routes always remain public so the operator can recover:
5757
5858### Added
5959
60+ #### Manager v2 — completely redesigned dashboard
61+
62+ The embedded manager (served at ` /manager ` ) was rebuilt from the ground up
63+ on ** Tailwind v4** + the new ** ` @evoapi/design-system ` ** , using the same
64+ visual language as the rest of the Evolution Foundation product line.
65+ Every screen was refactored — no surface remains untouched.
66+
67+ Highlights:
68+
69+ - ** Modern dashboard** with skeleton loading, illustrated empty state,
70+ and a typed-name confirmation modal for instance deletion (no more
71+ accidental clicks).
72+ - ** Dual-provider support** : the manager now talks to either
73+ ` evolution-api ` or ` evolution-go ` (selected at login, persisted in
74+ localStorage). When connected to a GO backend, the sidebar/router
75+ automatically hide the modules GO does not implement.
76+ - ** Sessions panels** for the seven chatbot integrations (OpenAI, Dify,
77+ N8N, EvoAI, EvolutionBot, Flowise, Typebot) gained advanced filters
78+ (name / number / status / time presets + custom),
79+ bulk-status-change actions, client-side pagination, and a real
80+ send-message modal calling ` /message/sendText ` .
81+ - ** License-aware login** — see the * Licensing* section below for the
82+ details.
83+ - ** 🧪 Test Interactive** modal on each instance card — a 5-tab
84+ payload editor (Reply / CTA / PIX / List / Carousel) for
85+ smoke-testing the new interactive-message endpoints from the
86+ dashboard. Replaces the legacy stand-alone ` test-interactive.js `
87+ vanilla script that used to be injected into ` index.html ` .
88+ - ** Full i18n coverage** in ** pt-BR / en-US / es-ES / fr-FR** — every
89+ screen, every toast, every modal.
90+ - ** Branding refresh** — sidebar/footer/login point to
91+ ` docs.evolutionfoundation.com.br ` , GitHub links to
92+ ` evolution-foundation/evolution-manager-v2 ` , contact to
93+ ` suporte@evofoundation.com.br ` .
94+
95+ The new bundle is shipped pre-built under ` manager/dist/ ` . The manager
96+ source repository moved to ` evolution-foundation/evolution-manager-v2 `
97+ (private) — the previous in-repo submodule was dropped.
98+
99+ #### Licensing
60100- ** Licensing module** under ` src/licensing/ ` — RuntimeContext, gate middleware,
61101 signed/unsigned HTTP transport, hardware-based instance ID, fire-and-forget
62- heartbeat (every 30 min), graceful shutdown deactivation.
102+ heartbeat (every 30 min), graceful shutdown deactivation. Mirrors the
103+ evolution-go ` pkg/core/ ` reference implementation.
63104- ** Public license endpoints** :
64105 - ` GET /license/status ` — current activation state and (masked) api_key
65106 - ` GET /license/register?redirect_uri= ` — initiates registration on the
@@ -77,6 +118,97 @@ The following routes always remain public so the operator can recover:
77118 ` /manager/license/callback?code=... ` and finalises activation. The new
78119 manager bundle is included under ` manager/dist/ ` .
79120
121+ #### Interactive Messages (Buttons / List / CTA / PIX / Carousel)
122+ - ** New endpoint ` POST /message/sendCarousel/{instance} ` ** — multi-card
123+ product carousel built on top of ` interactiveMessage ` + ` carouselMessage ` .
124+ Single-card-without-image falls back to ` nativeFlowMessage ` for iOS
125+ compatibility. New DTO ` SendCarouselDto ` , schema ` carouselMessageSchema ` .
126+ - ** Button rendering fixed on WhatsApp Web/Desktop/iOS/Android** — removed the
127+ ` viewOnceMessage ` wrapper that prevented buttons from rendering and started
128+ injecting the required `<biz ><interactive type =native_flow v =1 >
129+ <native_flow v=9 name=mixed/></interactive ></biz >` node into the
130+ ` relayMessage ` stanza via Baileys' official ` additionalNodes ` option.
131+ - ** List messages fixed on WhatsApp Web/Desktop** — switched to legacy
132+ ` listMessage ` with ` SINGLE_SELECT ` listType (the modern
133+ ` interactiveMessage + single_select ` format does not render on Web/Desktop)
134+ and added ` <biz><list type=product_list v=2/></biz> ` .
135+ - ** Interactive buttons via ` deviceSentMessage ` ** + corrected CTA limits
136+ (max 2 CTA buttons, no mixing with reply or PIX), aligning with the
137+ WhatsApp Business message contract.
138+ - ** PIX support** for interactive button messages (` payment_info ` button
139+ type — exactly 1 button, isolated).
140+ - ** Quoted product / Catalog ` orderMessage ` ** support — handles
141+ ` quotedMessage.productMessage ` and the catalog ` orderMessage ` shape,
142+ including ` getTypeMessage ` enrichment, deduplication cache for
143+ processed order IDs, and propagation through Chatwoot integration.
144+ - Manager UI: a ` 🧪 Test Interactive ` button on each instance card opens
145+ a modal with five tabs (Reply / CTA / PIX / List / Carousel) and an
146+ editable JSON payload — useful for smoke-testing every kind of
147+ interactive message without leaving the dashboard.
148+
149+ #### History Sync
150+ - ** New event ` messaging-history.set ` ** emitted on sync completion, with
151+ cumulative counts (chats, contacts, messages, isLatest, progress).
152+ Allows downstream consumers to know exactly when a history sync has
153+ finished and how much was imported.
154+ - Cumulative counters reset on a new sync start to avoid carry-over
155+ between consecutive syncs.
156+
157+ #### Other
158+ - ** New endpoint ` POST /chat/markMessageAsPlayed/{instance} ` ** — emits the
159+ audio "played" receipt (PTT/VOICE), completing the read/delivered/played
160+ triplet for voice messages.
161+ - ** SQS integration** now accepts a custom ` base_url ` (useful for
162+ LocalStack and corporate VPC endpoints).
163+ - ** LID → phone-number mapping and caching** — translates the new
164+ ` @lid ` identifiers WhatsApp uses for hidden-phone profiles into the
165+ real ` @s.whatsapp.net ` JID for downstream processing, with a cache
166+ to avoid redundant lookups.
167+
168+ #### Branding / Documentation
169+ - README, LICENSE, NOTICE, TRADEMARKS standardised under the
170+ ** Evolution Foundation 2026** identity.
171+ - All GitHub URLs migrated from ` EvolutionAPI ` to ` evolution-foundation ` .
172+ - New README section "License Activation" linking to
173+ < https://docs.evolutionfoundation.com.br/licensing > .
174+
175+ ### Fixed
176+
177+ - ** ` mentionsEveryOne ` honours ` false ` ** — earlier the flag was always
178+ applied regardless of value (#2470 ).
179+ - ** ` getLastMessage ` ** : corrected the Prisma JSON path filter so the
180+ query returns the actual last message (#2495 / #2515 ).
181+ - ** ` markMessageAsRead ` ** : corrected JID filter to cover all user types
182+ (regular, business, broadcast, group).
183+ - ** List messages** : removed destructive JSON cloning that triggered
184+ ` this.isZero ` when the message contained ` Long ` -typed fields (#2461 ).
185+ - ** History sync race condition** : completion event is now emitted
186+ * before* the contact upsert, so consumers don't observe the sync as
187+ finished while contacts are still being written (#2510 ).
188+ - ** Business API (Cloud)** : race condition in sender identification
189+ resolved (#2493 ); execution order normalised; ` chatwootIds `
190+ correctly propagated.
191+ - ** ` /instance/logout/{instance} ` ** — idempotent: returns SUCCESS instead
192+ of 400 when the instance is already closed, so the manager UI delete
193+ flow (logout-then-delete) does not surface a misleading error.
194+ - ** ` remove.instance ` event** — emitted even when logout itself fails,
195+ preventing zombie instances after a partially failed delete (#2520 ).
196+ - ** Chatbot session** : a closed session no longer blocks bot
197+ re-activation.
198+ - ** Docker compose** : fresh-install startup failures resolved.
199+ - ** WhatsApp chats** : ` accountLid ` handling, ` remoteJid ` normalisation
200+ and ` chatsRaw ` mapping cleaned up to avoid mismatched contact data
201+ on first connection.
202+ - ** Facebook ads** : ` externalAdReply ` context readability and fallback
203+ path for missing fields.
204+ - ** Networking** : added the ` --network-family-autoselection-attempt-timeout `
205+ flag in ` start:prod ` so IPv4/IPv6 races no longer hang the boot on
206+ hosts with broken IPv6.
207+ - ** Trailing slashes** on configuration URLs are now tolerated in all
208+ HTTP clients.
209+ - Verbose-log fix: undefined ` maxRetries ` reference inside the
210+ ` messages.update ` handler.
211+
80212### Notes
81213
82214- ` AUTHENTICATION_API_KEY ` keeps its original meaning (global API key for
@@ -107,6 +239,9 @@ The following routes always remain public so the operator can recover:
107239- ** ` Global API key not accepted by licensing server: invalid signature ` ** —
108240 your existing ` AUTHENTICATION_API_KEY ` is not a valid licensing key. Use
109241 the manager UI flow to obtain a new one.
242+ - ** Buttons/list not rendering on WhatsApp Web** — make sure you are on
243+ v2.4.0+; the ` <biz> ` stanza node and the legacy ` listMessage ` payload
244+ shipped with this release are required for cross-client rendering.
110245
111246---
112247
0 commit comments