klieo-a2a 0.40.0

Durable A2A v1.0 protocol layer atop klieo-bus traits.
Documentation

klieo-a2a

Durable A2A v1.0 protocol layer atop klieo-bus traits.

Part of the klieo Rust agent framework.

Status

0.38.x — pre-1.0; patch releases are backward-compatible. See docs/SEMVER.md.

HTTP/SSE transport

klieo-a2a ships an HTTP/SSE transport behind the http cargo feature. Single POST /a2a endpoint per A2A v1.0 §9.4.2 with JSON-or-SSE response negotiation based on JSON-RPC method.

[dependencies]
klieo-a2a = { version = "0.38", features = ["http"] }
klieo-auth-common = "0.38"
use klieo_auth_common::AllowAnonymous;
use klieo_a2a::handler::EchoHandler;
use klieo_a2a::http::A2aHttpServer;
use klieo_a2a::task_store::A2aTaskStore;
use klieo_a2a::A2aDispatcher;
use std::sync::Arc;
use tokio_util::sync::CancellationToken;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let dispatcher = Arc::new(
        A2aDispatcher::builder()
            .handler(Arc::new(my_handler()))
            .authenticator(Arc::new(AllowAnonymous))
            .with_in_process_pubsub()
            .build()?,
    );
    let kv = my_kv_store();
    let task_store = Arc::new(
        A2aTaskStore::new(kv, klieo_a2a::task_store::DEFAULT_BUCKET.into())
            .with_event_sink(dispatcher.event_sink()),
    );
    let cancel = CancellationToken::new();

    let server = Arc::new(A2aHttpServer::new(dispatcher, task_store, cancel));
    server.serve_http("127.0.0.1:8080".parse()?).await?;
    Ok(())
}

Streaming methods. SendStreamingMessage and SubscribeToTask return text/event-stream; all other methods return application/json.

Security boundary. The HTTP layer adds no authentication beyond what the configured Authenticator enforces on the JSON-RPC payload. Bind 127.0.0.1 and front with an auth-enforcing reverse proxy for any non-localhost deployment. Plain HTTP only — terminate TLS at the proxy.

See docs/adr/adr-013-a2a-http-sse-transport.md for the design rationale and out-of-scope items.

License

MIT — see LICENSE.