diff --git a/A2A.slnx b/A2A.slnx
index 171c811..b95a4e4 100644
--- a/A2A.slnx
+++ b/A2A.slnx
@@ -31,6 +31,7 @@
+
diff --git a/src/A2A.Client.Abstractions/A2A.Client.Abstractions.csproj b/src/A2A.Client.Abstractions/A2A.Client.Abstractions.csproj
index 5d56956..51c3c9b 100644
--- a/src/A2A.Client.Abstractions/A2A.Client.Abstractions.csproj
+++ b/src/A2A.Client.Abstractions/A2A.Client.Abstractions.csproj
@@ -5,7 +5,7 @@
enable
enable
A2A.Client
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Client.Abstractions/IA2AClient.cs b/src/A2A.Client.Abstractions/IA2AClient.cs
index 92033b7..f17861f 100644
--- a/src/A2A.Client.Abstractions/IA2AClient.cs
+++ b/src/A2A.Client.Abstractions/IA2AClient.cs
@@ -20,6 +20,18 @@ public interface IA2AClient
: IA2AProtocolApi
{
+ ///
+ /// Activates the A2A extension identified by the given URI.
+ ///
+ /// The URI of the A2A extension to activate.
+ /// The configured .
+ IA2AClient ActivateExtension(Uri uri);
+ ///
+ /// Deactivates the A2A extension identified by the given URI.
+ ///
+ /// The URI of the A2A extension to deactivate.
+ /// The configured .
+ IA2AClient DeactivateExtension(Uri uri);
}
diff --git a/src/A2A.Client.Abstractions/IA2AClientBuilder.cs b/src/A2A.Client.Abstractions/IA2AClientBuilder.cs
index 85ab490..6d466bb 100644
--- a/src/A2A.Client.Abstractions/IA2AClientBuilder.cs
+++ b/src/A2A.Client.Abstractions/IA2AClientBuilder.cs
@@ -35,6 +35,7 @@ IA2AClientBuilder UseTransport()
///
/// Builds the configured .
///
- void Build();
+ /// A new .
+ IA2AClient Build();
}
diff --git a/src/A2A.Client.Abstractions/IA2AClientTransport.cs b/src/A2A.Client.Abstractions/IA2AClientTransport.cs
index c63980f..fea3395 100644
--- a/src/A2A.Client.Abstractions/IA2AClientTransport.cs
+++ b/src/A2A.Client.Abstractions/IA2AClientTransport.cs
@@ -20,6 +20,16 @@ public interface IA2AClientTransport
: IA2AProtocolApi
{
+ ///
+ /// Activates the A2A extension identified by the given URI.
+ ///
+ /// The URI of the A2A extension to activate.
+ void ActivateExtension(Uri uri);
+ ///
+ /// Deactivates the A2A extension identified by the given URI.
+ ///
+ /// The URI of the A2A extension to deactivate.
+ void DeactivateExtension(Uri uri);
}
\ No newline at end of file
diff --git a/src/A2A.Client.Transports.Grpc/A2A.Client.Transports.Grpc.csproj b/src/A2A.Client.Transports.Grpc/A2A.Client.Transports.Grpc.csproj
index 191cee4..ddcb649 100644
--- a/src/A2A.Client.Transports.Grpc/A2A.Client.Transports.Grpc.csproj
+++ b/src/A2A.Client.Transports.Grpc/A2A.Client.Transports.Grpc.csproj
@@ -5,7 +5,7 @@
enable
enable
A2A.Client.Transports
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Client.Transports.Grpc/A2AGrpcClientTransport.cs b/src/A2A.Client.Transports.Grpc/A2AGrpcClientTransport.cs
index 7f30eca..07621ae 100644
--- a/src/A2A.Client.Transports.Grpc/A2AGrpcClientTransport.cs
+++ b/src/A2A.Client.Transports.Grpc/A2AGrpcClientTransport.cs
@@ -12,6 +12,7 @@
// limitations under the License.
using Grpc.Core;
+using System.Collections.Generic;
using Task = System.Threading.Tasks.Task;
namespace A2A.Client.Transports;
@@ -24,18 +25,27 @@ public sealed class A2AGrpcClientTransport(A2a.V1.A2AService.A2AServiceClient gr
: IA2AClientTransport
{
+ const string VersionMetadataKey = "A2A-Version";
+ const string ExtensionMetadataKey = "A2A-Extensions";
+
+ ListValue? extensions;
+
///
public async Task SendMessageAsync(Models.SendMessageRequest request, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(request);
- return A2AGrpcMapper.MapFromGrpc(await grpcClient.SendMessageAsync(A2AGrpcMapper.MapToGrpc(request), cancellationToken: cancellationToken).ConfigureAwait(false));
+ var grpcRequest = A2AGrpcMapper.MapToGrpc(request);
+ SetRequestMetadata(grpcRequest.Metadata);
+ return A2AGrpcMapper.MapFromGrpc(await grpcClient.SendMessageAsync(grpcRequest, cancellationToken: cancellationToken).ConfigureAwait(false));
}
///
public async IAsyncEnumerable SendStreamingMessageAsync(Models.SendMessageRequest request, [EnumeratorCancellation] CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(request);
- var result = grpcClient.SendStreamingMessage(A2AGrpcMapper.MapToGrpc(request), cancellationToken: cancellationToken);
+ var grpcRequest = A2AGrpcMapper.MapToGrpc(request);
+ SetRequestMetadata(grpcRequest.Metadata);
+ var result = grpcClient.SendStreamingMessage(grpcRequest, cancellationToken: cancellationToken);
await foreach (var streamResponse in result.ResponseStream.ReadAllAsync(cancellationToken).ConfigureAwait(false))
{
if (streamResponse is null) continue;
@@ -142,4 +152,37 @@ await grpcClient.DeleteTaskPushNotificationConfigAsync(new()
}, cancellationToken: cancellationToken).ConfigureAwait(false);
}
+ void SetRequestMetadata(Struct metadata)
+ {
+ metadata.Fields[VersionMetadataKey] = Value.ForString(A2AProtocolVersion.Latest);
+ if (extensions is not null) metadata.Fields[ExtensionMetadataKey] = new()
+ {
+ ListValue = extensions
+ };
+ }
+
+ ///
+ public void ActivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ var value = uri.OriginalString;
+ extensions ??= new();
+ if (extensions.Values.Any(v => v.StringValue.Equals(value, StringComparison.OrdinalIgnoreCase))) return;
+ extensions.Values.Add(new Value()
+ {
+ StringValue = value
+ });
+ }
+
+ ///
+ public void DeactivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ if (extensions is null) return;
+ var value = uri.OriginalString;
+ var toRemove = extensions.Values.FirstOrDefault(v => v.StringValue.Equals(value, StringComparison.OrdinalIgnoreCase));
+ if (toRemove is null) return;
+ extensions.Values.Remove(toRemove);
+ }
+
}
diff --git a/src/A2A.Client.Transports.Http/A2A.Client.Transports.Http.csproj b/src/A2A.Client.Transports.Http/A2A.Client.Transports.Http.csproj
index 8589b5d..2a01eeb 100644
--- a/src/A2A.Client.Transports.Http/A2A.Client.Transports.Http.csproj
+++ b/src/A2A.Client.Transports.Http/A2A.Client.Transports.Http.csproj
@@ -5,7 +5,7 @@
enable
enable
A2A.Client.Transports
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Client.Transports.Http/A2AHttpClientTransport.cs b/src/A2A.Client.Transports.Http/A2AHttpClientTransport.cs
index 18be3ba..6d62512 100644
--- a/src/A2A.Client.Transports.Http/A2AHttpClientTransport.cs
+++ b/src/A2A.Client.Transports.Http/A2AHttpClientTransport.cs
@@ -24,6 +24,8 @@ public sealed class A2AHttpClientTransport(HttpClient httpClient)
: IA2AClientTransport
{
+ const string ExtensionHeaderName = "A2A-Extensions";
+
///
public async Task SendMessageAsync(SendMessageRequest request, CancellationToken cancellationToken = default)
{
@@ -169,4 +171,25 @@ public async Task DeletePushNotificationConfigAsync(string taskId, string config
}
+ ///
+ public void ActivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ var value = uri.OriginalString;
+ if (httpClient.DefaultRequestHeaders.TryGetValues(ExtensionHeaderName, out var existing) && existing.Contains(value, StringComparer.OrdinalIgnoreCase)) return;
+ httpClient.DefaultRequestHeaders.TryAddWithoutValidation(ExtensionHeaderName, value);
+ }
+
+ ///
+ public void DeactivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ var value = uri.OriginalString;
+ if (!httpClient.DefaultRequestHeaders.TryGetValues(ExtensionHeaderName, out var existing)) return;
+ var extensions = existing.Where(v => !string.Equals(v, value, StringComparison.OrdinalIgnoreCase)).ToArray();
+ httpClient.DefaultRequestHeaders.Remove(ExtensionHeaderName);
+ if (extensions.Length == 0) return;
+ foreach (var extension in extensions) httpClient.DefaultRequestHeaders.TryAddWithoutValidation(ExtensionHeaderName, extension);
+ }
+
}
diff --git a/src/A2A.Client.Transports.Http/Extensions/A2AClientBuilderExtensions.cs b/src/A2A.Client.Transports.Http/Extensions/A2AClientBuilderExtensions.cs
index c767104..32ec572 100644
--- a/src/A2A.Client.Transports.Http/Extensions/A2AClientBuilderExtensions.cs
+++ b/src/A2A.Client.Transports.Http/Extensions/A2AClientBuilderExtensions.cs
@@ -33,6 +33,7 @@ public static IA2AClientBuilder UseHttpTransport(this IA2AClientBuilder builder,
builder.Services.AddHttpClient(httpClient =>
{
httpClient.BaseAddress = baseAddress;
+ httpClient.DefaultRequestHeaders.Add("A2A-Version", A2AProtocolVersion.Latest);
});
builder.Services.AddSingleton(provider => provider.GetRequiredService());
return builder.UseTransport();
diff --git a/src/A2A.Client.Transports.JsonRpc/A2A.Client.Transports.JsonRpc.csproj b/src/A2A.Client.Transports.JsonRpc/A2A.Client.Transports.JsonRpc.csproj
index 31acc63..52ef979 100644
--- a/src/A2A.Client.Transports.JsonRpc/A2A.Client.Transports.JsonRpc.csproj
+++ b/src/A2A.Client.Transports.JsonRpc/A2A.Client.Transports.JsonRpc.csproj
@@ -5,7 +5,7 @@
enable
enable
A2A.Client.Transports
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Client.Transports.JsonRpc/A2AJsonRpcClientTransport.cs b/src/A2A.Client.Transports.JsonRpc/A2AJsonRpcClientTransport.cs
index 6069a4e..d2f0fb3 100644
--- a/src/A2A.Client.Transports.JsonRpc/A2AJsonRpcClientTransport.cs
+++ b/src/A2A.Client.Transports.JsonRpc/A2AJsonRpcClientTransport.cs
@@ -24,6 +24,8 @@ public sealed class A2AJsonRpcClientTransport(HttpClient httpClient)
: IA2AClientTransport
{
+ const string ExtensionHeaderName = "A2A-Extensions";
+
///
public async Task SendMessageAsync(SendMessageRequest request, CancellationToken cancellationToken = default)
{
@@ -257,4 +259,25 @@ public async Task DeletePushNotificationConfigAsync(string taskId, string config
if (rpcResponse.Error is not null) throw new Exception($"An error occurred while processing the JSON-RPC request (error code: {rpcResponse.Error.Code}): {rpcResponse.Error.Message}).");
}
+ ///
+ public void ActivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ var value = uri.OriginalString;
+ if (httpClient.DefaultRequestHeaders.TryGetValues(ExtensionHeaderName, out var existing) && existing.Contains(value, StringComparer.OrdinalIgnoreCase)) return;
+ httpClient.DefaultRequestHeaders.TryAddWithoutValidation(ExtensionHeaderName, value);
+ }
+
+ ///
+ public void DeactivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ var value = uri.OriginalString;
+ if (!httpClient.DefaultRequestHeaders.TryGetValues(ExtensionHeaderName, out var existing)) return;
+ var extensions = existing.Where(v => !string.Equals(v, value, StringComparison.OrdinalIgnoreCase)).ToArray();
+ httpClient.DefaultRequestHeaders.Remove(ExtensionHeaderName);
+ if (extensions.Length == 0) return;
+ foreach (var extension in extensions) httpClient.DefaultRequestHeaders.TryAddWithoutValidation(ExtensionHeaderName, extension);
+ }
+
}
diff --git a/src/A2A.Client.Transports.JsonRpc/Extensions/A2AClientBuilderExtensions.cs b/src/A2A.Client.Transports.JsonRpc/Extensions/A2AClientBuilderExtensions.cs
index ccd153a..ade663f 100644
--- a/src/A2A.Client.Transports.JsonRpc/Extensions/A2AClientBuilderExtensions.cs
+++ b/src/A2A.Client.Transports.JsonRpc/Extensions/A2AClientBuilderExtensions.cs
@@ -33,6 +33,7 @@ public static IA2AClientBuilder UseJsonRpcTransport(this IA2AClientBuilder build
builder.Services.AddHttpClient(httpClient =>
{
httpClient.BaseAddress = baseAddress;
+ httpClient.DefaultRequestHeaders.Add("A2A-Version", A2AProtocolVersion.Latest);
});
builder.Services.AddSingleton(provider => provider.GetRequiredService());
return builder.UseTransport();
diff --git a/src/A2A.Client/A2A.Client.csproj b/src/A2A.Client/A2A.Client.csproj
index 30a6176..5a111ef 100644
--- a/src/A2A.Client/A2A.Client.csproj
+++ b/src/A2A.Client/A2A.Client.csproj
@@ -5,7 +5,7 @@
enable
enable
A2A.Client
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Client/A2AClient.cs b/src/A2A.Client/A2AClient.cs
index 702bc7b..a562f45 100644
--- a/src/A2A.Client/A2AClient.cs
+++ b/src/A2A.Client/A2AClient.cs
@@ -11,7 +11,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-using A2A.Models;
using Task = System.Threading.Tasks.Task;
namespace A2A.Client;
@@ -54,4 +53,20 @@ public sealed class A2AClient(IA2AClientTransport transport)
///
public Task DeletePushNotificationConfigAsync(string taskId, string configId, string? tenant = null, CancellationToken cancellationToken = default) => transport.DeletePushNotificationConfigAsync(taskId, configId, tenant, cancellationToken);
+ ///
+ public IA2AClient ActivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ transport.ActivateExtension(uri);
+ return this;
+ }
+
+ ///
+ public IA2AClient DeactivateExtension(Uri uri)
+ {
+ ArgumentNullException.ThrowIfNull(uri);
+ transport.DeactivateExtension(uri);
+ return this;
+ }
+
}
diff --git a/src/A2A.Client/A2AClientBuilder.cs b/src/A2A.Client/A2AClientBuilder.cs
index dd0ca28..12cd66b 100644
--- a/src/A2A.Client/A2AClientBuilder.cs
+++ b/src/A2A.Client/A2AClientBuilder.cs
@@ -16,15 +16,20 @@ namespace A2A.Client;
///
/// Represents the default implementation of the interface.
///
-/// The to configure.
-public sealed class A2AClientBuilder(IServiceCollection services)
+public sealed class A2AClientBuilder
: IA2AClientBuilder
{
Type? transportType;
+ internal A2AClientBuilder(IServiceCollection services)
+ {
+ Services = services;
+ Services.AddSingleton();
+ }
+
///
- public IServiceCollection Services { get; } = services;
+ public IServiceCollection Services { get; }
///
public IA2AClientBuilder UseTransport()
@@ -35,10 +40,16 @@ public IA2AClientBuilder UseTransport()
}
///
- public void Build()
+ public IA2AClient Build()
{
if (transportType is null) throw new InvalidOperationException("The transport type must be specified before building the client.");
- Services.AddSingleton();
+ return Services.BuildServiceProvider().GetRequiredService();
}
+ ///
+ /// Creates a new .
+ ///
+ /// A new .
+ public static IA2AClientBuilder Create() => new A2AClientBuilder(new ServiceCollection());
+
}
\ No newline at end of file
diff --git a/src/A2A.Client/Extensions/A2AClientServiceCollectionExtensions.cs b/src/A2A.Client/Extensions/A2AClientServiceCollectionExtensions.cs
index 91cec92..fd11f86 100644
--- a/src/A2A.Client/Extensions/A2AClientServiceCollectionExtensions.cs
+++ b/src/A2A.Client/Extensions/A2AClientServiceCollectionExtensions.cs
@@ -30,8 +30,6 @@ public static IServiceCollection AddA2AClient(this IServiceCollection services,
{
var builder = new A2AClientBuilder(services);
setup.Invoke(builder);
- builder.Build();
- services.AddSingleton();
return services;
}
diff --git a/src/A2A.Core.JsonRpc/A2A.Core.JsonRpc.csproj b/src/A2A.Core.JsonRpc/A2A.Core.JsonRpc.csproj
index 820d9d7..df266a5 100644
--- a/src/A2A.Core.JsonRpc/A2A.Core.JsonRpc.csproj
+++ b/src/A2A.Core.JsonRpc/A2A.Core.JsonRpc.csproj
@@ -5,7 +5,7 @@
enable
enable
A2A
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Core/A2A.Core.csproj b/src/A2A.Core/A2A.Core.csproj
index a07e281..0d654cf 100644
--- a/src/A2A.Core/A2A.Core.csproj
+++ b/src/A2A.Core/A2A.Core.csproj
@@ -5,7 +5,7 @@
enable
enable
A2A
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Core/A2AProtocolVersion.cs b/src/A2A.Core/A2AProtocolVersion.cs
new file mode 100644
index 0000000..d700012
--- /dev/null
+++ b/src/A2A.Core/A2AProtocolVersion.cs
@@ -0,0 +1,27 @@
+// Copyright © 2025-Present the a2a-net Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"),
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace A2A;
+
+///
+/// Enumerates the supported A2A protocol versions.
+///
+public static class A2AProtocolVersion
+{
+
+ ///
+ /// Gets the latest supported A2A protocol version.
+ ///
+ public const string Latest = "0.3";
+
+}
diff --git a/src/A2A.Extensions.A2UI/A2A.Extensions.A2UI.csproj b/src/A2A.Extensions.A2UI/A2A.Extensions.A2UI.csproj
new file mode 100644
index 0000000..1e7bb38
--- /dev/null
+++ b/src/A2A.Extensions.A2UI/A2A.Extensions.A2UI.csproj
@@ -0,0 +1,37 @@
+
+
+
+ net10.0
+ Library
+ enable
+ enable
+ A2A.Extensions
+ 0.16.0
+ $(VersionPrefix)
+ $(VersionPrefix)
+ en
+ true
+ true
+ true
+ true
+ A2A-NET A2UI Extension
+ The A2UI extension.
+ a2a-net.Extensions.A2UI
+ a2a;extensions:a2ui
+ true
+ Apache-2.0
+ README.md
+ Copyright © 2025-Present the a2a-net Authors. All rights reserved.
+ https://github.com/neuroglia-io/a2a
+ https://github.com/neuroglia-io/a2a
+ git
+ embedded
+
+
+
+
+ True
+ \
+
+
+
diff --git a/src/A2A.Extensions.A2UI/A2UIExtension.cs b/src/A2A.Extensions.A2UI/A2UIExtension.cs
new file mode 100644
index 0000000..3fa07ef
--- /dev/null
+++ b/src/A2A.Extensions.A2UI/A2UIExtension.cs
@@ -0,0 +1,66 @@
+// Copyright © 2025-Present the a2a-net Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"),
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace A2A.Extensions;
+
+///
+/// Provides extension methods and related types for working with A2UI components and configuration.
+///
+public static class A2UIExtension
+{
+
+ ///
+ /// Gets the unique URI that identifies the A2UI extension.
+ ///
+ public static readonly Uri BaseUri = new("https://a2ui.org/a2a-extension/a2ui/");
+ ///
+ /// Gets the current version string of the A2UI extension.
+ ///
+ public const string CurrentVersion = "v0.9";
+ ///
+ /// Gets the unique URI that identifies the current version of the A2UI extension.
+ ///
+ public static readonly Uri Uri = GetUri(CurrentVersion);
+
+ ///
+ /// Gets the unique URI that identifies a specific version of the A2UI extension.
+ ///
+ /// The version string of the A2UI extension.
+ /// An URI representing the specific version of the A2UI extension.
+ public static Uri GetUri(string version) => new(BaseUri, version);
+
+ ///
+ /// Represents the parameters for configuring an A2UI extension.
+ ///
+ [Description("Represents the parameters for configuring an A2UI extension.")]
+ [DataContract]
+ public sealed record Parameters
+ {
+
+ ///
+ /// Gets a collection of URIs pointing to a component catalog definition schema that the agent can generate.
+ ///
+ [Description("A collection of URIs pointing to a component catalog definition schema that the agent can generate.")]
+ [DataMember(Order = 1, Name = "supportedCatalogIds"), JsonPropertyOrder(1), JsonPropertyName("supportedCatalogIds")]
+ public IReadOnlyCollection? SupportedCatalogIds { get; init; }
+
+ ///
+ /// Gets a boolean indicating whether the agent can accept inline component catalogs provided directly within requests.
+ ///
+ [Description("A boolean indicating whether the agent can accept inline component catalogs provided directly within requests.")]
+ [DataMember(Order = 2, Name = "acceptsInlineCatalogs"), JsonPropertyOrder(2), JsonPropertyName("acceptsInlineCatalogs")]
+ public bool? AcceptsInlineCatalogs { get; init; }
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/A2A.Extensions.A2UI/Usings.cs b/src/A2A.Extensions.A2UI/Usings.cs
new file mode 100644
index 0000000..8597029
--- /dev/null
+++ b/src/A2A.Extensions.A2UI/Usings.cs
@@ -0,0 +1,16 @@
+// Copyright © 2025-Present the a2a-net Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"),
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+global using System.ComponentModel;
+global using System.Runtime.Serialization;
+global using System.Text.Json.Serialization;
diff --git a/src/A2A.Server.Abstractions/A2A.Server.Abstractions.csproj b/src/A2A.Server.Abstractions/A2A.Server.Abstractions.csproj
index 5b07a3c..bae9f46 100644
--- a/src/A2A.Server.Abstractions/A2A.Server.Abstractions.csproj
+++ b/src/A2A.Server.Abstractions/A2A.Server.Abstractions.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.AspNetCore/A2A.Server.csproj b/src/A2A.Server.AspNetCore/A2A.Server.csproj
index aed90ec..2e406b2 100644
--- a/src/A2A.Server.AspNetCore/A2A.Server.csproj
+++ b/src/A2A.Server.AspNetCore/A2A.Server.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.Persistence.Memory/A2A.Server.Persistence.Memory.csproj b/src/A2A.Server.Persistence.Memory/A2A.Server.Persistence.Memory.csproj
index dfa34ad..95f66d6 100644
--- a/src/A2A.Server.Persistence.Memory/A2A.Server.Persistence.Memory.csproj
+++ b/src/A2A.Server.Persistence.Memory/A2A.Server.Persistence.Memory.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.Persistence.Redis/A2A.Server.Persistence.Redis.csproj b/src/A2A.Server.Persistence.Redis/A2A.Server.Persistence.Redis.csproj
index f34ef8e..8a2c261 100644
--- a/src/A2A.Server.Persistence.Redis/A2A.Server.Persistence.Redis.csproj
+++ b/src/A2A.Server.Persistence.Redis/A2A.Server.Persistence.Redis.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.Scheduling.Memory/A2A.Server.Scheduling.Memory.csproj b/src/A2A.Server.Scheduling.Memory/A2A.Server.Scheduling.Memory.csproj
index 8fd5d23..1c9637f 100644
--- a/src/A2A.Server.Scheduling.Memory/A2A.Server.Scheduling.Memory.csproj
+++ b/src/A2A.Server.Scheduling.Memory/A2A.Server.Scheduling.Memory.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.Scheduling.Quartz/A2A.Server.Scheduling.Quartz.csproj b/src/A2A.Server.Scheduling.Quartz/A2A.Server.Scheduling.Quartz.csproj
index f5fa208..ca9bd7f 100644
--- a/src/A2A.Server.Scheduling.Quartz/A2A.Server.Scheduling.Quartz.csproj
+++ b/src/A2A.Server.Scheduling.Quartz/A2A.Server.Scheduling.Quartz.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.Transports.Grpc/A2A.Server.Transports.Grpc.csproj b/src/A2A.Server.Transports.Grpc/A2A.Server.Transports.Grpc.csproj
index df9b18d..be7a64f 100644
--- a/src/A2A.Server.Transports.Grpc/A2A.Server.Transports.Grpc.csproj
+++ b/src/A2A.Server.Transports.Grpc/A2A.Server.Transports.Grpc.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server.Transports
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.Transports.Http/A2A.Server.Transports.Http.csproj b/src/A2A.Server.Transports.Http/A2A.Server.Transports.Http.csproj
index 268e81e..e66d177 100644
--- a/src/A2A.Server.Transports.Http/A2A.Server.Transports.Http.csproj
+++ b/src/A2A.Server.Transports.Http/A2A.Server.Transports.Http.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server.Transports
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en
diff --git a/src/A2A.Server.Transports.JsonRpc/A2A.Server.Transports.JsonRpc.csproj b/src/A2A.Server.Transports.JsonRpc/A2A.Server.Transports.JsonRpc.csproj
index 911c32a..073bba3 100644
--- a/src/A2A.Server.Transports.JsonRpc/A2A.Server.Transports.JsonRpc.csproj
+++ b/src/A2A.Server.Transports.JsonRpc/A2A.Server.Transports.JsonRpc.csproj
@@ -6,7 +6,7 @@
enable
enable
A2A.Server.Transports
- 0.15.0
+ 0.16.0
$(VersionPrefix)
$(VersionPrefix)
en