All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
A2A.Plugtask-level authorization hook fortasks/get,tasks/cancel, andtasks/list- A2A v1.0 wire format on encode: flat
Part(nokind, withtext/data/raw/url/mediaType/filename);Task,Message, andArtifactno longer carry akindfield; AgentCard top-levelurlandprotocolVersionremoved (now per-interface undersupportedInterfaces[]). Decoder accepts both v1.0 and the legacy v0.3 nested-fileform, so v0.3 clients keep working. Message.reference_task_ids,Artifact.extensions, andAgentCard.signaturesstruct fields for v1.0 data carriage.- A2A v1.0 extension mechanism:
A2A.Extensionbehaviour withdeclaration/1,activate/3,handle_request/3, andhandle_response/3callbacks;A2A.AgentExtensionstruct for declarations;A2A-Extensionsheader negotiation inA2A.PlugandA2A.Client; merge of declared extensions into the agent card'scapabilities.extensions;context.extensionsmap for agents to read per-request activations;A2A.Extension.Timestampas a reference implementation. - A2A v1.0
A2A-Versionheader negotiation:A2A.Versionhelper module;A2A.Plug:versionsoption (defaults to["0.3", "1.0"]) validates the request header and returnsVersionNotSupportedError(-32009) for unsupported versions; negotiated version echoed in the response header.A2A.Client:versionoption (defaults to"1.0") sets the request header on every call;A2A.Client.version/1reads the server's echoed value. Missing/empty headers are interpreted as"0.3"(spec §3.6.2) and onlyMajor.Minoris significant.
TaskStatus.timestampis now serialized with aZsuffix (UTC) per the v1.0 schema timestamp regex.A2A.Clientnow sends v1.0 PascalCase JSON-RPC method names (SendMessage,SendStreamingMessage,GetTask,CancelTask). The server continues to accept both v1.0 PascalCase and the legacy v0.3 slash-style names. Pointing the client at a strict v0.3-only server that doesn't accept PascalCase is a breaking change.
- Telemetry instrumentation for call, message, cancel, and task transitions
- Security scheme data modeling (
A2A.SecurityScheme.*structs) onAgentCard - Auth middleware (
A2A.Plug.Auth) — Bearer, Basic, API key, OAuth2, OpenID Connect - TCK compliance across all categories (mandatory, capabilities, quality, features)
- TCK results posted as PR comments in CI
- Accept v1.0 field names (
bytes/uri) inFileContentdecoding - Reject messages with missing
messageIdor emptypartsper spec - Reject negative
historyLengthon all methods - Reject cancel on tasks in terminal states (completed/canceled/failed)
- CI runs full TCK suite (
bin/tck all) instead of mandatory only
- Automated Hex publishing to
actioncardorg on GitHub releases - Dependabot configuration for Mix deps and GitHub Actions
- Issue and PR templates
- Minor doc cleanups: internal module references, typespec refinement
- A2A protocol types:
Task,Message,Part,Artifact,Event,FileContent - Agent behaviour (
A2A.Agent) with runtime and state management - Agent card discovery (
A2A.AgentCard) with full wire-format support - JSON-RPC 2.0 transport layer (
A2A.JSONRPC) with request/response/error types - Plug-based HTTP server (
A2A.Plug) with SSE streaming support - HTTP client (
A2A.Client) with SSE streaming via Req - Task store behaviour (
A2A.TaskStore) with ETS implementation - Agent registry and supervisor for multi-agent deployments
- Comprehensive JSON encoding/decoding with
A2A.JSON - A2A TCK (Technology Compatibility Kit) compliance