Render custom per-chat model overrides in the model switcher instead of hiding them behind a generic Custom label.
Mark model override updates dirty so an already-open Web UI refreshes after CLI or Web UI changes, without exposing API key values in labels.
Add focused regression coverage for switcher rendering hooks and state-sync notifications.
Introduce a guided Cloud versus Local first-run modal with provider selection, account connection, model picking, and a ready state.\n\nAdd the reusable discovery auto-modal trigger, chat-created startup checks, onboarding-owned provider presentation metadata and assets, OAuth affordances, local provider guidance, and model-search hardening.\n\nKeep runtime provider data centralized while preserving onboarding-specific copy, logos, and docs links in the onboarding plugin.
Update onboarding.html
Update onboarding.html
Expose sanitized active main and utility model metadata through the model override endpoint, then render those names in the chat model switcher even when no preset override is active. Keep the inline model names hidden on narrow screens and cover the behavior with a regression check.
Refresh model names after settings save
Refresh the active chat model switcher after _model_config settings are saved so changes to main and utility models appear immediately. Extend the model switcher regression check to cover the save-refresh hook.
Surface the active Agent Profile beside the model preset switcher and let users switch profiles through the existing settings flow.
- add agent profile metadata to state snapshots
- list available profiles in the chat composer profile dropdown
- persist profile changes via settings_get/settings_set
- add a Create new Agent Profile action that opens a guided a0-create-agent chat
- rename the agent-profile creation skill/docs from a0-new-agent to a0-create-agent
- clean up fetchApi imports for related WebUI modules
- Add model switcher component for chat input with progress display
- Enhance model config store with active preset/model retrieval
- Show agent progress as ghost text in chat input placeholder
- Add agent artifact patterns to .gitignore
Move the browser model instantiation logic out of `_model_config` and into `_browser_agent` to properly invert the dependency direction.
This prevents the always-enabled `_model_config` plugin from taking a hard dependency on the optional `_browser_agent` module, ensuring it won't break if the browser module is removed or replaced.
- Change @extensible decorator to generate extension paths from full module and qualname hierarchies instead of flattened names
- Update extension path format from `{module}_{qualname}_{start|end}` to `_functions/<module>/<qualname>/{start|end}`
- Move all extension files to new deep directory structure under `_functions/` to match new path format
- Replace PathSpec.from_lines(GitWildMatchPattern, ...) with PathSpec.from_lines
- Remove browser_http_headers from model config (config, migration, UI, helpers)
- Add safe_call function to extract_tools.py to safely invoke functions with filtered args/kwargs
- Update call_plugin_hook to use safe_call for better parameter handling
- Add _apply_defaults_from_env to apply environment variable defaults to plugin configs
- Delete additional plugin asset folders when deleting plugins
- Remove
- Move allow_chat_override from chat_model to top-level configuration
- Update all references to use new config path
- Set default to true in default_config.yaml, false in migration
- Fix datetime parsing to handle timezone-less ISO strings by appending 'Z'
- Remove inline style from tune icon in config.html
- Reset presets to system defaults when "Default" is clicked in Configure Models (resetGlobalPresets() + backend reset action)
- Expand preset fields to full config parity: ctx_length, ctx_history/ctx_input, vision, rate limits, kwargs, browser_http_headers
- Extract _normalizePresets() helper inside store to eliminate duplication
- Hide "Edit Presets" link when Per-Chat Override is disabled
- Add Settings + API Keys navigation buttons to Model Presets page
- Add dynamic import guard for plugin-settings-store.js in cross-modal navigation buttons
- Rename model switcher label from "Default" to "Default LLM"
- Extract presets into global presets.yaml; move editor to plugin main screen
- Add project-wide override sync and three-layer permission checks
- Fix embedding change detection, new-chat inheritance, and preset name leak bugs
- Clean up dead imports/params and fix description text