Fix: mobile UX — input font-size 16px (prevents iOS auto-zoom), touch-action on buttons (no tap delay), -webkit-overflow-scrolling on messages, safe-area-inset support for iPhone notch, visualViewport keyboard handler, no auto-focus on touch devices
1.2.19
Fix: renamed main plugin file from wp-ai-assistant.php to effortless-ai-assistant.php to match the plugin slug
1.2.18
Fix: chat window now uses fixed positioning on mobile so it fits the viewport correctly on all screen sizes
1.2.17
Add: dismissible donate notice on the settings page
1.2.16
Fix: admin-settings.js — added /** file docblock and phpcbf formatting fixes to pass PHPCS WordPress standard with zero errors/warnings
1.2.15
Fix: inline and in admin-settings.php moved to properly enqueued files (assets/css/admin-settings.css, assets/js/admin-settings.js) via admin_enqueue_scripts hook
Fix: all streaming methods refactored from direct curl to WordPress HTTP API + http_api_curl hook (stream_request() helper)
Fix: added == External services == section to readme.txt documenting Anthropic, OpenAI, Google Gemini, Mistral, and Ollama with ToS and Privacy Policy links
1.2.14
Fix: main plugin class renamed from WP_AI_Assistant to ELAIA_Plugin to satisfy WordPress prefix naming convention (PHPCS NonPrefixedClassFound)
1.2.13
Fix: main plugin class renamed from WP_AI_Assistant to ELAIA_AI_Assistant to satisfy WordPress prefix naming convention (PHPCS NonPrefixedClassFound)
1.2.12
Fix: readme short description reworded to plain English without AI/brand terms
Fix: DB queries restructured using inline bypass-pattern conditions — no dynamic WHERE SQL variable
1.2.11
Removed Plugin URI and Author URI from plugin header
1.2.10
Fix: readme short description simplified to plain English (no brand names)
Fix: DB count and logs queries inlined to resolve Plugin Check UnescapedDBParameter warnings
Fix: added correct PreparedSQLPlaceholders sniff ignores for dynamic WHERE clauses
1.2.9
Updated “Tested up to” to WordPress 7.0
1.2.8
Fix: text domain changed to effortless-ai-assistant throughout all PHP files
Fix: replaced forbidden wp_get_sidebars_widgets() with get_option(‘sidebars_widgets’)
Fix: all non-prefixed template variables prefixed with elaia_
Fix: DB queries use registered $wpdb->elaia_conversations table property
Fix: Plugin URI updated from example.com placeholder to domclic.com
Fix: language files renamed to match effortless-ai-assistant text domain
Fix: Tested up to updated to 6.8; tags reduced to 5
1.2.7
Renamed plugin title to EffortLess AI Assistant
1.2.6
Refactor: all plugin identifiers renamed from wpai_ prefix to elaia_ — PHP constants (ELAIA_), options, hooks, transients, nonces, CSS classes (.elaia-), JS script handles, and the JS config object (elaiaConfig)
1.2.5
Security: External URL validation now uses a trusted-domain allowlist (Google, Maps, Facebook, Instagram, LinkedIn, X/Twitter, YouTube, WhatsApp, Telegram, TikTok, Pinterest, Yelp, TripAdvisor) instead of passing all external URLs unconditionally — filterable via wpai_trusted_external_hosts
Fixed: Valid internal links to category archives, tag pages, taxonomy terms, and nav-menu URLs were silently stripped because url_to_postid() cannot resolve archive URLs — the verified content index is now checked first, with url_to_postid() as a fallback only
Fixed: url_to_postid() DB queries inside strip_unverified_links() are now deduplicated — the same URL appearing N times in one response only queries the DB once
Fixed: Malformed URLs (e.g. http:///path) where wp_parse_url() cannot extract a hostname are now rejected instead of being passed as external
Fixed: Logged-in users now bypass the per-minute rate limit as well as the daily/monthly usage limits — the two limit functions were inconsistent
Fixed: home_url() was called twice in strip_unverified_links() on every request — now called once and reused
1.2.4
i18n: Added Traditional Chinese (zh_TW), Korean (ko_KR), and Japanese (ja) translations — all strings 100% translated
1.2.3
i18n: POT file regenerated from source — 19 new strings added from v1.1.4–v1.2.2 (widget position labels, nav menu, meta box, new error messages, etc.)
i18n: French (fr_FR), Spanish (es_ES), and Portuguese Brazil (pt_BR) translations fully updated and compiled
i18n: All languages now 100% translated with no missing msgstr entries
Improved: Internal URL verification now uses WordPress core url_to_postid() instead of the cached content index — deleted pages are caught immediately, no transient staleness
Fixed: Home URL always passes validation even though url_to_postid() returns 0 for the site root
1.2.1
Fixed: External URLs (Google Maps, phone, email, social media) are now always allowed through the link validator — only internal site URLs are checked against the content index
System prompt updated: AI may construct external service URLs (e.g. Google Maps from an address) but must never invent internal site page URLs
JS isVerifiedUrl() now uses URL hostname comparison so external links are never suppressed
1.2.0
Fixed root cause of hallucinated links: nav menu item URLs are no longer embedded in the AI context text, removing the URL pattern the AI was using to construct non-existent sub-page links
Context instruction updated: AI is told to use only the exact “Source:” URL shown above each content block, never to construct or guess URLs
Server-side link stripping (strip_unverified_links) now runs on both AJAX and streaming paths before any response leaves PHP
Nav menu item URLs and home_url() added to verified URL set; wp_template_part excluded
Trailing-slash normalization in both PHP and JS URL comparison
1.1.8
Fixed: AI-generated source links validated against content index client-side; unverified URLs show as plain text only
Bare URL auto-linking removed from the chat widget
System prompt instructs AI to cite only URLs that appear verbatim in the provided content
1.1.7
Fixed: address/contact info in block-theme template parts (footer, header) now always indexed automatically — no checkbox required
Fixed: Custom Post Types were missing from the content-type checklist when registered with show_ui:true but not fully public; list now uses show_ui:true as the filter
Added no_found_rows:true to the content index query for better performance on large sites
Settings description now reminds to click “Refresh Content Index” after changing post type selection
1.1.6
Fixed grey scrollbar track visible in textarea input (overflow-y now hidden by default, auto only when text exceeds max height)
Fixed send button showing an empty circle with no icon (SVG stroke now set via explicit CSS stroke property scoped under .wpai-chat-widget to survive theme overrides)
1.1.5
Content index now automatically includes all widget areas (sidebars, footer widgets) and navigation menus
Added wp_template_part and wp_template as selectable content types for block themes (indexes footer/header templates)
Settings page notes which content is always auto-included
1.1.4
Added WordPress Multisite Network support: when network-activated, settings are managed from the Network Admin dashboard only; per-site logs remain per-site
Network admin menu shows all plugin settings; individual sites show only the AI Chat Logs page
All plugin options route through get_site_option() when network-activated
1.1.3
Added widget position setting: choose any corner of the screen (bottom-right, bottom-left, top-right, top-left)
Chat window automatically opens upward for bottom corners and downward for top corners
Visual corner picker in Settings > Widget Settings
1.1.2
Added streaming responses via Server-Sent Events (SSE) using curl WRITEFUNCTION for real-time output
Added conversation history (last 5 exchanges kept in context for all providers)
Changed chat input from single-line to auto-resizing textarea (Shift+Enter for newline)
Added token usage tracking: all providers now return token counts, logged to DB
Added Total Tokens stat card on the logs admin page
Added Export Logs as CSV button on the logs admin page
Added per-page widget visibility: hide the chat widget on specific posts/pages via a meta box
Added nightly WP-Cron job to automatically rebuild the content index
Code: Full PHPCS WordPress standard compliance (zero errors, zero warnings)
1.1.1
Fixed security issue: IP detection now uses REMOTE_ADDR only (spoofable headers removed)
Fixed security issue: API key sanitization regex updated to allow dots and colons (Mistral, Ollama)
Fixed cache key mismatch in content index refresh
Fixed missing wp_die() after all wp_send_json_*() calls
Fixed build_content_index() called with incorrect argument count
Fixed off-by-one error in content chunk count
Fixed empty system prompt fallback
Code: Full PHPCS WordPress standard compliance (zero errors, zero warnings)
Code: Yoda conditions, strict in_array(), wp_unslash() on all $_GET reads