v1.4.0
What's Changed
✨ New Features
- feat(coexist): keep synced history out of AI context by default by @viethung0o0 in #967
- feat(whatsapp): support usernames and business-scoped user ids by @viethung0o0 in #965
- feat(default-reply): enforce activation frequency per contact by @viethung0o0 in #984
- feat(builder): add 404 not-found page by @realcodesiman in #986
- feat(dynamic-images): add dynamic image template feature by @sung17 in #990
- feat: improve conversions api dataset setup and support variables in flow links by @viethung0o0 in #995
- feat(whatsapp): replace technical template inputs with product and date pickers by @viethung0o0 in #1008
- feat(permissions): rename contacts permission to contacts / inbox and gate all sidebar menus by @sung17 in #1011
- feat(flows): add date/datetime picker webview for get user data step by @viethung0o0 in #1009
- feat(flows): allow custom field variables in media step urls by @sung17 in #1013
- feat(channels): add generic API channel for custom integrations by @realcodesiman in #993
- feat(builder): replace zalo refresh-permissions with oauth reconnect by @sung17 in #1017
- feat(minigames): add Minigame tool with Jackpot management and gameplay by @sung17 in #1023
🐛 Bug Fixes
- fix(appointment-scheduling): fix bug worker handle step error by @nguyenvantruc92 in #966
- fix(auth): preserve and validate callbackURL through sign-in flows by @realcodesiman in #985
- fix(ci): remove invalid matrix context from release.yml job-level if by @realcodesiman in #987
- fix(contacts): stop prefetching inbox links from the contacts list by @viethung0o0 in #988
- fix(builder): render non-coupon variable mentions with their raw id by @nguyenvantruc92 in #991
- fix(variables): rewrite JS placeholders as property access, not spliced values by @realcodesiman in #992
- fix(tiktok): surface silent send failures and enforce TikTok's 40-char card title limit by @sung17 in #994
- fix(dynamic-images): make orphaned background cleanup best-effort by @sung17 in #996
- fix(ui): stop forcing command item icons to white by @realcodesiman in #998
- fix(ci): restore image publishing on merge to main and version tags by @realcodesiman in #999
- fix(flow): validate and coerce Execute JavaScript step values against custom field types by @realcodesiman in #997
- fix(i18n): add missing simplified chinese translations by @AlanSyue in #956
- fix(whatsapp): send quick reply templates and route button taps in flows by @viethung0o0 in #1006
- fix(meta): avoid duplicate logs for expected Graph API errors by @AlanSyue in #869
- fix(zalo): stop duplicating inbox-sent messages and handle postback/receipt webhooks by @sung17 in #1012
- fix(builder): use absolute link for google sheets manage button by @viethung0o0 in #1015
- fix(comment-automation): send private reply flows on instagram channels by @sung17 in #1018
- fix(zalo): surface real OAuth errors and harden daily token refresh by @sung17 in #1019
- fix(auth): white-label sign-in — root-tenant SSO fallback and per-credential OAuth origins by @realcodesiman in #1022
- fix(appointment): fix appointment handle booking page picker by @nguyenvantruc92 in #1024
- fix(builder): make zodBigintAsString test mocks fully chainable by @sung17 in #1025
- fix(webchat): fail closed when no authorized domains are configured by @realcodesiman in #1026
- fix(minigames): show live jackpot machine preview in type picker by @sung17 in #1027
🔧 Internal / Chore
- ci: split the quality gate into parallel jobs and cut test import cost by @realcodesiman in #964
- chore(utils): reorder CHANNEL_CAPABILITIES by product priority by @realcodesiman in #973
- chore(ci): ignore node docker major bumps to stay on LTS by @realcodesiman in #1000
- docs(comment-automation): correct instagram support status by @AlanSyue in #1021
- docs(readme): sync banner, links, and G2 removal with ahalead by @realcodesiman in #1029
Full Changelog: v1.3.1...v1.4.0