-
Notifications
You must be signed in to change notification settings - Fork 5
Changelog
Tom Caswell edited this page Apr 12, 2026
·
19 revisions
-
Widget static labels now retranslate when a student switches language inside the drawer. Previously, every mustache
{{#str}}lookup inchat_widget.mustacherendered once at page load in the Moodle user's language and stayed frozen. Switching language from the settings panel only updated the input placeholder and conversation starters; bottom tabs (Chat/Voice/Notes), voice panel title and copy, history panel, header tooltips, footer buttons, and LLM picker labels all stayed English. - Added
amd/src/i18n_strings.js: a bundled 46 language translation table for every static widget string. Missing keys fall back to English. -
chat.jsnow tags the widget DOM withdata-i18n-*attributes at init time and applies the current language immediately. The same pass fires on every language switch in both the compact language picker and the in drawer settings panel. - The fix ships via the CDN bundle (
sola.min.js), so Saylor production running v3.4.4 picks up runtime translation on the nextcdn_versionbump without a plugin reinstall. - Covers: bottom tab labels, voice mode card (title, copy, ready status, start/end labels), Notes/History panel (title, subtitle, Saved/Recent views, empty states), header action tooltips (change avatar, settings, clear, reset, close), language suggestion banner, starters container aria label, footer Usability Testing and Feedback buttons, LLM picker labels, mic and send buttons, input placeholder.
- Removed the "SOLA:" prefix from every admin page display name so other institutions can use the plugin without Saylor-specific branding in the admin tree. The 7 settings pages now show as General, AI Provider & Models, Content & RAG, Safety & Moderation, Engagement, Branding & UI, Integrations & Delivery. The 4 external tool pages show as Survey Editor, Usability Testing Editor, Rubric Editor, WhatsApp Integration Test.
- The top level admin category is now titled "AI Course Assistant" (from
get_string('pluginname', ...)) instead of "SOLA (AI Course Assistant)". Student facing branding in the widget header still respects theshort_nameadmin setting, which defaults to "SOLA" for Saylor and can be overridden per install. - Stable section identifiers (
local_ai_course_assistant_general, etc.) are unchanged. URLs, bookmarks, and the self-updater all keep working.
-
Section error when clicking Global AI Settings from the wrench icon or Back to Settings links. The v3.4.4 settings restructure replaced the single
local_ai_course_assistantadmin settings page with a category of the same name containing 7admin_settingpagechildren. 9 PHP admin pages still linked to the old/admin/settings.php?section=local_ai_course_assistantURL, which no longer resolves to an admin node and throwserror/admin/sectionerror. Updated every link to/admin/category.php?category=local_ai_course_assistantinstead, which lands on the plugin category page showing all 7 sub pages. Affected files:course_settings.php,rag_admin.php,update_admin.php,analytics.php,usertesting_admin.php,rubric_admin.php,survey_admin.php,integrity_admin.php,starter_settings.php. -
Defensive registration of Catalyst's WhatsApp Integration Test admin page. Catalyst's fork adds
whatsapp_test.phpwhich callsadmin_externalpage_setup('local_ai_course_assistant_whatsapptest'). The v3.4.4 settings restructure wiped that registration when Catalyst merged it, causingerror/admin/sectionerroron their staging.settings.phpnow registers the page conditional onfile_exists(whatsapp_test.php), so upstream installs without the file build a valid admin menu while Catalyst's fork works without a local patch.
-
Adaptive thinking support for Claude models. When enabled via the new "Extended Thinking (Claude only)" admin toggle (AI Provider & Models page), SOLA sends
thinking: {type: "adaptive"}to the Anthropic API. Claude decides when and how much to reason through a problem before answering. Thinking content is filtered out of the student facing response (streaming and non streaming). Temperature is forced to 1 when thinking is active (API requirement). Other providers ignore the setting. - Minimum
max_tokensraised to 8192 when thinking is on to provide headroom for reasoning tokens.
-
System prompt now uses Anthropic prompt caching. The system prompt is sent as a structured array with
cache_control: {type: "ephemeral"}instead of a plain string. This enables server side prefix caching across all requests in the same course. Previously, every SSE chat request paid full input token cost for the system prompt even though the text was identical across users. - Token usage now captures
cache_creation_input_tokensandcache_read_input_tokensfrom both streaming and non streaming responses, surfaced inget_last_token_usage(). - Beta header
prompt-caching-2024-07-31included automatically.
-
Quiz generation now uses provider native structured output instead of relying solely on
<quiz>JSON</quiz>delimiter prompting. For Claude, this uses the tool_use pattern with a forced tool_choice. For OpenAI compatible providers (OpenAI, Gemini, DeepSeek), this usesresponse_format: {type: "json_schema"}. - Response parsing cascades: structured JSON first, then
<quiz>regex fallback, then raw JSON. Backward compatible with providers that do not support structured output (Ollama, Groq, etc.). - New
get_quiz_json_schema()method defines the canonical quiz schema withadditionalProperties: falsefor strict validation.
-
Ollama endpoint changed from
/api/chatto/v1/chat/completions(the OpenAI compatibility layer). The native/api/chatuses NDJSON streaming, which is incompatible with the SSE parser inopenai_compatible_provider. This was a latent streaming bug: Ollama chat would silently fail or produce no output.
-
deploy_dev.pynow accepts--target {dev,405,500,501,all}. Default staysdev(dev.sylr.org).--target alldeploys to dev, dev405, dev500, and dev501 in sequence with a single tarball and S3 upload. The tarball is extracted into a per target scratch dir so parallel rsync does not collide.
- Both
ci.ymlandcdn-deploy.ymlnow setFORCE_JAVASCRIPT_ACTIONS_TO_NODE24: trueto suppress the Node.js 20 deprecation warning and opt in early before the June 2 enforcement date.
-
Admin settings split into 7 focused pages under a SOLA category (Site admin: Plugins: Local plugins: SOLA).
Replaces the previous single scrolling page plus experimental JS tab hack.
- General: enabled toggle, version banner, remote config URL
- AI Provider & Models: provider, API key, model, temperature, system prompt, max tokens, history, starter editor link, token analytics link
- Content & RAG: RAG toggle, embedding provider settings, chunk and top-k tuning, RAG admin link, performance content caps
- Safety & Moderation: quiz hide, off-topic detection, wellbeing, integrity checks
- Engagement: study plans, email and WhatsApp reminders, voice mode and realtime settings, surveys, usability testing, practice scoring rubrics
- Branding & UI: institution name, display name, welcome message, chat greeting, display mode, position, avatar and colors
- Integrations & Delivery: FAQ and Zendesk, Redash export, CDN delivery, plugin self-update
- All 7 editor pages (Starter Editor, Survey Editor, Usability Testing Editor, Rubric Editor, RAG Index, Plugin Updates, Integrity Checks) now live under the same SOLA category in the admin tree.
- Direct links to legacy
/admin/settings.php?section=local_ai_course_assistant404. Admins should use the SOLA category or any of the newlocal_ai_course_assistant_*section names. - All 92 existing setting fields and their saved values are preserved. No DB migration.
-
Fatal curl class not found on update_admin.php and rag_admin.php reindex path.
\curlis not auto-loaded by Moodle. Addedrequire_once($CFG->libdir . '/filelib.php')inside every class method that creates a\curlinstance (plugin_updater,reminder_manager,zendesk_client,embedding_provider\base_embedding_provider,provider\base_provider). Previously these silently failed on cold includes. - Removed the obsolete JS tab navigation hack and duplicated top save button script from the single settings page, now redundant with the native multi page layout.
- Smoke tested all 9 admin pages (7 settings pages and analytics, token analytics, rubric editor, survey editor, usability testing editor, RAG admin, update admin, integrity admin, starter settings) via authenticated HTTP: all return 200 with zero errors and zero warnings.
- Verified every analytics method, every manager class (survey, usertesting, rubric, token cost) runs without argument or signature errors.
- Replaced 17 hardcoded English strings in the widget template with Moodle string lookups: language suggestion banner aria labels, debug panel buttons (Refresh, Copy all, Close), voice panel title, Notes tab saved subtitle and empty state, history Saved and History tabs, LLM provider and model picker labels, and footer Usability Testing and Feedback links.
- Added 17 new
chat:*string keys to the English language file and translated all of them into the other 45 supported languages. - Backfilled
chat:starter_help_page,chat:starter_ask_anything, andchat:starter_review_practicein 41 language files that previously fell back to English. - Approximately 925 new or backfilled translation strings across the full 46 language set.
- Fixed a bug where conversation starter buttons did not re-translate when the student picked
a different language at runtime. The client side gate was checking
data-translatable, which the server template never emitted. Switched the gate todata-builtin, which the template already emits correctly. Also addeddata-builtin="1"to the fallback starter buttons rendered whenstarter_managerreturns no data.
- Fixed Conversation Practice and Pronunciation Practice clicks appearing to do nothing on non secure contexts (plain HTTP served over a LAN IP). The preconditions check ran after the UI already switched to voice mode, and the error message was routed through the chat message area which is hidden in voice mode. Reordered the checks to run before the mode switch and routed errors through the visible notification toast.
- Renamed "Help With This" to "Explain This Page" and "Quiz Me On This" to "Quiz Me"
- Quiz topic picker filters out non-content sections (enrollment, certificate, feedback, survey, etc.)
- Learning Objectives picker now extracts real objectives from "Unit X Learning Outcomes" pages (supports GENERICO tags, HTML lists, and plain text)
- Updated starter label translations in all 46 languages to match new concise button style
- Voice mode SSE calls now include page context (pageid, pagetitle) so AI responses are relevant to the current lesson
- Fixed voice transcript ordering: user and assistant messages now appear in correct chronological order
- Voice tab toggle is now per-course (Inherit global / Force On / Force Off in course settings)
- New admin settings: Max Content Per Resource and Max Total Content (Performance tab) for tuning response speed vs context
- Defaults: 1,500 chars/resource, 15,000 total (previously hardcoded at 3,000/40,000)
- RAG retriever caches decoded embedding vectors in memory (avoids repeated JSON decoding)
- Input placeholder translates when language is switched (15 languages supported)
- Notification confirms language change
- English Lock fixed: when enabled per course, frontend forces English, disables language picker, shows "(Locked)" label, and blocks language changes in settings panel
- Chat widget title now uses the configured short name instead of hardcoded "SOLA" lang string
- All
chat:titlereferences in the template replaced with dynamic{{shortname_label}} - New admin setting "Enable Voice Tab" (off by default) controls visibility of the Voice tab in bottom navigation
- Voice starters (Conversation Practice, Pronunciation Practice) remain separately controlled via Starter Settings
- Settings page now has tabbed navigation (General, AI Provider, RAG, Quiz, Safety, Study Plans, Branding, FAQ & Support, Voice, Updates, CDN, Analytics Export, Integrity, Surveys, Practice Scoring, Usability Testing)
- Default avatar border color updated to #152233
- Added Mistral AI (default model: mistral-large-latest)
- Added Groq — ultra-fast inference for open-source models (default: llama-3.3-70b-versatile)
- Added OpenRouter — unified API for 500+ models from 60+ providers (default: openai/gpt-4o)
- Added xAI (Grok) (default model: grok-3)
- SOLA now supports 11 LLM providers total
- Model field now defaults to blank — each provider's built-in default is used automatically and stays current as models update
- 404 errors now show which model failed and what the correct default is
- Automatic fallback: misspelled or deprecated models retry with the provider's default so students are never blocked
- Fallback events logged in audit trail
- Rate card expanded to 40+ model prefixes across all 11 providers
- TTS calls (tts-1) now log approximate token usage for cost tracking
- Whisper transcription calls now log usage
- Embedding API calls now log actual token counts from the OpenAI response
- Rate card includes: OpenAI Realtime voice, TTS, embeddings, Whisper, Gemini, Mistral, Groq, xAI, MiniMax
-
prefers-reduced-motionsupport: all animations/transitions disabled for vestibular disorder users -
prefers-contrast: moresupport: increased borders for high contrast mode - All font sizes converted from px to rem for proper text scaling
- Minimum font sizes raised to meet WCAG readable thresholds
- Focus-visible indicators (3px blue outline) on all interactive elements
- Tab focus trapping in drawer modal
- aria-live on typing indicator for screen reader announcements
- aria-invalid on input during error states
- aria-labels on language banner buttons
- contentEditable mode announced to screen readers
- Color contrast improvements across all UI elements
- Default brand color changed from #173140 to #023e8a (matches learn.saylor.org)
- Fixed drawer flash on page load (CSS visibility guard)
- Removed "Ask Anything" starter (redundant with typing)
- Removed "Review & Practice" starter (confusing overlap with Quiz)
- Conversation Practice and Pronunciation Practice disabled by default (admin enables per-course)
- Starters simplified to 4: Help With This, Quiz Me, Study Plan, AI Project Coach
- Analytics dashboard tabs moved to top of analytics page (above course list)
- 7 tabbed analytics sections: Overall Usage, By Course, AI vs Non-Users, By Unit, Usage Types, Themes, AI Feedback
- Chart.js visualizations (line, bar, doughnut, pie, grouped bar charts)
- Per-message thumbs up/down ratings with hallucination flagging
- AI vs non-users comparison (completion rates, grades, time to completion from Moodle core)
- Usage by unit/section with progression tracking
- Interaction type tracking (chat, voice, quiz, practice)
- Keyword/concept extraction with category tagging (concept vs navigation/UX)
- Messages-to-resolution analytics
- CSV export for all tabs
- 9 new web service endpoints for lazy-loaded AJAX data
- 2 new database tables (msg_ratings, keywords) + 2 new columns on msgs (interaction_type, cmid)
- New character illustrations for avatars 02-10
- Added Mistral AI (default model: mistral-large-latest)
- Added Groq — ultra-fast inference for open-source models (default: llama-3.3-70b-versatile)
- Added OpenRouter — unified API for 500+ models from 60+ providers (default: openai/gpt-4o)
- Added xAI (Grok) (default model: grok-3)
- SOLA now supports 11 LLM providers total
- Model 404 fallback: misspelled or deprecated models automatically retry with the provider's default
- New: Optional CDN mode serves JS and CSS from an external CDN (e.g. GitHub Pages) instead of Moodle's filesystem, enabling frontend updates without a plugin upgrade or hosting provider involvement
- Mini AMD loader bundles all 10 JS modules + shims for
core/ajaxandcore/strinto a singlesola.min.js(224KB) - CSS minified to
sola.min.css(73KB) - Two new admin settings: CDN Base URL and CDN Asset Version (cache busting)
- i18n strings pre-loaded as JSON in the template for CDN mode
- GitHub Actions workflow (
cdn-deploy.yml) auto-deploys to gh-pages on push - Clearing the CDN URL instantly reverts to local AMD files (zero-risk fallback)
- Replaced avatar SVGs (02-10) with optimized 120x120 PNGs (13-22KB each, down from 150-423KB)
- Removed unused pix assets (icon.svg, saylor_logo.svg, old avatar_01 files)
- Removed Expand chat button from the header — the chat window is now fixed at its default or user-resized size; expand/collapse state is no longer persisted to localStorage
- Cleaned up associated CSS (
.local-ai-course-assistant__drawer--expandedstyles, icon toggle rules) and all 46 language string files (chat:expand,chat:collapse)
- Fixed
install.xmlembedding field:TYPE="longtext"→TYPE="text"— plugin can now install on fresh Moodle instances
- Privacy provider now declares all 9 personal data tables (was 4)
-
delete_data_for_user()now covers_feedback,_survey_resp,_ut_resp,_audit,_practice_scores - Fixed
delete_data_for_users()asymmetry — now mirrors single-user deletion -
export_user_data()exports study plans, reminders, feedback, and survey responses
- All camelCase PHP variables renamed to snake_case (Moodle standard)
- PHPDoc blocks added to all
classes/external/public methods - Hardcoded English strings replaced with
get_string()insse.php,tts.php,reminder_manager.php
-
userid_courseidindex on_convstable set toUNIQUE -
get_or_create_conversation()wrapped in try/catch for concurrent requests - Upgrade deduplicates existing conversations and migrates orphaned messages
-
course_settings.phpuses course context instead of system context (fixes breadcrumbs) - Removed
create_demo_course.phpfrom production package
- Fully white-labeled: all hard-coded "Saylor" references replaced with
{INSTITUTION}placeholder - Institution name flows from admin setting → PHP → mustache → JS runtime substitution
- Default remains "Saylor University" via the
institution_nameadmin setting - Plugin name changed to "Online Learning Assistant (SOLA)"
- Removed duplicate (dead)
chat:greetingentries from all non-EN lang files
- Reordered default starters: Help With This, Quiz Me On This, Ask Anything, Review & Practice, Study Plan, AI Project Coach, Conversation Practice, Pronunciation Practice
- New AI Project Coach starter with rocket icon — guides students through AI-assisted project work
- Renamed starters: "Help With This Page" → "Help With This", "Quiz Me" → "Quiz Me On This", "Practice Speaking" → "Conversation Practice"
- All 46 language translations updated for renamed and new starters
- Source attribution link on bottom-left, action buttons (copy/bookmark/TTS) on bottom-right of each AI response
- Bookmarks now include source attribution links; displayed in History > Saved panel with same left/right layout
- "Stop reading" button appears below messages during TTS playback so users can interrupt audio
- Word highlighting sync fixed: word-weighted timing model replaces linear character interpolation for accurate tracking
- HTMLAudio fallback now uses requestAnimationFrame (~60fps) instead of timeupdate (~4fps) for smoother highlighting
- Swipe right on the drawer to close the SOLA widget on mobile devices (single-finger, ≥80px horizontal)
- SOLA_NEXT tags stripped during streaming so they never appear in the typewriter animation
- Welcome-back message suppressed for short absences (requires 1+ hour away)
- Always-visible stop button in a fixed slot outside the scrollable area — visible before and during streaming
- SOLA_NEXT suggestion chips auto-scroll into view
- Scroll-to-bottom button click handler fixed for reliable scrolling
- History tab renamed to Notes with bookmark icon
- Title changed to "Notes and Conversation History"
- Saved is now the default view (was Recent)
- Saved items are editable: double-click or Edit button to modify text, Enter to save, Esc to cancel
- Recent items now show Copy and Save buttons plus source attribution links
- All 46 language translations updated
- AI-generated score cards after conversation and pronunciation practice sessions
- Per-criterion scores (1–5) with progress bars and individualized feedback
- Overall score with encouraging summary message
- "Practice Again" / "Done" action buttons on score cards
- Customizable scoring rubrics via admin editor (
rubric_admin.php)- Global default rubrics for conversation (5 criteria) and pronunciation (4 criteria)
- Per-course rubric overrides with scope selector
- Draggable criterion cards, add/remove/reorder, live preview
- Reset to defaults or remove course overrides
- Scores saved to database for future analytics
- Scoring prompt instructions added to system prompt (
context_builder.php) -
[SOLA_SCORE]tag pattern (stripped during streaming, parsed on completion) - New web services:
get_rubric,save_practice_score - New DB tables:
rubrics,practice_scores - Enable/disable via admin setting
practice_scoring_enabled
- Voice tab labeled "(Experimental)" to set user expectations
- Removed small End button from voice overlay — only the main Stop button remains
- ELL voice exchanges shortened to 1–2 sentences max for natural turn-taking
- AI finishes speaking before expecting a response (no overlapping speech)
- All hardcoded "SOLA" references replaced with configurable
shortnamefrom admin settings - Short name flows through
data-shortnameattribute from PHP → mustache → JS - Voice overlay, intro modal, greeting, and email export all use the configurable name
- Default remains "SOLA"
- Updated intro modal with white-labeled display name
- CTA button changed from "Let's get started →" to "Continue →"
-
deploy_dev.py: added upgrade safety net (re-checks for pending upgrades after main loop) -
deploy_dev.py: version verification step confirms deployed version matches expected
- Welcome screen restored: first-time intro modal was broken by a callback that permanently hid starters
- Toggle button pulse restored: fixed CSS transition/animation conflict that suppressed idle and first-visit pulse
- Re-clicking the Chat tab shows conversation starters for quick topic selection
- Header icon spacing fixed (gap between wrench and analytics buttons)
- Bulk actions with checkboxes: enable/disable SOLA and Usability Testing for selected courses
- Sortable columns, status filters, and course search on the main course list
- "Back to All Courses" navigation link on per-course analytics view
- Renamed "User Testing" to "Usability Testing" throughout the plugin and documentation
- Compact input field height (reduced composer padding and gap)
- Removed duplicate thumbs-up feedback button from header
- In widget testing panel with 8 default tasks (concept explanation, follow ups, quiz, off topic handling, overall value, feature wishlist, recommendation, settings usability)
- Step through flow with progress bar, "Go to SOLA" pause button, and completion screen
- Each response auto captures message count and session duration
- Results displayed in analytics dashboard with per task breakdowns
- Fully customizable via admin task editor (drag reorder, type switching, per course overrides)
- External form link option with
{{userid}},{{courseid}},{{messages}},{{session_minutes}}placeholders
- New "AI Insights" section on per course analytics page
- One click AI analysis of feedback, survey, and usability testing data
- Returns structured report: key issues, feature requests, positive highlights, and prioritized recommendations
- New
institution_nameadmin setting under Branding (default: "Saylor University") - System prompt uses
{{institution}}placeholder - Avatar label uses the setting across all 46 language files
- Toggle button acts as Home when drawer is already open (shows starters instead of closing)
- Stop button appears during SSE streaming so users can interrupt long responses
- Voice VAD threshold increased (0.012 to 0.02) and silence duration extended (1.7s to 2.1s) to reduce false triggers
- Email address field in settings panel now editable (was read only)
- Source attribution prompt strengthened to prefer specific activity links over generic course links
- Disable All / Enable All bulk toggle buttons on analytics course list
- Course search/filter input to quickly find specific courses
- All translation layers at 46 languages (added Hebrew starter prompts)
- New tables:
_ut_tasks,_ut_resp
- New:
get_usertesting,submit_usertesting_response,generate_insights
- Rating question now shows "1 is worst, 5 is best" labels (min_label/max_label support)
- New survey question editor admin page: drag reorder, live preview, per course overrides, reset to defaults
- Survey frequency control respects admin setting (once/monthly/quarterly/unlimited) instead of one time only
- Source pills now link to the specific course activity page instead of the generic course page
- New
[SOURCE:activity:CMID]tag format with module lookup from SSE metadata - SSE meta event includes modules map (cmid to URL/title) for activity level attribution
- System prompt now describes all settings panel features (reminders, language, coaching style, avatar)
- AI correctly directs students to the gear icon for setting up phone numbers, email reminders, etc.
- Fixed survey question editor POST handling and admin page registration
- Student survey tool: configurable in chat survey with multiple choice, rating, and long text questions
- Survey results displayed in analytics dashboard with per question breakdowns
-
get_surveyandsubmit_survey_responseweb service endpoints - Survey trigger after configurable number of chat messages
- New tables:
_surveys(survey definitions) and_survey_resp(individual responses)
- SOC2 audit logging: action audit trail with IP, user agent, and details
- New
_auditdatabase table for compliance tracking
- Renamed "Saved Responses" to "My Saved Content"
- Bookmark badge changed to dot indicator (no counter)
- Each saved item shows date, source link, and expanded text preview
- Action buttons: Copy, TTS (read aloud), Edit (send to chat), Remove
- Source URLs from course content saved with bookmarks
- Added translated AI prompts for 19 additional languages (bg, cs, da, nl, fi, de, el, hu, it, ja, ko, nb, pl, ro, sk, sv, th, tr, uk)
- Total starter prompt translations: 45 languages (was 26)
- Clicking a starter chip now sends the prompt in the selected language when UI is non-English
- Full support: SUPPORTED_LANGS, STARTER_LABELS, STARTER_PROMPTS
- Model updated from deprecated gpt-4o-mini-realtime-preview to gpt-realtime-mini
- Fixed GitHub Actions smoke test workflow permissions
- Bookmarks header button with dedicated dropdown panel (moved out of user settings)
- TTS audio caching: repeat plays are instant (no repeat API call, 20 entry cache)
- Clickable source attribution pills: "From: Current Page" and "From: Course Materials" link to actual content
- Redash analytics export endpoint (
redash_export.php) with API key authentication - Translated conversation starter prompts (26 languages)
- Language selector clarified as "SOLA Language" with explanatory description
- SOURCE tag regex handles whitespace variations, preventing bracket leaks
- More permissive SOLA_NEXT tag stripping
- SSE metadata event emits page/course URLs for source link resolution
- New
redash_api_keyadmin setting under Analytics Export section
- Self update mechanism: check for and install updates directly from the plugin admin interface
- Automated integrity monitoring: 10 daily health checks with email reporting
- Enhanced admin settings with descriptive help text and top save button
- Starter settings help documentation with collapsible guide
- Course settings info box explaining override behavior
- Plugin Updates page with version comparison, release notes, and one click install
- Integrity Monitoring page with on demand checks and results table
- Moodle mobile app support via
db/mobile.php - Four web services flagged for
MOODLE_OFFICIAL_MOBILE_SERVICE - Ionic template with message list, quick chips, and typing indicator
- Fixed
db/messages.php: replaced removedMESSAGE_DEFAULT_LOGGEDIN/MESSAGE_DEFAULT_LOGGEDOFFconstants withMESSAGE_DEFAULT_ENABLED(Moodle 4.5+ compatibility)
- Drawer pushes page content aside on desktop instead of overlapping
- Fix mic activation
- Fix SOLA_NEXT tag leak
- Fix eraser icon
- Custom welcome/greeting messages
- Drawer CSS fixes
- Voice chip fix
- "I only have N minutes" quick mode with time constrained responses
- Extended re engagement (5+ day absence) with warmer welcome and refresher chips
- Progress awareness via Moodle completion API
- Struggle detection with automatic tone shift
- First generation student support toggle
- Spaced repetition nudges for topics studied 3 to 14 days ago
- Coaching style preference (settings panel dropdown)
- Crisis/distress detection with wellbeing resources
- Study break reminders after 30 messages
- Quiz encouragement messages based on score
- Multi provider AI backend with SSE streaming
- Practice quizzes with score tracking
- 26 language UI, 43 language STT/TTS
- OpenAI Realtime voice mode
- SVG avatar system
- Study plans and reminders
- RAG semantic search
- Analytics dashboard
- Draggable, resizable widget
- Conversation starters
- Copy, bookmark, and read aloud on messages
- Study streaks
- Message timestamps
- Typewriter animation