# Changelog ## [Unreleased] ### Added - **Mirror Domains & Staging** — repeatable subform table in DevTools plugin for configuring domain aliases with per-alias offline bypass, robots directive, and labels - **Daily Support PIN** — HMAC-SHA256 rotating PIN shown on cpanel module, component dashboard, and HQ site cards - **Support PIN in status bar** — cache/temp module now shows PIN request button instead of domain; click to request, click again to copy - **Frontend link in status bar** — cache/temp module now has 4 buttons: Site (frontend link), PIN, Cache, Temp - **Help buttons** — all admin views link to Gitea wiki pages via toolbar help button - **Support PIN in heartbeat** — core system plugin includes current PIN in heartbeat payload to HQ - **HQ config sync** — client stores HQ-configured `support_pin_hours` from heartbeat response, PIN TTL now configurable from HQ ### Changed - **Support PIN UI unified** — `SupportPinHelper::renderBadge()` and `renderScript()` replace 3 separate inline implementations (dashboard, cpanel module, cache module) with click-to-copy on all PIN badges - Admin sidebar menu module now loads component-local language files (fixes untranslated keys for MokoSuiteCross and other components) - Support PIN TTL is now configurable via HQ global options instead of hardcoded 72 hours - Removed MokoSuiteHQ from extension catalog (internal app, not for client sites) - **SupportPinHelper** — shared helper centralises PIN generation across dashboard, cpanel module, cache module, and AJAX controller - **Current IP display** — firewall plugin settings show admin's IP with copy button - **Heartbeat monitor** — consolidated into core plugin from retired monitor plugin, with diagnostic logging on all bail-out points - **Backup bridge plugin** — discovers MokoSuiteBackup's BackupStatusHelper and sends status in heartbeat payloads - **Activity log** — blockchain-style hash chain for tamper detection in MokoSuiteHQ - **Dev domain in heartbeat** — client sends dev alias to HQ for display on dashboard - **Login app badges** — recent logins table shows Admin/Site badge parsed from Joomla action log message JSON ### Changed - **Plugin install** — self-healing: extracts plugin zips from package on every update, creates missing extension records with namespace - **Menu naming** — MokoSuiteClient displays as "MokoSuite", MokoSuiteHQ as "MokoHQ", others stripped of prefix - **Menu ordering** — HQ first, MokoSuite second, others alphabetical - **Cpanel module** — always starts collapsed, access level 3 (Special), pretty plugin badge labels - **Module namespaces** — fixed cpanel (MokoSuiteCpanel → MokoSuiteClientCpanel) and cache (MokoSuiteCache → MokoSuiteClientCache) - **Health checks** — return status:error on exceptions instead of false status:ok; MokoSuiteBackup detection queries correct table - **Heartbeat** — correct URL (suite.dev), correct API route (mokosuitehq), correct headers (X-MokoSuite-*), fresh RSA key pair - **Date formats** — all templates use Joomla locale-aware DATE_FORMAT_LC2/LC4 - **Domains** — updated from waas.dev to suite.dev.mokoconsulting.tech throughout - **Dashboard info bar** — reverted stacked layout; info items back to horizontal row - **Extension version bar** — full-width auto-sized strip with equal-width cells and border separators - **Recent logins** — exact match on LOGGED_IN key (excludes logout noise), limit increased to 10 ### Removed - **Helpdesk/tickets** — migrated to MokoSuiteCRM (issue #67) - **Monitor plugin** — retired, config consolidated into core plugin - **Backup bridge** — temporarily removed from package manifest (build pipeline issue) - **Update server migration** — removed migrateUpdateServerUrls, cleanupStaleUpdateSites, fixUpdateRecords, enableUpdateServer calls ### Fixed - **Regular Labs import** — destination tables missing from SQL update files; sites that upgraded never got the tables, causing "No data found" on import - **Regular Labs import banner** — detection now requires both source AND destination tables before showing the import button - **DB-IP auto-enrichment** — all IPs in `` tags in admin backend now show country flag emoji and geo tooltip on hover - **MokoSuiteBackup quick action** — dashboard now includes MokoSuiteBackup button when component is installed - **PIN copy** — fixed duplicate click handlers (4 toast messages), "Copied!" not reverting, added "Click to copy" hover tooltip - Health endpoint cron check SQL error — orphan `setQuery(getQuery(true), 0, 5)` produced bare `LIMIT 5`, returning 503 for all health polls - License plugin missing `src/` and `language/` directories causing install failure - PIN generation inconsistency — controller used `floor(now/TTL)` while display used `floor(requestedAt/TTL)` - Plugin files installing to group root instead of element subdirectory (ALTER TABLE DEFAULT '' + empty element cleanup) - Orphan extension rows with empty element or display-name-as-element - Module not publishing (ensureAdminModule direct DB update bypasses checked_out) - RSA key pair had Windows line endings causing signature verification failure - Heartbeat connection failing due to wrong domain, route, and header names ## [02.44.00] --- 2026-06-20 ## [02.42.00] --- 2026-06-20 ## [02.42.00] --- 2026-06-20