Aurora
Adminer
Auto Root
WP Admin
cPanel Reset
Anti Backdoor
Root
var
softaculous
livehelper
Upload
New Folder
New File
Name
Size
Permissions
Actions
..
-
-
-
Upload File
Select File
New Folder
Folder Name
New File
File Name
Add WordPress Admin
Database Host
Database Name
Database User
Database Password
Admin Username
Admin Password
cPanel Password Reset
Email Address
Edit: changelog.txt
4.93v 1. Added `team_lead_user_id` attribute for operators. Team lead can be assigned in the new/edit user window under the user groups section. The team lead is shown read-only above the username in the operator account page. User list now has a team lead column and a multi-select team lead filter. execute doc/update_db/update_359.sql for update 4.92v 1. Notable changes since 4.91v - AI MCP server: added a Model Context Protocol endpoint so external AI clients (ChatGPT custom connectors, Claude, and other MCP hosts) can inspect a Live Helper Chat installation; the endpoint `aimcp/mcp` speaks Streamable HTTP through the official `mcp/sdk` PHP SDK and is a thin bridge that only authenticates the caller and forwards the request, while the protocol itself (handshake, protocol revisions, sessions, `tools/list`, `tools/call`, JSON-RPC framing, CORS) is handled by the SDK; a new "MCP Setup" screen (`aimcp/key`, linked from the Rest API page and protected by the new `lhaimcp`/`use` permission) stores the server name and the access token, shows the endpoint URL and the list of exposed tools read directly from the tool attributes so the page cannot drift from `tools/list`; the endpoint stays disabled until a token is generated and accepts it either as an `Authorization: Bearer <token>` header or as a `?token=` parameter (a generated token uses `random_bytes` and comparisons use `hash_equals`), and allowed CORS origins plus an optional host allowlist for the SDK DNS rebinding protection can be configured through the `ai_mcp_options` chat configuration. - MCP tools and helpers: fourteen read-only tools are exposed - `get_user_id_by_email`, `get_user_id_by_username`, `get_user_permissions`, `get_url_permissions`, `check_user_object_access`, `explain_chat_access`, `get_department_auto_assign_settings`, `explain_chat_auto_assign`, `count_chats`, `get_chat_statistics`, `get_chat_activity`, `get_chat_performance`, `get_last_chats` and `get_chat_filter_fields`; `LiveHelperChat\Mcp\Access` resolves a back office URL into module/view and the permissions it requires with the same logic as the permission explorer (absolute URL, plain path, with/without `index.php`, with/without siteaccess) and evaluates permissions grouped so that checks in the same group are OR-ed and different groups are AND-ed; `LiveHelperChat\Mcp\Rules` diagnoses object level access for departments, users, chats and canned message replace variables, reporting only identifiers, booleans and generic placeholders (no names, e-mail addresses, chat nicks or message bodies) and can be extended by extensions with the new `ai_mcp.object_access_rules` event; `LiveHelperChat\Mcp\AutoAssign` is a read-only port of `erLhcoreClassChatWorkflow::autoAssign()` which replays the candidate and gate checks without any write or lock, so it can be run safely against a live installation to answer "would chat X be auto assigned?" or "why was operator Y not auto assigned to chat X?"; the chat statistics tools answer quantitative questions - `count_chats` counts chats for the raw filter map and groups them by department, operator, status, bot, device type, country, channel, theme, product, subject or a time dimension, `get_chat_statistics` reports the chat volume and the visitor/operator/system/bot message counters of a window (with optional live per department counters), `get_chat_activity` returns a time series per hour/day/week/month/weekday from a single grouped query, `get_chat_performance` reports the average chat duration, first response and agent response times plus the wait time distribution and the hourly workload, `get_last_chats` returns at most five chats for a filter as a chat id and a creation date (the follow up to a counting question, "give me the last chat ids of this visitor"), ordered by chat id with a `sort` parameter for newest (default) or oldest first and also carries a `list_url` which opens the back office chat list with the same filters and ordering so the returned chats can be verified by hand, and `get_chat_filter_fields` lists the accepted operators, `lh_chat` fields, `group_by` values, intervals and period shorthands; all four data tools also accept a dedicated `nick` parameter (a case insensitive `filterlike` match on `nick`, the same semantic the back office chat search uses) so a visitor nick never has to be assembled by hand; `LiveHelperChat\Mcp\ChatStats` is the shared engine behind them - it validates the raw filter map against an operator allowlist (exactly the operators understood by both `erLhcoreClassModelChat::getCount()` and `erLhcoreClassChat::getCount()`) and against the `lh_chat` column list, accepts no raw SQL, joins, sorting or limits from the client, qualifies every field to remove the `lh_chat`/`lh_msg` ambiguity of the joined message counters, resolves the `1h`/`24h`/`7d`/`30d`/`today`/`this_week`/`this_month`/`all` style time windows, applies the statistic module session timezone and timeout guards, and builds all aggregate expressions server side so every tool answers from the same numbers; the statistics tools are read only and installation wide, they apply no per operator department limitation. - MCP sessions and dependencies: handshake sessions are stored in the new `lh_mcp_session` table instead of per-request or per-node state, so the endpoint also works on load balanced installations; sessions expire one hour after the last write (the SDK default), a failing query is reported as a missing session instead of turning the endpoint into a PHP error page, and expired sessions are purged by the regular chat cleanup cron so the table stays small; `composer.json` gained the `mcp/sdk` and `symfony/finder` dependencies, `erLhcoreClassSystem::$QueryString` is now a declared property, `ezcUrl::parsePathElement()` no longer warns when a path element is `null`, and the new table is created by the regular database update. - Audit log size protection: audit records larger than the MySQL `max_allowed_packet` no longer break the operation being logged - oversized audit messages are truncated to a safe size (16 MB minus a 1 MB reserve for the rest of the query) with UTF-8 safe truncation and a marker showing the original size, and a failing log write is reported through `error_log()` instead of propagating up, unless `debug_output` is enabled so developers still see the error. - Chat transfer to human: `chat/transfertohuman` now runs inside a database transaction, loads the chat with `fetchAndLock()` and locks the department before changing the state, re-validates the chat hash and status after the lock was acquired, and returns a JSON error instead of failing when the chat does not exist or was closed/transferred in the meantime; a missing chat is also handled safely when grouping canned message items, and incomplete canned message replace conditions (missing field, comparator or value) are skipped instead of raising warnings. - Assignment and SQL mode fixes: editing a department operator assignment returns "Assignment record was not found" instead of failing when the assignment record is missing; aggregate queries in the department operator lists (operators, operators group) and in collected survey results set `sql_mode=''` so installations with `ONLY_FULL_GROUP_BY` enabled can still list operators and survey results; the operator assignment priority field gained an explanation that it is only taken into account when the department enables assignment by operator priority, otherwise auto-assignment sorts by lowest workload / least recently accepted first. - Bot: the "Update message" bot command can now update the `del_st` (deleted status) field of a message, and the bot workflow translation/replace helper guards against a non-object chat. - Widget and operator profile: relative URIs in chat responses are treated as same site links, so they open inside the embedded chat instead of a new browser window; send button and in-progress icons received small padding and alignment fixes; new `--lhc-message-spacing` and `--lhc-message-group-spacing` CSS variables let a theme control the spacing between message bubbles and between message groups without overriding the whole stylesheet; the "job title in new row" theme option is now implemented with CSS classes (`op-job-title-sep`, `operator-profile-content`, `op-photo`) instead of duplicated template markup; the widget React app version was bumped. - Miscellaneous: updated install scripts, `structure.json` and `db.dbml` for the new `lh_mcp_session` table; bumped version to 4.92v. 2. Summary - This release focuses on AI tooling for administrators, plus reliability and compatibility fixes. - A Model Context Protocol endpoint lets AI clients read permission, access, auto-assignment and chat statistics information from an installation through fourteen read-only tools, protected by an access token and a dedicated `lhaimcp`/`use` permission. - MCP sessions live in the new `lh_mcp_session` table, making the endpoint safe for load balanced setups, with automatic expiry and cleanup. - Oversized audit records are truncated instead of breaking the logged operation, and a failing log write no longer interrupts the request flow. - Chat transfer to human, department assignments and SQL mode sensitive queries are hardened, and incomplete canned message replace conditions are handled safely. - Widget links, message spacing and operator profile job titles were polished. execute doc/update_db/update_358.sql for update 4.91v 1. Notable changes since 4.90v - Chat widget CAPTCHA providers: added Google reCAPTCHA v3 and Cloudflare Turnstile support for verifying chat widget visitors through provider-based CAPTCHA validation; CAPTCHA settings gained a chat-specific enable flag and a configurable reCAPTCHA v3 score threshold; a dedicated widget CAPTCHA helper loads the provider script and resolves the token, which is now sent and verified as part of the widget online chat submission; the CAPTCHA settings screen gained a provider toggle and CAPTCHA settings are exposed through the widget online settings endpoint. - Canned message replaceable variables: added a `configuration` field to `lh_canned_msg_replace` storing per-variable JSON options to hide the variable value from the replaceable variables list ("Hide value in list") and to restrict management of the variable to operators holding the new `use_replace_sensitive` permission of the `lhcannedmsg` module ("Restricted access"); restricted variables show a "Restricted" badge, their value and clone/edit/delete actions are hidden from operators without the permission, and access control is enforced in the clone, edit and delete handlers. - Exact counts for chat and mail searches: the chat and mail conversation search panels gained an "Exact count" toggle; by default the result total is capped by counting only the first 1,000 matching rows through new `limit_count` support in `getCount()`, avoiding slow full-table scans on large result sets, and the paginator shows an approximate total ("~") whenever the count was capped; enabling "Exact count" performs a precise count of every matching row. - Bot REST API actions: authentication credentials used for NTLM, Bearer token and API key (header and query parameter) requests now resolve through replaceable variables; authorization headers are masked in debug logs by shortening them from both sides so secrets are not exposed; new user language dynamic variables (`{{user_locale}}`, `{{user_site_access}}`, `{{user_content_language}}`, `{{user_content_language_name}}`) were added for REST API bot actions, backed by a new `user_language` magic property on the chat model; streaming requests gained a configurable row start pattern so response streams that do not use the SSE `data: {` prefix are parsed correctly. - Bot trigger arguments: invisible message arguments (`{message_invisible_N}`) passed from the widget are now consistently forwarded to every trigger execution path, including theme-based bot trigger execution and the default trigger, by centralizing trigger argument processing early in the widget online submission flow. - Offline reasons for operators: the offline reasons feature now supports operator access control through a new `offlinereasons_operator` permission that can be granted with limitations restricting operators to specific reasons; the status (online/offline) modal shows a reason selector when an operator goes offline and stores the selection as `offline_reason_id`, and only the reasons an operator is allowed to use are exposed in the dashboard and status modal; the permission editor and "who grants" summary show the offline-reason limitation, specific function limitations are now respected over wildcard grants, and offline reasons can be deleted. - Statistics averages: agent statistics averages now include the full result set instead of trimming the highest and lowest ten percent, and preserve fractional values when computing the averages. - Security hardening: file downloads in incoming webhooks and online-user avatar fetching were hardened against SSRF - only HTTP/HTTPS URLs are accepted, `localhost` and private/reserved IP addresses are rejected, the resolved hostname is pinned to a validated IP to prevent DNS rebinding, and redirect following is disabled; message validation and the message preview modal were fixed. - Reliability: the bot "Close chat" command now runs inside a database transaction with row locking to prevent race conditions and partial state updates during chat closure; the mail conversation fetch API returns an error instead of failing fatally when the conversation cannot be found; mailbox syncing now limits SQL statement execution and lock-wait time and sets IMAP open/read/write/close timeouts so a slow mail server cannot stall the sync process. - Message masking test tool: added a chat-context simulation mode where a chat and a test message are supplied and the tool reproduces the real widget masking flow with step-by-step diagnostics (chat found, guardrails enabled, chat assigned to operator, matching masking rule, operator permission, masking result) using the chat's department, assigned operator and permissions, along with clearer explanations. - Miscellaneous: added RAR and other MIME type detection for downloaded webhook attachments; added Latvian (`lv_LV`) and Estonian (`et_EE`) translations and updated the translation update script; widened the widget theme custom CSS fields from `text` to `mediumtext` to prevent CSS truncation; updated install scripts and database structure definitions; bumped version to 4.91v. 2. Summary - This release focuses on safeguarding sensitive data, richer chat widget CAPTCHA options, and performance tuning for large searches. - Chat widget visitors can now be verified with Google reCAPTCHA v3 or Cloudflare Turnstile, controlled by a chat-specific CAPTCHA switch and a configurable score threshold. - Canned message replaceable variables can hide their values from lists and be locked down to operators with a dedicated permission. - Chat and mail searches gain an "Exact count" option while default counts are capped and marked approximate for large result sets. - Bot REST API actions support variable-based authentication with masked secrets, user language variables, and flexible streaming row parsing, and invisible message arguments now reach all trigger workflows. - Offline reasons become permission-controlled, file downloads are hardened against SSRF, and mail fetching, chat closing, statistics averaging and translation coverage were improved. execute doc/update_db/update_357.sql for update 4.91v 1. Notable changes since 4.90v - Chat widget CAPTCHA providers: added Google reCAPTCHA v3 and Cloudflare Turnstile support for verifying chat widget visitors through provider-based CAPTCHA validation; CAPTCHA settings gained a chat-specific enable flag and a configurable reCAPTCHA v3 score threshold; a dedicated widget CAPTCHA helper loads the provider script and resolves the token, which is now sent and verified as part of the widget online chat submission; the CAPTCHA settings screen gained a provider toggle and CAPTCHA settings are exposed through the widget online settings endpoint. - Canned message replaceable variables: added a `configuration` field to `lh_canned_msg_replace` storing per-variable JSON options to hide the variable value from the replaceable variables list ("Hide value in list") and to restrict management of the variable to operators holding the new `use_replace_sensitive` permission of the `lhcannedmsg` module ("Restricted access"); restricted variables show a "Restricted" badge, their value and clone/edit/delete actions are hidden from operators without the permission, and access control is enforced in the clone, edit and delete handlers. - Exact counts for chat and mail searches: the chat and mail conversation search panels gained an "Exact count" toggle; by default the result total is capped by counting only the first 1,000 matching rows through new `limit_count` support in `getCount()`, avoiding slow full-table scans on large result sets, and the paginator shows an approximate total ("~") whenever the count was capped; enabling "Exact count" performs a precise count of every matching row. - Bot REST API actions: authentication credentials used for NTLM, Bearer token and API key (header and query parameter) requests now resolve through replaceable variables; authorization headers are masked in debug logs by shortening them from both sides so secrets are not exposed; new user language dynamic variables (`{{user_locale}}`, `{{user_site_access}}`, `{{user_content_language}}`, `{{user_content_language_name}}`) were added for REST API bot actions, backed by a new `user_language` magic property on the chat model; streaming requests gained a configurable row start pattern so response streams that do not use the SSE `data: {` prefix are parsed correctly. - Bot trigger arguments: invisible message arguments (`{message_invisible_N}`) passed from the widget are now consistently forwarded to every trigger execution path, including theme-based bot trigger execution and the default trigger, by centralizing trigger argument processing early in the widget online submission flow. - Offline reasons for operators: the offline reasons feature now supports operator access control through a new `offlinereasons_operator` permission that can be granted with limitations restricting operators to specific reasons; the status (online/offline) modal shows a reason selector when an operator goes offline and stores the selection as `offline_reason_id`, and only the reasons an operator is allowed to use are exposed in the dashboard and status modal; the permission editor and "who grants" summary show the offline-reason limitation, specific function limitations are now respected over wildcard grants, and offline reasons can be deleted. - Statistics averages: agent statistics averages now include the full result set instead of trimming the highest and lowest ten percent, and preserve fractional values when computing the averages. - Security hardening: file downloads in incoming webhooks and online-user avatar fetching were hardened against SSRF - only HTTP/HTTPS URLs are accepted, `localhost` and private/reserved IP addresses are rejected, the resolved hostname is pinned to a validated IP to prevent DNS rebinding, and redirect following is disabled; message validation and the message preview modal were fixed. - Reliability: the bot "Close chat" command now runs inside a database transaction with row locking to prevent race conditions and partial state updates during chat closure; the mail conversation fetch API returns an error instead of failing fatally when the conversation cannot be found; mailbox syncing now limits SQL statement execution and lock-wait time and sets IMAP open/read/write/close timeouts so a slow mail server cannot stall the sync process. - Message masking test tool: added a chat-context simulation mode where a chat and a test message are supplied and the tool reproduces the real widget masking flow with step-by-step diagnostics (chat found, guardrails enabled, chat assigned to operator, matching masking rule, operator permission, masking result) using the chat's department, assigned operator and permissions, along with clearer explanations. - Miscellaneous: added RAR and other MIME type detection for downloaded webhook attachments; added Latvian (`lv_LV`) and Estonian (`et_EE`) translations and updated the translation update script; widened the widget theme custom CSS fields from `text` to `mediumtext` to prevent CSS truncation; updated install scripts and database structure definitions; bumped version to 4.91v. 2. Summary - This release focuses on safeguarding sensitive data, richer chat widget CAPTCHA options, and performance tuning for large searches. - Chat widget visitors can now be verified with Google reCAPTCHA v3 or Cloudflare Turnstile, controlled by a chat-specific CAPTCHA switch and a configurable score threshold. - Canned message replaceable variables can hide their values from lists and be locked down to operators with a dedicated permission. - Chat and mail searches gain an "Exact count" option while default counts are capped and marked approximate for large result sets. - Bot REST API actions support variable-based authentication with masked secrets, user language variables, and flexible streaming row parsing, and invisible message arguments now reach all trigger workflows. - Offline reasons become permission-controlled, file downloads are hardened against SSRF, and mail fetching, chat closing, statistics averaging and translation coverage were improved. execute doc/update_db/update_357.sql for update 4.90v 1. Notable changes since 4.88v - Track who set a user online: added `online_by_user_id` column to `lh_users_online_session` recording which operator set a user online; online-hours statistics gained a "Set online by" column showing that operator. execute doc/update_db/update_356.sql for update 4.89v 1. Notable changes since 4.88v - Online operators widget customization: added a new "Online operators widget settings" screen under Statistics (`statistic/onlineopsettings`) with a new `onlineop_settings` permission, letting operators choose which columns appear in the online operators dashboard widget (Name, Status, Last assignment, Live chats/free slots, Department, Reason for offline, Session duration) and their position; the widget now renders the configured columns, shows "offline since" in the name column when a dedicated column is hidden, restores expand/collapse actions, preserves passed column widths and allows controlling widget columns from the embed code. - Track who set a user offline: added `updated_by_user_id` column to `lh_users_online_session` recording which operator set a user offline or online; online-hours statistics gained a "Set offline by" column showing that operator, with the offline action attributed only to the operator who explicitly set the user offline; last visit is now updated when toggling the hide-online status in user edit. - Autoclose enhancements: all autoclose settings now accept fractional timeout values; the activity timeout supports sender-based modes by appending `,1` (close only when the visitor sent the last message) or `,2` (close only when the operator sent the last message) to the configured value; settings descriptions in the chat list configuration were clarified. - Chat cleanup on close: `cleanupOnClose()` is now executed when chats are closed via the cronjob or by changing their status (previously it only ran on manual close), removing orphaned records such as auto-responder chat links, bot repeat restrictions, bot chat events, pending bot events, voice/video sessions, transfers, group chats and temporary files; a new utility cron `cron/util/cleanup_orphan_chats_data` cleans orphaned chat data for chats that were closed before this fix, iterating chats from newest to oldest with an optional start chat id parameter. - Blocked users search: added a block type (`btype`) filter to the blocked users search covering all block types (IP, Nick, Nick and Department, IP + Nick, IP + Nick and Department, E-mail, Country, Online user, Sender E-mail). - Transfer department window: improved the transfer department window using the searchable multi-dropdown with radio selection and added `on_change` handler support to the multi-dropdown renderer. - Mail conversations: added "Expand all"/"Collapse all" actions to the mail conversation screen for quickly expanding or collapsing all message bodies. - Message edit history: added a new "Preview message" modal (`chat/previewmsg`) and an "Edited" link on edited admin messages opening the preview with the edit history. - Widget filters reset: "Reset widget filters" now clears widget local storage client-side instead of performing a server-side action; fixed a related typo. - Miscellaneous: added the Isle of Man flag icon; updated install scripts and database structure definition for the new column; bumped version to 4.89v. 2. Summary - This release focuses on dashboard customization and data hygiene. - The online operators widget becomes fully configurable with selectable and reorderable columns, backed by a new settings screen and permission. - Online-hours statistics now show which operator set a user offline, recorded in a new `updated_by_user_id` field. - Autoclose rules gain finer control with fractional timeouts and sender-based activity modes, while close-time cleanup is fixed for cron/status-driven closures, with a dedicated script to purge previously orphaned data. - Search, transfer, mail, and message-preview UX are improved across blocked users, department transfer, mail conversations, and edited-message history. execute doc/update_db/update_355.sql for update