Changelog
All notable changes to the A2E protocol and SDK are documented here.
The format follows Keep a Changelog, and this project adheres to Semantic Versioning.
[0.1.3] — 2026-10-06
Added
Environment — Data Plane (env/data/*)
- Six new message types for the orthogonal task-data lifecycle:
env/data/reset/{req,resp},env/data/add/{req,resp},env/data/get/{req,resp} EnvDataPart— a staged item carrying metadata only (src,dest,uri,checksum,size_bytes,mime); bytes are moved host-side, so multi-GB corpora never traverse the protocolDEFAULT_DATA_ROOT(/workspace/data)EnvPlugindata-plane hooks —on_data_reset(scope, data_root),on_data_add(parts, data_root),on_data_get(query, include_content, max_bytes, data_root). Defaults are safe no-ops (notNotImplementedError) so existing subclasses are unaffectedEnvAPI.data_reset(),EnvAPI.data_add(),EnvAPI.data_get()client methodsEnvCloseResponse.req_id— closes now correlate viareq_idlike every other RPC response- Regression suite
a2e/tests/unittest/test_env_data_plane.py
Fixed
- Silent RPC hangs in capability handlers.
EnvPlugin,SkillPlugin, andToolkitPlugincould return the staleresponse=Nonefrom afinally:block on the success path, so the executor sent nothing and the client hung until timeout. Handlers now assign the response and return it after thefinally. The same block readmsg.get("id")(anAttributeErroron Pydantic models) instead of the outerreq_id. SkillAPI.discover()re-validated already-typedSkillDefinitionmodels (SkillDefinition(**model)→TypeError), raising on every successful discover. It now returnsresp.skillsdirectly.ToolkitAPI.configure()passedname=/schema=, whichToolkitConfigureRequestsilently dropped — it now passestoolkit_name=/config=, checksstatus, and re-reads the authoritative definition viaget().ToolkitConfigureRequestnow declaresextra="forbid"so misspelled kwargs fail loudly instead of configuring an empty payload.
[0.1.2] — 2026-06-01
Removed
- Experimental subprocess transport prototype (
a2e/experimental/core/transports/subprocess.py) — fully replaced by the corea2e/core/transports/subprocess.pysince v0.1.1; the experimental directory is now removed
[0.1.1] — 2026-06-01
Added
Transport
SubprocessTransportpromoted from experimental to core (a2e/core/transports/subprocess.py) — spawns host as subprocess, communicates via stdin/stdout NDJSONSubprocessTransportConfig.envandcwdfields for environment/working dir controlSubprocessTransportandDirectTransportConfig/SubprocessTransportConfigexported in__all__
Cookbook
cookbook/agents/direct_agent.py— agent connecting via DirectTransport pair with--self-containedmodecookbook/agents/subprocess_agent.py— agent that launches host as subprocess over SubprocessTransportcookbook/servers/a2e_subprocess_host.py— host that reads stdin via DirectTransport bridgecookbook/servers/config_subprocess.yaml— standalone subprocess transport config example
Fixed
- DirectTransport.send(): Now falls back to
_out_queue.put(msg)when_out_handleris None, makingconnect()wiring actually work. Previously all outgoing messages were silently dropped when no_out_handlerwas set (the server direct mode case). - Client rpc() event loop: Added missing
continueafter processingA2EEventmessages — previously events fell through and were returned as the final RPC response instead of waiting for the actual response. - Executor _build_registry(): Added
type_to_plugins.clear()before rebuild to prevent duplicate plugin registration entries when_build_registry()is called multiple times. - Capability enum: Added
TEST = "test"toA2ECapabilityfor generic test capability.
[0.1.0] — 2026-05-18
Added
Protocol
- NDJSON-based message protocol with
A2EMessagebase model (type,id,a2e,ts) - Handshake flow:
handshake/req/handshake/respwith authentication and capability negotiation - Capability negotiation:
agent_caps→accepted_capsmatching against loaded plugins A2EErrormessage format withcode,message,detail,retryable,capability_name- Core error codes:
parse_error,runtime_error,invalid_message,version_mismatch,unauthorized,schema_violation,timeout,out_of_memory,sandbox_crash - Protocol version
1.0
Capabilities — 9 Namespaces
- Tools (
tools):tool/list,tool/call,tool/event— named functions with JSON Schema I/O, streaming events - Memory (
memory):memory/store,memory/recall,memory/forget,memory/search— 3-tier storage (working, episodic, semantic) with TTL, tags, and full-text search - Environment (
env):env/reset,env/step,env/observe,env/reward— RL environment primitives with action space validation - Processes (
proc):proc/spawn,proc/write,proc/read,proc/signal,proc/kill— long-running subprocess management with command allowlist,shell=False, and process quotas - Learning (
learn):learn/feedback,learn/experience,learn/adapt,learn/stats— feedback (POSITIVE/NEGATIVE/NEUTRAL/CORRECTIVE), experience tuples, UCB1 adaptation - Skills (
skills):skill/discover,skill/call,skill/list— named, versioned execution units withinput_schema,output_schema, and optional Docker sandboxing - Toolkits (
toolkits):toolkit/list,toolkit/install,toolkit/configure,toolkit/uninstall— tool bundles with shared JSON Schema configuration and lifecycle management - Chains (
chains):chain/execute,chain/validate— DAG pipelines withaction,branch,map,gather,reducenode kinds, cycle detection, and timeout enforcement - MCP (
mcp):mcp/connect,mcp/disconnect,mcp/call_tool,mcp/read_resource,mcp/get_prompt,mcp/list_tools— Model Context Protocol bridge proxying external MCP servers
Subagents
subagent/spawn,subagent/cancel,subagent/list— child agent spawning withshared,restricted,isolated, andsnapshotmemory scopes- Depth limiting, step limiting, timeout enforcement, and cancellation propagation
Runtime
A2EServer— FastAPI-based server with session-per-connection modelA2EClient— RPC client with queue-based request correlation and event streaming viaevent_callbackA2EServerRuntimeExecutor— dispatch core routing messages to plugins via type registryPluginRegistry— maps message types to plugin handlers, supports priority-based and exclusive dispatchSessionManager— creates and tracks isolated sessions in HTTP mode
Transport
HTTPTransport— POST/send+ GET/stream(SSE) with session management and reconnectionDirectTransport— in-process cross-wired queues for testing and RL step loopsBaseTransportABC withstart(),send(),deliver(), handler slots
Audit
AuditLog— thread-safe structured audit logging for all plugin handler invocationsAuditEntry— recordsts,session_id,req_id,success,duration_ms,error_code,input_bytes,output_bytesRotatingFileHandler— 10 MB max file size, 5 backup files, JSONL formatbuild_audit_log()andbuild_session_id()factory functions
Persistence
- File-based and SQLite storage backends for session snapshot/restore
SnapshotStoreinterface for pluggable persistence
Experimental
SubprocessTransport— stdin/stdout transport for host subprocess communication
Configuration
A2EHostConfig— Pydantic v2 configuration model loaded from YAML- Plugin configuration with
name,type,cls,metadata - Audit configuration:
enabled,path,rotate,session_id_source - Transport configuration:
type(http / direct)
Cookbook
Writing a Plugin— step-by-step plugin development guideEnvironment Agent Loop— RL step loop patterns with DirectTransportChain Pipeline— DAG pipeline construction and executionMCP Integration— connecting external MCP serversMCP Bridge (Plugin & Client)— full WSMCPConnection transport adapter implementationMemory (Plugin & Client)— SQLiteMemoryPlugin with TTL, tags, and agent loop patternCustom Tools (Plugin & Client)— HTTPToolsPlugin with streaming events and correlation IDsToolkit Builder (Plugin & Client)— DatabaseToolkitPlugin with PostgreSQL toolkit and JSON Schema config
Documentation
- VitePress documentation site (
codewiki/) with 7 sections: Getting Started, Architecture, SDK Reference, Capabilities, Protocol Specification, Cookbook, Resources - Architecture Overview with three-layer design, system diagram, and key patterns
- Protocol Specification: Message Format, Handshake, Capability Negotiation, Message Types, Error Codes
- Capability-specific protocol specs for all 9 namespaces + subagents
- SDK Reference: Client API, Server API, Configuration, Audit System, Persistence
Resources
- Glossary — A-Z reference of 40+ A2E terms and concepts
- FAQ — 30+ frequently asked questions across 10 categories
- Security & Trust — trust model, authentication, transport security, per-capability security tables, threat model, plugin security checklist
- Support — troubleshooting guide, debugging techniques, contribution guidelines
[0.1.0-dev] — 2026-05-13
Added
Core Runtime
A2EEventmessage model replacingInvokeEventfor progressive streaming- Event streaming support in client
rpc()withevent_callback - Audit logging system:
AuditLog,AuditEntry,RotatingFileHandler - Audit configuration in
A2EHostConfig
Capabilities
- Memory plugin with 3-tier storage (working, episodic, semantic)
- Learning plugin with feedback, experience, and UCB1 adaptation
- Proc plugin with subprocess management and command allowlist
- Skills plugin with sandboxed execution and
input_schemavalidation - Toolkits plugin with JSON Schema configuration and lifecycle management
- MCP plugin with tool/resource/prompt proxying
Transport
- HTTPTransport with POST
/sendand GET/stream(SSE) - DirectTransport for in-process testing
Experimental
- SubprocessTransport for host subprocess communication
[0.1.0-alpha] — 2026-04-30
Added
Initial Release
- NDJSON-based message protocol with
A2EMessagebase model - Handshake flow with
auth_tokenauthentication - Capability negotiation between agent and host
- 9 capability namespaces: tools, memory, env, proc, learn, skills, toolkits, chains, mcp
- Plugin system:
A2EPluginABC withsetup(),handle(),supported_messages() PluginRegistrywith priority-based and exclusive dispatchA2EServerwith FastAPI backend and session-per-connection modelA2EClientwith RPC and queue-based request correlationBaseTransportABC with HTTP and Direct implementations- Session management with isolated executors per connection
- File-based and SQLite persistence for snapshot/restore
A2EHostConfigloaded from YAML with plugin, transport, and audit sections
Release Notes Format
Each release entry contains the following sections where applicable:
| Section | Description |
|---|---|
| Added | New features, capabilities, and APIs |
| Changed | Changes to existing functionality |
| Deprecated | Features to be removed in future releases |
| Removed | Features removed in this release |
| Fixed | Bug fixes |
| Security | Security-related changes and fixes |
Version Compatibility
| A2E Version | Protocol | Python | Pydantic | FastAPI | MCP |
|---|---|---|---|---|---|
| 0.1.x | 1.0 | 3.10+ | v2 (2.12+) | 0.135+ | 1.27+ |
Upgrade Guide
Upgrading from alpha to 0.1.0
- Event model renamed:
InvokeEvent→A2EEvent. Update any client code that references the old model name. - Audit logging: Audit is now enabled by default. Add
auditsection to yourconfig.yamlor explicitly setenabled: false. - Client API paths: Some internal module paths were reorganized. Update imports:
a2e.agent→a2e.core.client.client- Cookbook modules moved from
cookbook/tocookbook/servers/
- Event streaming: The
rpc()method now supportsevent_callbackfor progressive streaming. Existing code without callbacks continues to work. - Proc plugin: Command allowlist is now enforced. Previously all commands were allowed. Add allowed commands to your plugin config.
General Upgrade Steps
- Update the package:
pip install --upgrade a2e - Check the changelog for breaking changes
- Update
config.yamlif new configuration fields are required - Ensure client and server use the same protocol version
- Run the test suite to verify compatibility