Skip to content

Commit e6b4af4

Browse files
committed
feat: rename a2a-net.Client into a2a-net.Client.Abstractions
feat: rename `a2a-net.Client.Transport.WebSocket` into `a2a-net.Client.WebSocket` feat: add a new `a2a-net.Client.Http`project feat: rename `IA2AProtocol` into `IA2AProtocolService`, and add a new `A2AProtocol` class used to expose statics and constants about the protocol feat: add new error types feat: add the possibility to inject and configure multiple `IA2AProtocolServers` Signed-off-by: Charles d'Avernas <[email protected]>
1 parent 981ba51 commit e6b4af4

File tree

69 files changed

+1588
-681
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+1588
-681
lines changed

a2a-net.sln

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "a2a-net.Server.Infrastructu
2121
EndProject
2222
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "a2a-net.Server.AspNetCore", "src\a2a-net.Server.AspNetCore\a2a-net.Server.AspNetCore.csproj", "{E7FC1D4C-D4E8-400D-8963-D7294A1653CC}"
2323
EndProject
24-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "a2a-net.Client", "src\a2a-net.Client\a2a-net.Client.csproj", "{3371623F-955A-4051-9E77-032A79614BCC}"
25-
EndProject
26-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "a2a-net.Client.Transport.WebSocket", "src\a2a-net.Client.Transport.WebSocket\a2a-net.Client.Transport.WebSocket.csproj", "{24F063DB-2DFB-FA0C-2AA8-C8D5365B5F4B}"
27-
EndProject
2824
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{6CD1D227-B7EE-42C0-AF00-09EB73526826}"
2925
ProjectSection(SolutionItems) = preProject
3026
CODEOWNERS = CODEOWNERS
@@ -53,6 +49,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{
5349
.github\workflows\test.yml = .github\workflows\test.yml
5450
EndProjectSection
5551
EndProject
52+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "a2a-net.Client.Http", "src\a2a-net.Client.Http\a2a-net.Client.Http.csproj", "{3F970C17-AB49-468C-B6DF-8A0045FC77D2}"
53+
EndProject
54+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "a2a-net.Client.Abstractions", "src\a2a-net.Client.Asbtractions\a2a-net.Client.Abstractions.csproj", "{D83DCD5A-67A0-752D-711A-54F244C6100A}"
55+
EndProject
56+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "a2a-net.Client.WebSocket", "src\a2a-net.Client.WebSocket\a2a-net.Client.WebSocket.csproj", "{1A8D202B-4921-1974-FB12-7811F4BDEA47}"
57+
EndProject
5658
Global
5759
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5860
Debug|Any CPU = Debug|Any CPU
@@ -87,14 +89,18 @@ Global
8789
{E7FC1D4C-D4E8-400D-8963-D7294A1653CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
8890
{E7FC1D4C-D4E8-400D-8963-D7294A1653CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
8991
{E7FC1D4C-D4E8-400D-8963-D7294A1653CC}.Release|Any CPU.Build.0 = Release|Any CPU
90-
{3371623F-955A-4051-9E77-032A79614BCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
91-
{3371623F-955A-4051-9E77-032A79614BCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
92-
{3371623F-955A-4051-9E77-032A79614BCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
93-
{3371623F-955A-4051-9E77-032A79614BCC}.Release|Any CPU.Build.0 = Release|Any CPU
94-
{24F063DB-2DFB-FA0C-2AA8-C8D5365B5F4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
95-
{24F063DB-2DFB-FA0C-2AA8-C8D5365B5F4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
96-
{24F063DB-2DFB-FA0C-2AA8-C8D5365B5F4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
97-
{24F063DB-2DFB-FA0C-2AA8-C8D5365B5F4B}.Release|Any CPU.Build.0 = Release|Any CPU
92+
{3F970C17-AB49-468C-B6DF-8A0045FC77D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
93+
{3F970C17-AB49-468C-B6DF-8A0045FC77D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
94+
{3F970C17-AB49-468C-B6DF-8A0045FC77D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
95+
{3F970C17-AB49-468C-B6DF-8A0045FC77D2}.Release|Any CPU.Build.0 = Release|Any CPU
96+
{D83DCD5A-67A0-752D-711A-54F244C6100A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
97+
{D83DCD5A-67A0-752D-711A-54F244C6100A}.Debug|Any CPU.Build.0 = Debug|Any CPU
98+
{D83DCD5A-67A0-752D-711A-54F244C6100A}.Release|Any CPU.ActiveCfg = Release|Any CPU
99+
{D83DCD5A-67A0-752D-711A-54F244C6100A}.Release|Any CPU.Build.0 = Release|Any CPU
100+
{1A8D202B-4921-1974-FB12-7811F4BDEA47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
101+
{1A8D202B-4921-1974-FB12-7811F4BDEA47}.Debug|Any CPU.Build.0 = Debug|Any CPU
102+
{1A8D202B-4921-1974-FB12-7811F4BDEA47}.Release|Any CPU.ActiveCfg = Release|Any CPU
103+
{1A8D202B-4921-1974-FB12-7811F4BDEA47}.Release|Any CPU.Build.0 = Release|Any CPU
98104
EndGlobalSection
99105
GlobalSection(SolutionProperties) = preSolution
100106
HideSolutionNode = FALSE
@@ -107,10 +113,11 @@ Global
107113
{BB73A652-FFCA-4BDD-9527-778626CEA7DA} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
108114
{9F1341A1-1F77-4910-AF7B-F53CBE7DF629} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
109115
{E7FC1D4C-D4E8-400D-8963-D7294A1653CC} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
110-
{3371623F-955A-4051-9E77-032A79614BCC} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
111-
{24F063DB-2DFB-FA0C-2AA8-C8D5365B5F4B} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
112116
{0A4C0D6C-1811-4F04-AD98-65CE132B8F1F} = {4D677FA6-4CC9-4363-BDD0-E19B5B0185F7}
113117
{E9FF2046-783A-442B-8473-F134AC5FCDFF} = {4D677FA6-4CC9-4363-BDD0-E19B5B0185F7}
118+
{3F970C17-AB49-468C-B6DF-8A0045FC77D2} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
119+
{D83DCD5A-67A0-752D-711A-54F244C6100A} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
120+
{1A8D202B-4921-1974-FB12-7811F4BDEA47} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
114121
EndGlobalSection
115122
GlobalSection(ExtensibilityGlobals) = postSolution
116123
SolutionGuid = {698C2979-1A16-437B-8C04-1357EB80CC7F}

src/a2a-net.Client.Transport.WebSocket/Configuration/JsonRpcWebSocketTransportOptions.cs renamed to src/a2a-net.Client.Asbtractions/Configuration/A2AProtocolClientOptions.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@
1111
// See the License for the specific language governing permissions and
1212
// limitations under the License.
1313

14-
namespace A2A.Client.Transport.WebSocket.Configuration;
14+
namespace A2A.Client.Configuration;
1515

1616
/// <summary>
17-
/// Represents the options used to configure a <see cref="JsonRpcWebSocketTransportFactory"/>
17+
/// Represents the options used to configure an A2A client
1818
/// </summary>
19-
public class JsonRpcWebSocketTransportFactoryOptions
19+
public class A2AProtocolClientOptions
2020
{
2121

2222
/// <summary>
23-
/// Gets/sets an <see cref="Uri"/> that reference the WebSocket endpoint to connect to
23+
/// Gets/sets the <see cref="Uri"/> that references the endpoint of the A2A server to use
2424
/// </summary>
2525
public virtual Uri Endpoint { get; set; } = null!;
26-
26+
2727
}

src/a2a-net.Client/Services/Interfaces/IA2AProtocolClient.cs renamed to src/a2a-net.Client.Asbtractions/Services/Interfaces/IA2AProtocolClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
namespace A2A.Client.Services;
1515

1616
/// <summary>
17-
/// Defines the fundamentals of a <see cref="IA2AProtocol"/> client implementation
17+
/// Defines the fundamentals of a <see cref="IA2AProtocolService"/> client implementation
1818
/// </summary>
1919
public interface IA2AProtocolClient
20-
: IA2AProtocol, IDisposable
20+
: IA2AProtocolService, IDisposable
2121
{
2222

2323

src/a2a-net.Client/a2a-net.Client.csproj renamed to src/a2a-net.Client.Asbtractions/a2a-net.Client.Abstractions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
7+
<RootNamespace>A2A.Client</RootNamespace>
78
<VersionPrefix>0.1.0</VersionPrefix>
89
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
910
<FileVersion>$(VersionPrefix)</FileVersion>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright � 2025-Present the a2a-net Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"),
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
namespace A2A.Client;
15+
16+
/// <summary>
17+
/// Defines extensions for <see cref="HttpRequestMessage"/>s
18+
/// </summary>
19+
public static class HttpRequestMessageExtensions
20+
{
21+
22+
/// <summary>
23+
/// Enables Web Assembly streaming response for the specified <see cref="HttpRequestMessage"/>
24+
/// </summary>
25+
/// <param name="request">The <see cref="HttpRequestMessage"/> to enable Web Assembly streaming response for</param>
26+
public static void EnableWebAssemblyStreamingResponse(this HttpRequestMessage request) => request.Options.Set(new("WebAssemblyEnableStreamingResponse"), true);
27+
28+
}

src/a2a-net.Client/Extensions/IServiceCollectionExtensions.cs renamed to src/a2a-net.Client.Http/Extensions/IServiceCollectionExtensions.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,15 @@ public static class IServiceCollectionExtensions
2020
{
2121

2222
/// <summary>
23-
/// Adds and configures an <see cref="IA2AProtocolClient"/>
23+
/// Adds and configures a new A2A protocol HTTP client
2424
/// </summary>
2525
/// <param name="services">The <see cref="IServiceCollection"/> to configure</param>
26-
/// <param name="setup">An <see cref="Action{T}"/> used to setup the <see cref="IA2AProtocolClient"/> to use</param>
26+
/// <param name="setup">An <see cref="Action{T}"/> used to configure the <see cref="A2AProtocolClientOptions"/> to use</param>
2727
/// <returns>The configured <see cref="IServiceCollection"/></returns>
28-
public static IServiceCollection AddA2ProtocolClient(this IServiceCollection services, Action<IA2AProtocolClientBuilder> setup)
28+
public static IServiceCollection AddA2AProtocolHttpClient(this IServiceCollection services, Action<A2AProtocolClientOptions> setup)
2929
{
30-
ArgumentNullException.ThrowIfNull(setup);
31-
var builder = new A2AProtocolClientBuilder(services);
32-
setup(builder);
33-
builder.Build();
30+
services.Configure(setup);
31+
services.AddHttpClient<IA2AProtocolClient, A2AProtocolHttpClient>();
3432
return services;
3533
}
3634

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
// Copyright � 2025-Present the a2a-net Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"),
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
namespace A2A.Client.Services;
15+
16+
/// <summary>
17+
/// Represents the default HTTP implementation of the <see cref="IA2AProtocolClient"/> interface
18+
/// </summary>
19+
/// <param name="options">The service used to access the current <see cref="A2AProtocolClientOptions"/></param>
20+
/// <param name="httpClient">The service used to perform HTTP requests</param>
21+
public class A2AProtocolHttpClient(IOptions<A2AProtocolClientOptions> options, HttpClient httpClient)
22+
: IA2AProtocolClient, IDisposable
23+
{
24+
25+
bool _disposed;
26+
27+
/// <summary>
28+
/// Gets the current <see cref="A2AProtocolClientOptions"/>
29+
/// </summary>
30+
protected A2AProtocolClientOptions Options { get; } = options.Value;
31+
32+
/// <summary>
33+
/// Gets the service used to perform HTTP requests
34+
/// </summary>
35+
protected HttpClient HttpClient { get; } = httpClient;
36+
37+
/// <inheritdoc/>
38+
public virtual async Task<RpcResponse<Models.Task>> SendTaskAsync(SendTaskRequest request, CancellationToken cancellationToken = default)
39+
{
40+
ArgumentNullException.ThrowIfNull(request);
41+
using var httpResponse = await HttpClient.PostAsJsonAsync(Options.Endpoint, request, cancellationToken).ConfigureAwait(false);
42+
httpResponse.EnsureSuccessStatusCode();
43+
return (await httpResponse.Content.ReadFromJsonAsync<RpcResponse<Models.Task>>(cancellationToken).ConfigureAwait(false))!;
44+
}
45+
46+
/// <inheritdoc/>
47+
public virtual async IAsyncEnumerable<RpcResponse<TaskEvent>> SendTaskStreamingAsync(SendTaskStreamingRequest request, [EnumeratorCancellation] CancellationToken cancellationToken = default)
48+
{
49+
ArgumentNullException.ThrowIfNull(request);
50+
using var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, MediaTypeNames.Application.Json);
51+
using var httpRequest = new HttpRequestMessage(HttpMethod.Post, Options.Endpoint) { Content = content };
52+
httpRequest.EnableWebAssemblyStreamingResponse();
53+
using var httpResponse = await HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false);
54+
httpResponse.EnsureSuccessStatusCode();
55+
var httpResponseStream = await httpResponse.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
56+
using var streamReader = new StreamReader(await httpResponse.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false));
57+
while (!streamReader.EndOfStream)
58+
{
59+
var sseMessage = await streamReader.ReadLineAsync(cancellationToken).ConfigureAwait(false);
60+
if (string.IsNullOrWhiteSpace(sseMessage)) continue;
61+
var json = sseMessage["data: ".Length..].Trim();
62+
var e = JsonSerializer.Deserialize<RpcResponse<TaskEvent>>(json)!;
63+
yield return e;
64+
}
65+
}
66+
67+
/// <inheritdoc/>
68+
public virtual async IAsyncEnumerable<RpcResponse<TaskEvent>> ResubscribeToTaskAsync(TaskResubscriptionRequest request, [EnumeratorCancellation] CancellationToken cancellationToken = default)
69+
{
70+
ArgumentNullException.ThrowIfNull(request);
71+
using var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, MediaTypeNames.Application.Json);
72+
using var httpRequest = new HttpRequestMessage(HttpMethod.Post, Options.Endpoint) { Content = content };
73+
httpRequest.EnableWebAssemblyStreamingResponse();
74+
using var httpResponse = await HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false);
75+
httpResponse.EnsureSuccessStatusCode();
76+
var httpResponseStream = await httpResponse.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
77+
using var streamReader = new StreamReader(await httpResponse.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false));
78+
while (!streamReader.EndOfStream)
79+
{
80+
var sseMessage = await streamReader.ReadLineAsync(cancellationToken).ConfigureAwait(false);
81+
if (string.IsNullOrWhiteSpace(sseMessage)) continue;
82+
var json = sseMessage["data: ".Length..].Trim();
83+
var e = JsonSerializer.Deserialize<RpcResponse<TaskEvent>>(json)!;
84+
yield return e;
85+
}
86+
}
87+
88+
/// <inheritdoc/>
89+
public virtual async Task<RpcResponse<Models.Task>> GetTaskAsync(GetTaskRequest request, CancellationToken cancellationToken = default)
90+
{
91+
ArgumentNullException.ThrowIfNull(request);
92+
using var httpResponse = await HttpClient.PostAsJsonAsync(Options.Endpoint, request, cancellationToken).ConfigureAwait(false);
93+
httpResponse.EnsureSuccessStatusCode();
94+
return (await httpResponse.Content.ReadFromJsonAsync<RpcResponse<Models.Task>>(cancellationToken).ConfigureAwait(false))!;
95+
}
96+
97+
/// <inheritdoc/>
98+
public virtual async Task<RpcResponse<Models.Task>> CancelTaskAsync(CancelTaskRequest request, CancellationToken cancellationToken = default)
99+
{
100+
ArgumentNullException.ThrowIfNull(request);
101+
ArgumentNullException.ThrowIfNull(request);
102+
using var httpResponse = await HttpClient.PostAsJsonAsync(Options.Endpoint, request, cancellationToken).ConfigureAwait(false);
103+
httpResponse.EnsureSuccessStatusCode();
104+
return (await httpResponse.Content.ReadFromJsonAsync<RpcResponse<Models.Task>>(cancellationToken).ConfigureAwait(false))!;
105+
}
106+
107+
/// <inheritdoc/>
108+
public virtual async Task<RpcResponse<TaskPushNotificationConfiguration>> GetTaskPushNotificationsAsync(GetTaskPushNotificationsRequest request, CancellationToken cancellationToken = default)
109+
{
110+
ArgumentNullException.ThrowIfNull(request);
111+
ArgumentNullException.ThrowIfNull(request);
112+
using var httpResponse = await HttpClient.PostAsJsonAsync(Options.Endpoint, request, cancellationToken).ConfigureAwait(false);
113+
httpResponse.EnsureSuccessStatusCode();
114+
return (await httpResponse.Content.ReadFromJsonAsync<RpcResponse<TaskPushNotificationConfiguration>>(cancellationToken).ConfigureAwait(false))!;
115+
}
116+
117+
/// <inheritdoc/>
118+
public virtual async Task<RpcResponse<TaskPushNotificationConfiguration>> SetTaskPushNotificationsAsync(SetTaskPushNotificationsRequest request, CancellationToken cancellationToken = default)
119+
{
120+
ArgumentNullException.ThrowIfNull(request);
121+
ArgumentNullException.ThrowIfNull(request);
122+
using var httpResponse = await HttpClient.PostAsJsonAsync(Options.Endpoint, request, cancellationToken).ConfigureAwait(false);
123+
httpResponse.EnsureSuccessStatusCode();
124+
return (await httpResponse.Content.ReadFromJsonAsync<RpcResponse<TaskPushNotificationConfiguration>>(cancellationToken).ConfigureAwait(false))!;
125+
}
126+
127+
/// <summary>
128+
/// Disposes of the <see cref="A2AProtocolHttpClient"/>
129+
/// </summary>
130+
/// <param name="disposing">A boolean indicating whether or not the <see cref="A2AProtocolHttpClient"/> is being disposed of</param>
131+
protected virtual void Dispose(bool disposing)
132+
{
133+
if (!_disposed)
134+
{
135+
if (disposing)
136+
{
137+
138+
}
139+
_disposed = true;
140+
}
141+
}
142+
143+
/// <inheritdoc/>
144+
public void Dispose()
145+
{
146+
Dispose(disposing: true);
147+
GC.SuppressFinalize(this);
148+
}
149+
150+
}

src/a2a-net.Client.Http/Usings.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright � 2025-Present the a2a-net Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"),
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
global using A2A.Client.Configuration;
15+
global using A2A.Client.Services;
16+
global using A2A.Events;
17+
global using A2A.Models;
18+
global using A2A.Requests;
19+
global using Microsoft.Extensions.DependencyInjection;
20+
global using Microsoft.Extensions.Options;
21+
global using System.Net.Http.Json;
22+
global using System.Net.Mime;
23+
global using System.Runtime.CompilerServices;
24+
global using System.Text;
25+
global using System.Text.Json;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<RootNamespace>A2A.Client</RootNamespace>
8+
<VersionPrefix>0.1.0</VersionPrefix>
9+
<AssemblyVersion>$(VersionPrefix)</AssemblyVersion>
10+
<FileVersion>$(VersionPrefix)</FileVersion>
11+
<NeutralLanguage>en</NeutralLanguage>
12+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
13+
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
14+
<IsPackable>true</IsPackable>
15+
<Title>A2A-NET Protocol HTTP Client</Title>
16+
<Description>Contains the A2A Protocol HTTP client</Description>
17+
<PackageTags>a2a;client;http</PackageTags>
18+
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
19+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
20+
<PackageReadmeFile>README.md</PackageReadmeFile>
21+
<Copyright>Copyright © 2025-Present the a2a-net Authors. All rights reserved.</Copyright>
22+
<PackageProjectUrl>https://github.com/neuroglia-io/a2a</PackageProjectUrl>
23+
<RepositoryUrl>https://github.com/neuroglia-io/a2a</RepositoryUrl>
24+
<RepositoryType>git</RepositoryType>
25+
<DebugType>embedded</DebugType>
26+
</PropertyGroup>
27+
28+
<ItemGroup>
29+
<None Include="..\..\README.md">
30+
<Pack>True</Pack>
31+
<PackagePath>\</PackagePath>
32+
</None>
33+
</ItemGroup>
34+
35+
<ItemGroup>
36+
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.4" />
37+
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.4" />
38+
</ItemGroup>
39+
40+
<ItemGroup>
41+
<ProjectReference Include="..\a2a-net.Client.Asbtractions\a2a-net.Client.Abstractions.csproj" />
42+
</ItemGroup>
43+
44+
</Project>

0 commit comments

Comments
 (0)