Recently Published Versions

  • [Feature] Pay a chat AI operator's turns from a budget set on the chat button (#27158)
  • [Feature] Voice: live call transcription with participant attribution (#27078)
  • [Feature] Support inbound WhatsApp interactive replies (button/list/nfm) over 360dialog (#26611)
  • [Feature] Escalation watchdog for an unresponsive bot (#26484)
  • [Feature] Chat AI operator configuration and initiation (#26483)
  • [Feature] Trigger AI operator turns in a live chat (#26482)
  • [Feature] Support multiple expected completion tools in AI agent runs (#26481)
  • [Feature] Add chat MCP tools: transfer_chat + end_chat (#26398)
  • [Feature] Add chat MCP tools: get_chat_messages + answer_chat (#26382)
  • [Feature] Add GA4 named events for agent-panel view, set-password page, and missing channel integrations (#26369)
  • [Feature] Add "Reply via email" tool to MCP server (#26101)
  • [Feature] Message translation — Stage 1: on-demand inbound message translation (MessageContentTranslation module) (#25515)
  • [Security] Security improvements (#27184)(#27166)(#27094)(#26692)(#26375)(#26374)(#26372)(#26253)(#26201)(#26140)(#23579)
  • [Improvement] Add Rector for mechanical refactors across many files (#27357)
  • [Improvement] Add GPT 6 Luna and Sol models for OpenAI AI provider (#27297)
  • [Improvement] Document safe branch-freshness check before rebase/force-push (git merge-base pitfall caused dropped commits) (#27233)
  • [Improvement] Serve the AI agent screens their chat-button usage and picker facts (#27159)
  • [Improvement] Let a chat AI operator answer in Markdown (#27157)
  • [Improvement] Send one welcome email at the end of the install, chosen by the owner's login method (#27130)
  • [Improvement] Activate the requested SSO service on the tenant before the owner exists (#27126)
  • [Improvement] Add an explicit owner login method to the install request instead of an optional password (#27120)
  • [Improvement] Allow personal MCP OAuth from native/desktop AI assistants (e.g. Claude Code) (#27111)
  • [Improvement] Make a login attempt against an agent with no password take the same time as one against an agent with a password (#27087)
  • [Improvement] Give AI agents an explicit type so chat eligibility is declared, not derived (#27082)
  • [Improvement] Require verified email before matching a Google SSO login to an agent (#27080)
  • [Improvement] Worktree hooks create slots EnterWorktree cannot reach (#27063)
  • [Improvement] Support connecting Google Gemini and OpenAI personal AI agents to the personal MCP server via OAuth (#27058)
  • [Improvement] Add GPT 6 Astra model for OpenAI AI provider (#26985)
  • [Improvement] Chat start is refused for an offline department even when its widget has an AI agent configured (#26849)
  • [Improvement] Make local PHP test coverage actionable for Claude Code and Codex (#26846)
  • [Improvement] Improve dark theme (Obsidian) rendering of HTML emails: adaptive colour remapping instead of flattening (#26718)
  • [Improvement] Align legacy file.php inline view caching with the new attachment endpoint (#26659)
  • [Improvement] Client dictionary is served no-store, re-downloaded on every panel and widget open (#26646)
  • [Improvement] Ticket attachment and inline-image view responses are uncacheable (max-age=0, no validators) (#26645)
  • [Improvement] Minimize the static and templated error pages (#26630)
  • [Improvement] Add new 3.7 and 3.8 flash model for Gemini AI provider (#26560)
  • [Improvement] Tracker widget (trackjs.php) ships legacy IE compatibility code (json2 polyfill, duplicated attachEvent fallbacks) to every visitor (#26540)
  • [Improvement] Voice: index call transcript text in Elasticsearch for full-text search (#26522)
  • [Improvement] Legacy Svelte dev harnesses: icon @font-face uses var() inside url() and never works (#26447)
  • [Improvement] Fonts and SVG have no cache policy; remove dead .eot/.ttf font sources (#26445)
  • [Improvement] Widget fonts: no font-display (FOIT) and three dead @font-face overrides (#26442)
  • [Improvement] bus.html is served with no Cache-Control despite a version-busted URL (#26438)
  • [Improvement] Serve content-hashed widget assets as immutable: GWT permutations and webpack bundles are capped at 6 hours (#26436)
  • [Improvement] Consolidate crawler user-agent lists: PHP Lib_Crawler and WebCrawler are stale 5-entry copies (#26427)
  • [Improvement] Move ref out of the widget iframe query string into the URL fragment so the browser cache key is stable (#26403)
  • [Improvement] Chat widget session bootstrap fires a full-row la_contacts rewrite + ES reindex on every load (#26379)
  • [Improvement] Support "allow_custom_css" flag in chat and contact form theme definitions (#26218)
  • [Improvement] Implement capped mailbox picker (list + fallback) for MS OAuth shared mailbox (incoming and outgoing) (#26088)
  • [Improvement] Improve message-group timestamp display (too verbose, redundant hover) (#25961)
  • [Improvement] IVR TextArea (change IVR action) in Rules should resize automatically on larger screens (#25655)
  • [Improvement] Provide FlowHunt with ticket ID when chat with chatbot starts (#25535)
  • [Improvement] Add option to setup custom store name in Shopify plugin (#25421)
  • [Improvement] Auto-refresh the maintenance 503 page so users return automatically after an upgrade (#25321)
  • [Improvement] Create a nice public page for the maintenance 503 response (#25309)
  • [Improvement] Disable buttons to connect Facebook & Instagram in Getting started on trials (#21726)
  • [Improvement] Disable buttons in Getting started for features that are not available for account (#21725)
  • [Fix] Draft autosave clones every inline image/attachment file + creates a temp_file row on each save, regardless of viewers (#27387)
  • [Fix] Inactivity time is counted from the moment the customer gets into the queue (#27386)
  • [Fix] Chat picked up from a Knowledge Base ticket ("My tickets") leaves the customer widget stuck seeking/waiting (#27350)
  • [Fix] Embedded chat upload-failed error shows literal #…# in its text instead of a translated message (#27333)
  • [Fix] WhatsApp (360dialog) replies fail for customers who use a WhatsApp username instead of a phone number (#27283)
  • [Fix] CRM usage stats: slaRules reports SLA levels, and SLA rules are not reported at all (#27225)
  • [Fix] New ticket email template variables {$conversationCode} and {$conversationUrlCode} render empty (#27197)
  • [Fix] Clicking "Start chat again" on an already-resolved ticket can leave it permanently stuck showing "Chatting" (#27175)
  • [Fix] Customer chat widget does not show the AI agent the customer is chatting with (#27074)
  • [Fix] Bad design of Create dispatch rule window (#26982)
  • [Fix] OAuth/MCP consent form blocked by agent-panel CSP (#26894)
  • [Fix] qaUp fails on cold cache: cacheWarmup.php runs without memory_limit override in server-builder (#26892)
  • [Fix] 360dialog WhatsApp number cannot be added — isWhatsAppNumberAssociatedWithAccount always fails due to empty phone_numbers in WABA-level webhook response (#26862)
  • [Fix] Dark blue theme: "+" button shows grey square background in active/selected state (#26854)
  • [Fix] Rule delete permanently fails once a tenant has over 1000 rules on the same trigger (#26852)
  • [Fix] ChatEventBus reports agent-only push events as server errors instead of ignoring them (#26833)
  • [Fix] Customer portal hides the agent-rating widget for email answers (#26811)
  • [Fix] Microsoft 365 shared mailbox outgoing setup blocked due to error "Shared email is not valid" (#26795)
  • [Fix] Agent rating disappears from the ticket (#26784)
  • [Fix] Visitors can start multiple chats by clicking the 'Chat' button multiple times (#26758)
  • [Fix] Available agents don't receive queued chats due to old, un-cleared queue entries (#26755)
  • [Fix] Agent panel shows chat input based on ticket participation, not chat operator set (follow-up to #26475) (#26745)
  • [Fix] worktree setup script nests copied .idea subdirectories instead of merging them (#26720)
  • [Fix] Auto-generated contact/company/visitor names are never translated (#26700)
  • [Fix] SLA rule found with a corrupted "change SLA level" reference, causing repeated execution failures with no way to diagnose it in the UI (#26679)
  • [Fix] Answer status remains Scheduled unless you close the ticket tab and open it again (#26678)
  • [Fix] CRM plugin "login as user" crashes agents during a live app version rollout (#26676)
  • [Fix] Expected string while object given error occurs during editing rule with conditions (#26647)
  • [Fix] Standalone icons_mapping.css has no working la-icon-font @font-face (#26636)
  • [Fix] Chatbot avatar disappears after ~3 days (#26626)
  • [Fix] Agent image not displayed on answers due to wrong URL (#26610)
  • [Fix] Language listbox search doesn't match bracketed translated name / code shown in item label (#26581)
  • [Fix] Stuck chat: rc not cleared, co-occurring with Aurora chat-read "Connection refused" error (#26577)
  • [Fix] Facebook comment import crashes when the parent comment hasn't been imported into LiveAgent yet (#26558)
  • [Fix] Custom CSS silently stripped when switching design on Contact Form / Call Button / Suggestion Button (#26524)
  • [Fix] Local dev: spamassassin container fails to pull on Apple Silicon (arm64 image dropped from latest) (#26489)
  • [Fix] Setting State of missed chats doesn't work (#26485)
  • [Fix] Chat message input field is displayed to the agent even if the chat was not answered by this agent (#26475)
  • [Fix] generateWidget.php marks error responses cacheable for a year (#26440)
  • [Fix] Rule editor crashes with TypeError when reopening a rule containing an "email header" condition (#26425)
  • [Fix] Chats-list COUNT(*) examines 1.83M rows per poll, saturating qla-prod-ec1-la-db-16-master-2 at 92% CPU (#26423)
  • [Fix] Button widget from FlowHunt doesn't work in the LiveAgent chat window (#26422)
  • [Fix] Disabling X (Twitter) leaves content area blank on return to #TwitterChannel (#26413)
  • [Fix] Private API v4 /api/private/account-usage-stats missing ApiV4Authorization attribute — CRM cannot retrieve usage stats (#26412)
  • [Fix] FlowHunt chatbot: attachment sent without text never calls /invoke, chat loads indefinitely (#26410)
  • [Fix] "InvalidCharacterError" error displayed when you activate or deactivate chat buttons (#26401)
  • [Fix] Incoming email lost due to a decoding error in the subject line (#26395)
  • [Fix] WhatsApp username (BSUID) search never matches: keyword field queried with an analyzer that lowercases and splits on the dot (#26371)
  • [Fix] Agent replacement from delete-agent dialog is not applied to Automation Rules (#26359)
  • [Fix] System shows the name of the first agent in the Chats overview section even after the chat was taken over by a different agent (#26354)
  • [Fix] Customer portal ticket page fails when a chat widget has no online/offline status set (#26314)
  • [Fix] Note ticket creation throws FATAL TypeError when department id is missing - catch(Exception) guard doesn't catch it (#26299)
  • [Fix] SQL 1064 (near '' at line 1) when creating a custom filter with zero conditions (#26297)
  • [Fix] MysqlConditionRepository: unreachable catch clause and missed transaction rollback on PDOException (#26296)
  • [Fix] Public KB article page returns 500 (SQL 1064) when article has no visible message group (#26295)
  • [Fix] Email fetched into LiveAgent without body — content replaced with an empty 2-byte attachment (#26282)
  • [Fix] SIP trunk username accepts characters illegal in a SIP URI ([, >, etc.) — only @ is ever checked, failure surfaces as opaque ARI 500 (#26239)
  • [Fix] Chat stuck in queue after department transfer — wrong department label on queue entry; reproduces with single agent in both departments (#26188)
  • [Fix] Local provisioning reports success even when terraform apply fails (#26161)
  • [Fix] DynamoDB tables with a range-key GSI have a perpetual diff against dynamodb-local and cannot be replaced (#26160)
  • [Fix] Manual chatbot handover breaks message grouping and alignment (#26087)
  • [Fix] Ticket assignment/transfer re-queues phone calls off a stale service_requested flag with no live-call check (#26079)
  • [Fix] Adding a lot of condition groups between OR operator to the rule results in the new condition group being saved to the previous condition group with AND operator (#26043)
  • [Fix] Chat widget session parsing crashes with "Unable to parse request body" on malformed JSON (#26036)
  • [Fix] MCP add_note returns "Row does not exist" despite note being created successfully (#25980)
  • [Fix] Bug: AI Agent Runs report lists only 10 runs (#25904)
  • [Fix] fix(event-router): EventConsumer breaks per-entity event ordering and silently drops events on retry exhaustion (#25827)
  • [Fix] Corrupt attachment row in internal chat 500s the entire history page instead of being skipped (#25710)
  • [Fix] Live note/page-visit updates not delivered when a ticket's owner changes mid-view (merge or reassignment) (#25706)
  • [Fix] fix: Stop logging user-facing Facebook reply-length validation as an error (#25644)
  • [Fix] Ticket is not assigned to agent by a rule if condition and action use different departments (#25563)
  • [Fix] Third-party API keys locked out of POST /calls/{id}/messages — scope tightened call.write → call.process (v5.65.5) (#25276)
  • [Fix] fix(event-router): unbounded queue and task fan-out cause RSS growth in EventConsumer (#24807)
  • [Fix] Online Visitors page shows "Data error" when a visitor's stored URL or referrer contains non-UTF-8 bytes (#24506)
  • [Fix] Canned message repository lacks first-class authorization context (#23833)
  • [Fix] Intercom migration crashes with TypeError on null author field (#23617)
  • [Fix] ContactFormAuthenticator::getSessionId crashes with TypeError when D parameter is an array (chat/contact.php) (#23370)
  • [Fix] Facebook event processor crashes on deleted objects — error #100 "Object does not exist" not handled (#22713)
  • [Fix] SLA resolution pause fails with 1-second timestamp ordering issue on agent reply (#22606)
  • [Fix] Facebook comment processor throws exception when adding comment to closed ticket (#22261)
  • [Fix] PurgedTicketUserRemover TASK spams cron tasks (#21449)
  • [Fix] Internal chat skip words in between <> brackets (#26116)
  • [Performance] Expired temp files are never deleted — ExpiredTempFileCleaner re-runs every minute and deletes nothing (30M+ rows in ec1) (#27022)
  • [Other] Refactorings and other fixes (#27205)(#27156)(#26990)(#26924)(#26870)(#26847)(#26792)(#26704)(#26702)(#26699)(#26661)(#26653)(#26536)(#26494)(#26466)(#26421)(#26402)(#26350)(#26334)(#26248)(#26223)(#26192)(#26118)(#25929)(#25533)(#25282)(#25116)(#23554)(#23296)(#23277)(#21211)
  • [Feature] Support inbound WhatsApp interactive replies (button/list/nfm) over 360dialog (#26611)
  • [Fix] WhatsApp (360dialog) replies fail for customers who use a WhatsApp username instead of a phone number (#27283)
  • [Other] Refactorings and other fixes (#27305)
  • [Fix] generateWidget.php marks error responses cacheable for a year (#26440)
  • [Fix] Agent rating disappears from the ticket (#26784)
  • [Fix] Microsoft 365 shared mailbox outgoing setup blocked due to error "Shared email is not valid" (#26795)
  • [Fix] Customer portal hides the agent-rating widget for email answers (#26811)
  • [Fix] Expired temporary files are now cleaned up correctly (#27022)
  • [Other] Refactorings and other fixes (#26921)(#26938)
  • [Feature] Add GA4 named events for agent-panel view, set-password page, and missing channel integrations (#26369)
  • [Improvement] Disable buttons in Getting started for features that are not available for account (#21725)
  • [Improvement] Disable buttons to connect Facebook & Instagram in Getting started on trials (#21726)
  • [Improvement] Move ref out of the widget iframe query string into the URL fragment so the browser cache key is stable (#26403)
  • [Improvement] Widget pages load the agent-panel webpack bundles unconditionally: stringutils 117 KB gz is markdown + html-to-text tooling visitors rarely need (#26632)
  • [Improvement] Align legacy file.php inline view caching with the new attachment endpoint (#26659)
  • [Fix] Manual chatbot handover breaks message grouping and alignment (#26087)
  • [Fix] Getting Started "Connect social media": 400 on "Next step" and missing "Skip this step" when all channels locked (#26143)
  • [Fix] FlowHunt chatbot: attachment sent without text never calls /invoke, chat loads indefinitely (#26410)
  • [Fix] Rule editor crashes with TypeError when reopening a rule containing an "email header" condition (#26425)
  • [Fix] Available agents don't receive queued chats due to old, un-cleared queue entries (#26755)
  • [Other] Refactorings and other fixes (#26402)(#26897)
  • [Improvement] Serve content-hashed widget assets as immutable: GWT permutations and webpack bundles are capped at 6 hours (#26436)
  • [Improvement] bus.html is served with no Cache-Control despite a version-busted URL (#26438)
  • [Improvement] Fonts and SVG have no cache policy; remove dead .eot/.ttf font sources (#26445)
  • [Improvement] Minimize the static and templated error pages (#26630)
  • [Improvement] Ticket attachment and inline-image view responses are uncacheable (max-age=0, no validators) (#26645)
  • [Security] Security improvement (#26692)
  • [Fix] Chats-list COUNT(*) examines 1.83M rows per poll, saturating qla-prod-ec1-la-db-16-master-2 at 92% CPU (#26423)
  • [Fix] Stuck chat: rc not cleared, co-occurring with Aurora chat-read "Connection refused" error (#26577)
  • [Fix] Agent image not displayed on answers due to wrong URL (#26610)