car-a2a
Agent2Agent (A2A) v1.0 bridge for Common Agent Runtime.
What it does
Exposes a CAR runtime as an A2A-compliant agent so peer agents — built on any A2A SDK (Python, JavaScript, Java, Go, .NET, or one of the Rust crates) — can discover the runtime via an Agent Card and submit work as A2A Tasks.
A2A is the Linux Foundation's open protocol for agent-to-agent interoperability. The full spec lives at https://a2a-protocol.org/latest/specification/.
Mapping
| A2A | CAR |
|---|---|
| Agent Card | Manifest of registered tools + host metadata |
| Task | One-shot wrapper around an ActionProposal |
| Message (parts) | Free-form input from the peer; structured data parts become tool calls |
| Artifact | One per ActionResult returned by the runtime |
TaskState SUBMITTED → WORKING → COMPLETED/FAILED |
Lifecycle of Runtime::execute |
Surface
| Item | Purpose |
|---|---|
A2aDispatcher |
Transport-neutral JSON-RPC dispatcher for the 11 A2A methods |
AgentCardSource |
Trait the dispatcher calls to (re)build the agent card on demand |
TaskStore / InMemoryTaskStore |
Pluggable task persistence |
message_to_proposal |
Compile an A2A Message into a CAR ActionProposal |
action_results_to_artifacts |
Convert a ProposalResult into A2A Artifacts |
Methods supported
message/sendtasks/gettasks/listtasks/canceltasks/pushNotificationConfig/{set,get,list,delete}agent/getAuthenticatedExtendedCard
Out of scope for this prototype:
message/streamandtasks/resubscribe(Server-Sent Events)- gRPC and HTTP+JSON/REST transport bindings
- Outbound A2A client calls — for those, use
a2a-protocol-clientora2a-clientfrom crates.io.
Status
Prototype. The dispatcher is exercised by unit tests against an in-process Runtime and InMemoryTaskStore. It is not yet wired into car-server-core::handler::run_dispatch or fronted by an HTTP listener — embedders pick the transport.
Example
use Arc;
use ;
use Runtime;
let runtime = new;
let store = new;
let card_factory = new;
let dispatcher = new;
// A peer's JSON-RPC request:
let result = dispatcher
.dispatch
.await
.unwrap;