Add user-configurable timezone and 12/24-hour preferences, then wire them through settings, runtime snapshots, scheduler payloads, wait handling, notifications, backups, memory, plugin metadata, and frontend formatters.
Keep UTC as the boundary for absolute instants while serializing user-facing dates in the configured or browser-resolved timezone. Preserve scheduler wall-clock inputs in the selected timezone, propagate TZ into desktop/runtime process environments, and restart active desktop sessions when the runtime timezone changes.
Cover the risky paths with timezone regression tests for settings normalization, auto and fixed timezone resolution, scheduler round-trips, memory timestamp conversion, and desktop timezone sync.
Split the legacy core speech stack into two built-in, independently toggleable plugins: `_kokoro_tts` for TTS and `_whisper_stt` for STT.
This refactor keeps dependency installation and bootstrap concerns in Docker/bootstrap/preload, while moving speech-specific tooling, APIs, prompts, UI, and runtime behavior into the plugins. Core now exposes engine-agnostic `tts-service` and `stt-service` brokers, with browser-native TTS preserved as the fallback when Kokoro is disabled.
Included in this change:
- add built-in `_kokoro_tts` plugin with plugin-owned synth API, config, status UI, and provider registration
- add built-in `_whisper_stt` plugin with plugin-owned transcribe API, mic runtime, device UI, prompt injection, and provider registration
- remove legacy core speech APIs/helpers/settings/UI and delete unused `webui/js/speech_browser.js`
- replace the old hardcoded speech settings section with a generic voice surface backed by plugin extensions
- update preload/docs/tests to match the new plugin-owned speech architecture
Behavioral intent:
- both plugins are built-in but not `always_enabled`
- users can now hot-switch TTS and STT independently
- browser TTS remains available when `_kokoro_tts` is off
- Whisper mic UI only appears when `_whisper_stt` is enabled
Introduce the shared surfaces frontend service and stylesheet so Browser and Desktop can register docked or floating live UI without special cases in modals.js. Update Browser and right-canvas integration to preserve active viewers across canvas/modal switches and avoid creating blank tabs unless explicitly requested.
Adds an x-extension injection point inside <head> so plugins can
inject <script> and <link> tags at page load time. This enables
plugins to load vendor libraries (e.g. mermaid.js, custom fonts)
via the standard extension mechanism rather than dynamic DOM
manipulation from JS extension hooks.
Consistent with existing sidebar-start and sidebar-end extension
points. Zero impact on existing functionality.
- Simplified task detail opening logic by integrating it into the `settingsModalStore`
- Updated the visibility condition for the task detail view in `scheduler-task-detail.html` to rely solely on the selected task state
rm attributes from components
simplify task display logic
settings components init
scheduler componentize
- Removed the inline scheduler settings script from `index.html` and replaced it with a new component structure in `scheduler-settings.html`, `scheduler-task-editor.html`, `scheduler-task-list.html`, and `scheduler-task-detail.html`.
- Introduced a dedicated `scheduler-store.js` to manage state and logic for the scheduler, enhancing maintainability and separation of concerns.
- Updated the `index.js` to remove the now obsolete `openTaskDetail` function, integrating task detail handling within the new store.
- Removed the deprecated `scheduler.js` file, consolidating functionality into the new component architecture.
settings modal store rename
- Replaced all instances of `$store.settingsModalStore` with `$store.settingsStore` across various settings components.
scheduler tab content x-if
Adressed:
1) When selecting memories using checkbox, it unchecks one second later automatically (Brave+Firefox)
2) Area filter does not work. When All is selecter, it shows me memories from fragments, solutions, etc., but when I select an area, no memories are shown.
3) Modal does not have a title, it shows a path
4) In light mode, buttons and some labels are almost invisible - we should not use custom colors anywhere, we should always use one of the color vars in the screenshot, those are automatically adjusted based on current theme. Also in light mode there's a lot of gray areas that blend, again, we should use our color vars.
5) The loading spinner is stretched into an oval
6) We should merge the first div (title and memory counts) with the third one (pagination) to save space. + we should also show the total number of memories in the DB (unfiltered, just the total count of docs)
7) Action buttons should stack vertically, we can remove the title to make it more narrow
8) We should not use emojis for icons, they break the design, it's used in the source badge (knowledge, conversation...)
* feat: add username hidden field to api keys
* fix: do not read api_keys from backend and only save new
* feat: treat api_key filds as plaintext
---------
Co-authored-by: Rafael Uzarowski <uzarowski.rafael@proton.me>
Replace plain text copy buttons with modern icon-based action buttons featuring:
- Material Design icons for copy and text-to-speech actions
- Responsive behavior: hover on desktop, tap on mobile
- Visual feedback for success/error states
- Speech synthesis integration with existing speech store
- Viewport-aware positioning for long messages
- Modern Clipboard API with execCommand fallback
- Full accessibility support with ARIA labels and keyboard navigation
Files added:
- webui/components/messages/action-buttons/message-action-buttons.js
- webui/components/messages/action-buttons/message-action-buttons.css
- webui/components/messages/action-buttons/README.md
- webui/js/message-interactions.js
Files modified:
- webui/js/messages.js (integrate new component, remove legacy functions)
- webui/css/messages.css (deprecate old copy button styles)
- webui/index.html (add component CSS import)
The implementation follows Agent Zero's modular component architecture and maintains backward compatibility during the transition period.