Remove memory-plugin assumptions from root and non-plugin DOX contracts so disabled plugins are not implied as available runtime behavior.
Keep the memory plugin documented only in its owning plugin subtree and mark it optional from the parent plugin index.
Set the bundled model config, Balance preset, and onboarding OpenRouter default to anthropic/claude-sonnet-5. Refresh the model config README example to match.
Stop seeding stale Codex OAuth model metadata so connected accounts use the upstream /models response instead of the retired gpt-5.2-codex default.
Use gpt-5.5 as the Codex proxy fallback model, omit the fake legacy client version when Codex CLI is unavailable, and remove the stale Copilot fallback entry.
Add focused OAuth regressions for the current default model, upstream model-list behavior, and Copilot fallback ordering.
Update first-run onboarding docs for the welcome screen, in-chat model gate, Cloud/AI account/Local provider paths, and explicit main and utility model choices.
Replace stale onboarding screenshots with optimized current assets and add gate, account, and local-provider captures.
Remove composer blocking so sends always create or enter a chat and route missing-model messages through the in-thread gate.
Make Utility model selection explicit by removing same-as-main sync and defaulting to each provider's utility model when available.
Compact onboarding success channel cards and update static regressions for the new onboarding/gate behavior.
Replace the separate Cloud/Local illustrated path screen with a single provider step that switches between Cloud, Account, and Local choices.
Route the first-send gate account choice through onboarding, remove the old Cloud/Local card assets, and keep model setup in the existing onboarding flow.
Update static onboarding and welcome composer regressions for the merged provider step.
Stop auto-populating Main and Utility models when an OAuth account is already connected or newly connected.
Add a connected-account gate state that routes users to model configuration instead of choosing provider defaults silently.
Update OAuth notifications, chat gate copy, DOX contracts, and focused static regressions for the explicit model-selection flow.
Move missing-model setup out of the welcome screen and into an in-thread gate that preserves the pending prompt, survives refresh, and auto-dispatches after a usable model is configured.
Reuse existing onboarding, OAuth account settings, and advanced model configuration surfaces instead of duplicating provider forms. Connected OAuth accounts can now populate Main and Utility defaults when no chat model is configured.
Update model readiness checks, focused static regressions, and DOX contracts for the new deferred setup flow.
Detect LiteLLM JSONDecodeError failures caused by the Responses mock streaming iterator trying to parse a real SSE stream.
Fall back to Chat Completions before any output is emitted, keeping custom OpenAI-compatible proxy prefixes provider-neutral.
Add a regression test for SSE-shaped JSON decode failures and update the transport DOX contract.
Verified with: PYTHONPATH="/home/eclypso/a0/agent-zero" conda run -n a0 pytest tests/test_stream_tool_early_stop.py tests/test_responses_architecture.py -q; PYTHONPATH="/home/eclypso/a0/agent-zero" conda run -n a0 python -m py_compile helpers/litellm_transport.py; docker exec -i -w /a0 9c436228a4a2 /opt/venv-a0/bin/python -m py_compile helpers/litellm_transport.py; git diff --check.
Mark message action button chrome as non-selectable so copy/paste captures message text without toolbar icon labels.
Add a static regression for the shared action-buttons stylesheet.
Render file action menus outside the scroll container with fixed positioning so dropdowns remain visible while file list scrolling stays intact.
Deduplicate component body assets during x-component loading and add regressions for the menu, opaque header, and duplicate scoped styles.
Only treat top-level JSON objects as tool roots during streaming, so a complete nested tool_calls item cannot end the stream before the parallel wrapper closes.
Add regression coverage for partial parallel wrapper snapshots.
Switch the chat composer to a Markdown-backed contenteditable editor so typing a triple-backtick fence and pressing Enter creates a visual code block while pasted fenced Markdown stays plain text.
Serialize visual code blocks back to fenced Markdown for send/history, keep full-screen input in sync with the backing store, and update the focused composer regression plus DOX contract.
Mark chats after successful persistence and reconcile saved chat IDs while building WebUI state snapshots so stale in-memory contexts disappear after their chat files are removed.
Keep fresh unsaved chats visible, skip running contexts, and cover the regression with snapshot and persistence tests.
Fall back to Chat Completions for provider/proxy Responses endpoint failures before any output is emitted.
Preserve streamed Chat Completions tool-call deltas as structured LLMResult function-call items, so fallback providers can still drive tools.
Document Docker host-gateway addressing for local model servers, where container localhost does not reach host loopback.
Verified with: PYTHONPATH="/home/eclypso/a0/agent-zero" conda run -n a0 pytest tests/test_stream_tool_early_stop.py tests/test_responses_architecture.py -q; PYTHONPATH="/home/eclypso/a0/agent-zero" conda run -n a0 python -m py_compile helpers/litellm_transport.py helpers/llm_result.py; git diff --check.
Normalize memory_load threshold and limit values from model calls before vector search so numeric strings from Responses tool arguments do not reach FAISS unchanged.
Add a focused regression covering string threshold/limit values and document the memory plugin contract.
Notify users when automatic chat renaming cannot reach the Utility Model, while keeping the rename task best-effort. Normalize saved generated titles, mark WebUI state dirty after successful saves, and cover the success and failure paths with focused tests.
Refresh the root README download table from A0 Launcher v0.9 to v1.0 asset URLs and point the release-note link at the v1.0 release page. This commit intentionally sits after the v2.1 tag without moving the tag.
When Responses mode accepts a plain-text final answer, reuse the active generating log item as a finished response entry so the WebUI does not remain on the Calling LLM step.
Skip normal tool JSON and existing live response-tool logs, and cover the fallback with focused regression tests.
Ensure function parameter schemas include an explicit properties object before Responses requests are dispatched through LiteLLM.
Keep prompt/MCP permissive schemas compatible with stricter OpenAI-compatible chat validators and cover chat, legacy function, and native Responses tool inputs with regressions.
Treat full log snapshots as authoritative replays by clearing the message DOM when the snapshot starts at log no 0, then render logs in backend order. This prevents streamed responses from staying above earlier welcome/user messages after sync races while keeping incremental updates patch-based.
Let backup creation and restore cleanup use unlimited pattern scans so archives for agents with more than 50,000 files are complete. Keep UI preview and dry-run paths bounded for responsiveness while making the dry-run truncated flag safe for optional limits.
Add regression coverage for unlimited scans, backup creation, clean-before-restore, and restoring an archive entry past the old 50,000-file boundary.
Restore parallel normalization tolerance for provider/model outputs that stringify the tool_calls array inside tool_args.
The wrapper still expects normal tool-call objects after decoding, so nested parallel and document_query guards continue to run through the same validation path.
Keep fallback for endpoint-specific and Venice-style Responses payload rejections, but stop treating generic Bad Request validation text as proof that Responses is unsupported.
Add a regression that generic pre-output Responses 400s raise without trying Chat Completions.
Keep the valid-tool-root preference added for streamed snapshots, but avoid collecting and re-walking parsed candidates.
Remember the first parsed object/root while scanning and use a small predicate for tool-request recognition.
Keep the malformed SKILL.md warning behavior, but reduce the diagnostic machinery to a once-per-path warning with line numbers only for parser-owned structural errors.
Update the regression to assert the stable warning message without depending on the previous path/line/error dedupe key.
Keep the streaming early-stop caller untouched by making extract_json_root_string prefer the first complete JSON root that normalizes as a tool request while preserving its first-root fallback for non-tool JSON.
Add regression coverage for incidental JSON before a streamed tool-call envelope.
Default empty skills_tool calls to list, accept legacy method as a deprecated action alias, and warn when malformed SKILL.md frontmatter causes a skill to be skipped. Update the helper/tool DOX notes and focused regressions.
Save MCP image and image-resource payloads as scoped artifacts, return their paths in tool text and attachment metadata, and keep them model-visible through raw image history content. This gives downstream media delivery a real file path instead of only an inline data URL.
Treat pre-output Responses API 400 validation failures as unsupported so OpenAI-compatible providers that reject /v1/responses payloads can retry through Chat Completions. Also prefer a valid tool-call JSON object after leading prose or incidental JSON to reduce false misformat warnings.
Add the missing 256x256 thumbnail asset for the built-in What's New plugin. The image is compressed under 20 KB and stored in the plugin web UI asset location used by bundled plugin cards.
Update the docs index, quickstart, and installation guide to present A0 Launcher, A0 Install, and direct Docker as distinct setup paths.
Add the A0 Launcher v0.9 download matrix, document headless installer usage, and align visible architecture labels with the x86/ARM wording.
Move installation guidance out of the feature overview and split it into Launcher, A0 Install, and direct Docker paths.
Add the A0 Launcher v0.9 download matrix, document headless A0 Install usage, and keep the visible architecture labels aligned with the requested x86/ARM wording.
Guard stream reconfiguration so pytest capture objects without reconfigure support can import the code execution TTY helper while preserving UTF-8 error handling for normal streams.
Raise the runtime container soft nofile limit before supervisord starts so WebUI and managed services inherit a larger descriptor allowance.
Add an explicit compose nofile example, document the startup contract, and cover the limit raise and hard-limit cap with focused regression tests.
Add a Launcher guide with runtime setup, Installs, Instances, and screenshot capture notes.
Link the guide from README, quickstart, and docs index, and clarify the v1.20-to-v2.0 image upgrade path with backup/restore screenshots.
Use the same minimal trixie Xpra fallback package set for any architecture when the preferred Xpra repository is unsatisfiable.
This lets amd64 recover from current xpra beta sid libopenjph dependency drift like arm64 already does.
Suppress the chat progress ghost placeholder until a chat is selected so the welcome new-chat prompt remains the only visible composer hint. Add a focused static regression for the welcome composer idle-progress overlap case.
Move the ctx_length control for main and utility model slots above the Advanced disclosure while keeping embeddings excluded. Add a static regression guard so primary context controls stay visible outside Advanced.
Reset inherited mobile white-space inside the chat compaction modal so template indentation does not render as large vertical gaps.
Constrain the custom dialog body and raise the overlay above the mobile canvas rail.
Route the Configure credentials banner link through the welcome banner action dispatcher so it opens Settings directly at External Services > Authentication.\n\nAdd coverage for the unsecured connection banner and document the structured banner action contract for future banner links.
Restore restorable surface modals through the initFw_end extension hook and keep right-canvas state in session storage for normal reloads.
Fix Desktop host visibility after modal cleanup so preserved iframes reattach to real modal or canvas hosts, and remove the duplicate file-browser path icon overlay.
Split the monolithic a0-development skill into a lean entry point plus focused reference files for runtime, DOX, tools, extensions, API/WebUI, profiles, prompts, skills, projects, and plugin workflow.
Update the skill DOX ownership for the new references directory and clarify the root framework-vs-agent Python runtimes plus port-discovery guidance.
Verified with git diff --check, targeted skill/tool tests under PYTHONPATH, and live localhost:32769 skill loading/read_file checks before committing.
Reintroduce the shared .text-button primitive in WebUI button CSS so model-config preset controls no longer depend on the chat composer being mounted first.
Document the shared compact text-action contract and add a focused regression covering Model Presets and Model Configuration text-button usage.
Rename the Gemini OAuth provider surface to Google Cloud Gemini so the OAuth provider list points users toward the required Google Cloud project setup.
Align model-provider metadata, usage-plan copy, README wording, and static assertions while keeping the Gemini API OAuth mechanics unchanged.