v2.12
agent0ai/agent-zerov2.12Sep 9, 2026by github-actions[bot]
AI Summary
Agent Zero v2.12 introduces significant improvements to file handling, transport security, and the editor experience, including atomic transfers and unified text/code editing. The release also optimizes the Responses API for token efficiency and enhances plugin management through consolidated CLI commands. Additionally, the Canvas and Browser interfaces received usability updates and performance tweaks.
Key Highlights
- Enhanced file transfer security with atomic HTTP uploads and WebSocket payload ceilings.
- Unified text and code editing with ACE syntax highlighting and Markdown preview.
- Optimized Responses API reducing Codex input tokens from ~16.4K to ~11.3K.
- Consolidated plugin management with `a0-create-plugin` and `a0-manage-plugin` commands.
- Movable canvas rail and configurable 'verbose tool calls' preference.
Breaking Changes
- Made `llm_result` required in `hist_add_ai_response` with `LLMResult.non_llm` sentinel for non-LLM turns.
New Features
- Independent, lazily loaded directory trees for Files and Editor.
- Unified text/code editing with Markdown preview and native source search.
- "Show verbose tool calls" preference for message streams.
- On-demand guide for managing projects, chats, profiles, and tasks.
- Safari setup guidance in Browser settings.
- Centralized streamed file transfers with entry budgets and cleanup.
- Exposed connected CLI and Launcher folders with authenticated HTTP transfers.
- Movable and customizable canvas rail with keyboard support.
Full Release Notes
# Agent Zero Release Notes ## Connector & Transport Hardening - Enforced negotiated WebSocket payload ceilings with a symmetric checksummed transfer protocol for large operations, including bounded transfer state, disk spooling, and automatic cancellation on pause, reset, delete, or disconnect - Made workspace HTTP file transfers atomic with streaming uploads into partial files, size verification, fsync, and SHA-256 download receipts - Bounded remote connector tool payloads with explicit continuation metadata for large content, rejecting oversized inline artifacts before base64 expansion and routing bulk files to authenticated HTTP transfers - Documented connector payload contracts including WebSocket ceilings, transfer state machine, cancellation lifecycle, and remote text limits ## File Browser & Editor - Added independent, lazily loaded directory trees to Files and Editor in canvas and modal modes with unified styling, lighter panel backgrounds, and flat toolbar controls - Unified text and code editing in the shared Editor with ACE syntax highlighting, line numbers, native source search, and Markdown preview — removing the legacy file-editor modal - Added File Browser preferences for sorting, view mode, initial tree visibility, and independent editing and transfer limits - Exposed connected CLI and Launcher folders in Files with host permissions, authenticated HTTP transfers, size/SHA-256 checks, and atomic publication - Centralized streamed file transfers and hardened archive operations with expansion and entry budgets, unsafe member rejection, and owned temporary-file cleanup - Moved File Browser controls into a dedicated Settings category with appearance defaults, remote connections, file limits, and archive limits - Added configurable editing (10 MiB default) and transfer (100 MiB default) limits shared across Files and Editor - Fixed file links in chat messages to recognize file URLs and download API paths in the shared path-link renderer - Polished Files selection toolbar, removed tree tooltips, matched folder icon tint to standard file icons, and hid file sizes in icon view ## Responses API & Native Tool Calls - Preserved native tool calls through Context Doctor, leaving canonical function calls untouched by text repair - Stored canonical function-call content through assistant history and masking, with proper repeated-response detection - Streamed native tool arguments through the existing live display with alias normalization and masking - Described bundled tool arguments in Responses schemas for 15 tool implementations with non-strict definitions - Preserved policy-filtered guidance in native Responses function descriptions with A0 envelope-to-argument conversion - Projected native system instructions only for Responses requests, reducing Codex input from ~16.4K to ~11.3K tokens - Preserved native Responses history within prepared prompts, retaining original IDs and encrypted reasoning - Consolidated Responses prompt bookkeeping outside Agent, reducing agent.py additions from 61 to 24 lines - Made `llm_result` required in `hist_add_ai_response` with `LLMResult.non_llm` sentinel for non-LLM turns - Kept Responses stream reconstruction inside the parser with one authoritative output-item store - Skipped unused Chat replay preparation and shared input conversion for Chat Completions ## Context Doctor & Response Handling - Added split-thoughts repair strategy extracting value selection into a helper with configurable settings - Handled reasoning-only and plain-text fallback responses with dedicated retry warnings and user notices - Tightened usable-response detection requiring at least one A0 key with a non-empty value - Fixed raw-text fallback classification by moving raw thoughts wrapping after repair selection - Counted `thoughts_fallback` warning toward the unusable-response limit - Let Responses text reach the core response dispatcher while continuing to repair recognizable tool intent ## Prompt & Profile Improvements - Hid disabled capabilities from system prompts so policy-filtered tool prompts remain the source of truth - Moved MCP guidance into prompt templates with policy-filtered qualified names and schemas - Compacted developer and researcher profile prompts, reducing token counts from ~2,600 to ~750 each - Strengthened shared problem-solving prompts with observable success criteria, evidence-driven replanning, bug reproduction, and source-preserving synthesis - Reinforced response tool usage in prompts, explicitly stating plain-text output without a tool call is invalid - Stripped trailing newlines in `read_prompt` and `parse_prompt` for consistent template handling - Added initial user turn to preserve AI greeting turn order when no project is selected - Rendered scoped profile routing catalog as one line per profile ID with delegation context ## Canvas & UI - Made the canvas rail movable and customizable with a vertical drag handle, keyboard support, viewport bounds, and remembered position - Added a "Show verbose tool calls" preference gating tool name and args display in the message stream - Added `text_editor` custom message handler with dynamic action+path headings - Themed dark checkboxes with light checkmarks and centered Memory Dashboard selection controls - Polished surface modal headers to a shared 48px height with centered controls - Refreshed context indicator after clearing chat - Showed LiteLLM and Secrets settings by default without collapsible wrappers - Avoided replaying queued WebUI updates — live benchmark showed catch-up reduced from 1.95s to immediate - Fixed context window popover staying within bounds on short labels - Fixed Browser tab switching stuck in loading state when reusing the same viewer URL - Fixed branch button injection skipping markdown-wrapped action bars - Clarified required Agent Editor instructions with validation errors and tooltip cleanup ## Browser & Desktop - Added Safari setup to Browser settings with structured setup guidance for Safari and Chromium-family browsers - Sped up Browser and Desktop startup by limiting initial D-Bus and CUPS waits to one second - Fitted Desktop display to the active canvas, removing the aspect-ratio fallback that cropped narrow viewports - Fixed Desktop and Office package installation using the Python 3.13-compatible Kali snapshot - Preserved the shared browser cleanup thread across context resets ## Model & Provider Management - Prevented chat parameters from leaking into embedding configurations - Preserved Codex OAuth prompt cache affinity with stable session/thread IDs and bounded default cache keys - Kept OAuth model discovery tied to account availability without replacing empty catalogs with generic registry models - Reported provider usage for streamed Chat Completions turns with automatic retry when `stream_options` is rejected - Kept encrypted Chat reasoning out of readable output by filtering provider encrypted-reasoning markers - Preserved Codex Chat bridge usage and terminal outcomes with token count translation - Reported invalid model parameter JSON before saving with editor context identifying the preset and slot - Avoided repeated preset reads during embedding comparisons — median save time reduced from 1,171ms to 52ms - Discarded model search results for changed drafts and queries - Set tested Codex client version (0.153.3) by default for model discovery without CLI ## Skills & Plugins - Added an on-demand guide for managing projects, chats, profiles, and saved tasks through existing APIs - Consolidated plugin authoring behind `a0-create-plugin` and lifecycle management behind `a0-manage-plugin` - Required `hooks.py` for plugin setup and cleanup in authoring guidance - Hid remote skill discovery until the A0 CLI connects - Fixed trailing commas in six JSON skill examples and rewrote 23 skill descriptions for catalog preview - Validated skill examples and sharpened descriptions with regression checks ## Parallel Execution & Terminal - Kept parallel terminal jobs alive until their commands finish, publishing progress through job results - Kept goal operations out of disposable parallel workers with shared validation across dispatch paths - Preserved streamed child log content in parallel jobs so user-visible output is never replaced ## Security Fixes - **WhatsApp**: Fixed media path traversal and enforced pre-download sender/group authorization - **Telegram**: Fixed webhook authentication bypass — reject HTTP updates for polling bots and require matching nonempty webhook secret - **IMAP**: Fixed sender whitelist bypass with strict mailbox parsing requiring exactly one valid From address ## Infrastructure & Stability - Optimized scoped tool policy resolution reusing one fresh policy snapshot across batches - Unified embedding calls behind a single batch entry point removing duplicate transport logic - Serialized shared event-loop initialization to prevent concurrent first-use from stranding tasks - Preserved rollback stash identity during self-update by tracking Git object IDs - Preserved non-LLM mode when reloading result metadata through dictionary and history round trips - Restored legacy assistant history call compatibility accepting message-only and positional ID calls - Shared editor log presentation across local and remote tools - Kept the rate limiter demo out of test collection - Used 4-space indented tree in workdir extras for token-compact agent-facing output - Routed nudge as system message and minified message templates - Simplified WhatsApp pairing to one QR-code action with sequential polling - Updated Launcher README links to v1.7 - Ignored `.venv` in generated gitignore templates ## Breaking Changes - `hist_add_ai_response` now requires an `llm_result` parameter — use `LLMResult.non_llm()` for non-LLM turns (greeting, intervention progress). Legacy message-only and positional ID calls remain supported via automatic sentinel injection. - `thoughts` is no longer auto-populated from `reasoning` when absent (reasoning-to-thoughts revert). - Plugin authoring now requires `hooks.py` for dependency installation, initialization, and uninstall cleanup — `execute.py` setup patterns are no longer supported.