5.69.5.20261006143044

  • [Feature] Widget: show typing indicator while a chat AI operator takes its turn (#27453)
  • [Feature] ICU MessageFormat support for translations (server, templates, GWT client) (#27418)
  • [Feature] Voice: live call transcription with participant attribution (#27078)
  • [Feature] Add reply_via_instagram_dm AI agent tool for the Instagram Direct Messages channel (#26806)
  • [Feature] Message translation — Stage 1: on-demand inbound message translation (MessageContentTranslation module) (#25515)
  • [Security] Security improvements (#27355)
  • [Improvement] AI provider "Supports" list is outdated (merge Answer Composer/Improver, add Ticket Summary and Message translation) (#27581)
  • [Improvement] Message translation configuration page does not follow the design and the Ticket summary activation pattern (#27558)
  • [Improvement] Message translation: ticket view UI does not match the design (translation switch, Translate all) (#27554)
  • [Improvement] AI operator keeps answering a chat while a human agent is present; leave on TransferAccepted instead of in the transfer tool (#27511)
  • [Improvement] Skip design gallery on widget creation and apply a default (#27246)
  • [Improvement] Chat action panel: "Take over from AI" button to remove the AI operator without transfer/end (#26831)
  • [Improvement] Trim RESPONSE_PUBLIC agent projection returned to visitors via La_Rpc_User.load (#26373)
  • [Improvement] Implement capped mailbox picker (list + fallback) for MS OAuth shared mailbox (incoming and outgoing) (#26088)
  • [Improvement] Add the option to unselect the requester when changing the ticket owner (#25361)
  • [Fix] Message translation config entry missing under Configuration > AI because the entitlement flag is stored as 'Y' but read only as 'A' (#27543)
  • [Fix] CrawlerGuard empty 200 response gets cached by Varnish and served to real visitors (chat button script empty) (#27540)
  • [Fix] Creating a contact group with an emoji in its name fails (#27308)
  • [Fix] GWT Translation.addParam() puts a value into the wrong placeholder when an earlier argument contains %s (#27281)
  • [Fix] Downloaded call recording file has no extension, preventing local playback (#27150)
  • [Fix] Agent panel conversation stops rendering (and never recovers) if the AgentMessageGroupFactory code-split fragment fails to load (#26752)
  • [Fix] Widget loader has no dedupe/teardown: re-running the embed snippet creates a new widget + iframes each time, causing sustained request loops in SPA embeds (#26400)
  • [Fix] GWT Translation.addParam has no positional placeholder support, so a reordered translation silently swaps arguments (#26330)
  • [Fix] Lang::_replaceArgs throws an uncaught ValueError on a message containing a bare % (#26324)
  • [Fix] Embedded chat widget cut off by mobile dynamic address bar (#26227)
  • [Fix] The context variable - contains - X rule is not executed if the value has non-English language characters (#25588)
  • [Fix] Calls History CSV export fails for large call histories (#23419)
  • [Other] Refactorings and other fixes (#27477)(#27426)(#27354)