Skip to content

Implement alpha version of v1.0#300

Open
rokonec wants to merge 22 commits intoa2aproject:mainfrom
rokonec:rokonec/implement-preview-version-of-v1.0
Open

Implement alpha version of v1.0#300
rokonec wants to merge 22 commits intoa2aproject:mainfrom
rokonec:rokonec/implement-preview-version-of-v1.0

Conversation

@rokonec
Copy link
Collaborator

@rokonec rokonec commented Feb 25, 2026

A2A .NET SDK v1 Implementation

Summary

Complete implementation of the A2A v1 specification for the .NET SDK, including protocol models, server-side architecture redesign, simple CRUD task store, atomic subscribe, observability, and backward compatibility with v0.3.

241 files changed, 19,857 insertions, 8,770 deletions across 21 commits.

How to Review

This PR is large but logically layered. Recommended review order by commit:

# Commit Focus Area Key Files
1 d223872 v1 spec models + SDK refactor src/A2A/Models/, client, v0.3 compat
2 3ba763c Review findings fixes Tests, docs, cleanup
3 9e11c78 Security hardening A2AHttpProcessor.cs, A2AJsonRpcProcessor.cs
4 0ebe07a TFM update (net10.0+net8.0) .csproj files, removed polyfills
5 ad6e513 Server architecture redesign A2AServer.cs, IAgentHandler.cs, DI, observability
6 2f8e41f REST handler tracing AspNetCore processors
7 9979994 Stale task fix MaterializeResponseAsync, CancelTaskAsync
8-11 03328b2..6cc23bb Event sourcing (intermediate, superseded by #12)
12 a7df8a6 Replace ES with CRUD ITaskStore ITaskStore.cs, InMemoryTaskStore.cs, atomic subscribe
13 4cf8a59+f0bd87e Cleanup TaskCreatedCount fix, ApplyEventAsync rename
14 752caf0 CancelTask metadata (spec late change) CancelTaskRequest.cs
15 e1dd2a8 historyLength validation A2AServer.GetTaskAsync
16 bba4e39 IsStreaming → StreamingResponse (v1.1 prep) RequestContext.cs
17 4602462 AgentContext → RequestContext 12 files renamed
18-19 a20e52e+b9565fe ContextId generation Nullable experiment → restored with ClientProvidedContextId flag
20 69a9030 FileStoreDemo fix Sample update
21 a65992c MessageResponder helper MessageResponder.cs, sample simplification

Note: Commits 8-11 introduce event sourcing then commit 12 replaces it with a simpler CRUD store. Commits 18-19 experiment with nullable ContextId then restore it with a boolean flag per spec §3.4.1.

Major Changes

1. A2A v1 Spec Models (d223872)

  • Fix 16 proto fidelity gaps across 46 model types
  • Add ContentCase/PayloadCase computed enums for all oneof types
  • Implement full ListTasks with pagination, sorting, filtering
  • Port REST API (MapHttpA2A) with 11 endpoints and SSE streaming
  • Add A2A-Version header negotiation to JSON-RPC processor
  • Create A2A.V0_3 backward compatibility project (65 files, 255 tests)
  • Add docs/migration-guide-v1.md (12 sections, 21 breaking changes documented)

2. Security Hardening (9e11c78)

  • Sanitize raw Exception.Message in 5 HTTP/JSON-RPC error responses to prevent leaking internal details
  • Sanitize JsonException.Message in DeserializeAndValidate
  • Add error handling to SSE streaming (best-effort JSON-RPC error event on failure)

3. Target Framework Update (0ebe07a)

  • net9.0;net8.0;netstandard2.0net10.0;net8.0 across all projects
  • Remove 8 polyfill files and all #if NET conditional compilation blocks

4. Server Architecture Redesign (ad6e513)

BREAKING: ITaskManager/TaskManagerIA2ARequestHandler/A2AServer

  • A2AServer: Lifecycle orchestrator with context resolution, terminal state guards, event persistence, history management
  • IAgentHandler: Easy-path agent contract (ExecuteAsync + default CancelAsync)
  • RequestContext: Pre-resolved request envelope (renamed from AgentContext)
  • AgentEventQueue: Channel-backed event stream with typed Enqueue* methods
  • TaskUpdater: Lifecycle convenience helper for all 8 task states
  • MessageResponder: Reply convenience helper — auto-sets Role.Agent, MessageId, ContextId
  • A2ADiagnostics: ActivitySource('A2A') + Meter('A2A') with 9 metric instruments
  • DI: AddA2AAgent<T>() one-line registration + MapA2A(path) endpoint mapping

5. Simple CRUD Task Store (a7df8a6)

Replace event sourcing with a 4-method ITaskStore interface matching the Python SDK pattern:

public interface ITaskStore
{
    Task<AgentTask?> GetTaskAsync(string taskId, ...);
    Task SaveTaskAsync(string taskId, AgentTask task, ...);
    Task DeleteTaskAsync(string taskId, ...);
    Task<ListTasksResponse> ListTasksAsync(ListTasksRequest request, ...);
}
  • Atomic subscribe: Per-task SemaphoreSlim in ChannelEventNotifier guarantees no events missed between task snapshot and channel registration
  • InMemoryTaskStore: ConcurrentDictionary<string, AgentTask> with deep clone
  • FileTaskStore (sample): File-backed store with task JSON files + context indexes

6. Spec Compliance Fixes

  • CancelTask metadata (752caf0): Added Metadata property per spec proto field 3
  • historyLength validation (e1dd2a8): Reject negative values with InvalidParams
  • ContextId generation (b9565fe): Agents always generate contextId per spec §3.4.1; ClientProvidedContextId flag lets agents distinguish client-provided vs SDK-generated
  • StreamingResponse (bba4e39): Renamed from IsStreaming to avoid terminology conflict with v1.1 streaming requests

7. MessageResponder Helper (a65992c)

// Before (8 lines):
var reply = new Message { Role = Role.Agent, MessageId = Guid.NewGuid().ToString("N"), Parts = [...] };
await eventQueue.EnqueueMessageAsync(reply, ct);

// After (2 lines):
var responder = new MessageResponder(eventQueue, context.ContextId);
await responder.ReplyAsync("Echo: " + context.UserText, ct);

Store Architecture Evolution

  1. Event sourcing (commits 8-11): Introduced IEventStore/ITaskEventStore with 7 methods
  2. Analysis: A2A spec requires mutable task state, not event logs. Python SDK uses 3 methods.
  3. CRUD store (commit 12): Replaced with ITaskStore (4 methods). Subscribe race condition solved via atomic per-task locking.

Bug Fixes

  • Stale task objects (9979994): Re-fetch task from store after consuming all events
  • TaskCreatedCount (4cf8a59): Only counts genuinely new tasks
  • AutoPersistEvents removed (f0bd87e): Footgun — renamed to ApplyEventAsync
  • Bounded channel deadlock (ad6e513): Run handler concurrently with consumer
  • ContextId spec compliance (b9565fe): Always generate contextId when client doesn't provide one

Breaking Changes

Change Commit Mitigation
ITaskManagerIA2ARequestHandler ad6e513 Use AddA2AAgent<T>() DI helper
AgentContextRequestContext 4602462 Symbol rename
ITaskStore (new interface) a7df8a6 4 simple CRUD methods
TFM: netstandard2.0/net9.0 dropped 0ebe07a Target net8.0 or net10.0
IsStreamingStreamingResponse bba4e39 Property rename
AutoPersistEvents removed f0bd87e No longer configurable

Validation

Check Result
dotnet build 0 errors, 0 warnings
dotnet test (net8.0 + net10.0) 1,174 tests pass, 0 failures
TCK mandatory tests 76/76 pass
FileStoreDemo data recovery Works correctly
v0.3 backward compatibility 262 tests pass per TFM

Complete v1 implementation:
- Fix 16 proto fidelity gaps across 46 model types
- Add ContentCase/PayloadCase computed enums for all oneof types
- Implement full ListTasks with pagination, sorting, filtering
- Port REST API (MapHttpA2A) with 11 endpoints and SSE streaming
- Add A2A-Version header negotiation to JSON-RPC processor
- Fix A2AClient.Dispose, InMemoryTaskStore race conditions
- Seal JsonRpcResponseResult/JsonRpcStreamedResult
- Fix AgentCardSignature.Header type (object -> JsonElement)

Backward compatibility:
- Create A2A.V0_3 project (65 files, 255 tests) for compat layer
- Both v1 and v0.3 coexist via separate NuGet packages

Documentation:
- Add docs/migration-guide-v1.md (12 sections, 21 breaking changes)

Samples:
- Update all agents with Version, skills
- SpecComplianceAgent: cancel, continuation, history tracking

Build: 0 errors, 0 warnings
Tests: 986 unit tests passed
TCK: 76 mandatory tests passed, 0 failed
- Remove unused A2AClient(HttpClient, string) constructor (Issue #1)
- Add XML docs for DistributedCacheTaskStore limitations: ListTasksAsync
  returns empty on key-value caches, UpdateStatusAsync/AppendHistoryAsync
  have read-modify-write race conditions (Issues a2aproject#2, a2aproject#3)
- Refactor A2AMethods.IsValidMethod for readability, reuse
  IsStreamingMethod/IsPushNotificationMethod helpers
- Add TaskManager migration guide (docs/taskmanager-migration-guide.md)
- Restore v1 test coverage (134 → 213 tests):
  - New tests for SendMessageResponse, StreamResponse, Message, Role, Part
  - A2AClient tests for ListTasks, CancelTask, push notification CRUD
  - AgentCard tests for SupportedInterfaces, SecuritySchemes
  - TaskManager test for GetExtendedAgentCard
- Restore AspNetCore test coverage (40 → 71 tests):
  - ListTasks validation (pageSize, historyLength)
  - Push notification and ExtendedAgentCard error handling
  - Version negotiation (A2A-Version header: 0.3, 1.0, unsupported)
Security:
- Sanitize raw Exception.Message in 5 HTTP/JSON-RPC error responses to
  prevent leaking internal details (stack traces, file paths, DB errors)
- Sanitize JsonException.Message in DeserializeAndValidate to avoid
  exposing internal type/path details in InvalidParams errors
- A2AException.Message still exposed (intentional, app-defined errors)

Correctness:
- Add try/catch to JsonRpcStreamedResult SSE streaming; write best-effort
  JSON-RPC error event on failure, catch OperationCanceledException
- Add error handling to A2AEventStreamResult SSE streaming alongside
  existing OperationCanceledException catch (AOT-safe string literal)
- Return 400 Bad Request for invalid status query parameter in
  ListTasksRestAsync instead of silently ignoring

Documentation:
- Add <remarks> on MapHttpA2A documenting /v1/ route prefix convention
  and missing multi-tenant route support (/{tenant}/... variants)
…e target frameworks across all projects:\n- Libraries: net9.0;net8.0;netstandard2.0 → net10.0;net8.0\n- AspNetCore: net9.0;net8.0 → net10.0;net8.0\n- Tests: net8.0;net9.0 → net10.0;net8.0\n- Samples: net9.0 → net10.0\n\nConditionally exclude System.Linq.AsyncEnumerable and\nSystem.Net.ServerSentEvents for net10.0 (now in-box in BCL).\n\nRemove 8 polyfill files and all #if NET / #if NET8_0_OR_GREATER\nconditional compilation blocks no longer needed without\nnetstandard2.0.\n\nFix new .NET 10 analyzer warnings: CA1869 in AgentClient sample,\nCS8604 in AspNetCore unit tests."
…, and observability

BREAKING CHANGE: ITaskManager renamed to IA2ARequestHandler, TaskManager renamed to A2AServer

Server Architecture:
- A2AServer (formerly TaskManager): lifecycle orchestrator with context resolution,
  terminal state guards, event persistence, history management, and try/finally
  safety net preventing deadlocks when handlers throw or forget to close the queue
- IAgentHandler: easy-path agent contract with ExecuteAsync + default CancelAsync
- AgentContext: pre-resolved request context with TaskId, ContextId, UserText
- AgentEventQueue: Channel-backed event stream with typed Enqueue* methods
- TaskUpdater: lifecycle convenience helper for all 8 task states
- A2AServerOptions: AutoAppendHistory + AutoPersistEvents configuration
- Fix bounded channel deadlock by running handler concurrently with consumer

Observability:
- A2ADiagnostics: ActivitySource('A2A') + Meter('A2A') with 9 metric instruments
- A2AAspNetCoreDiagnostics: consolidated ActivitySource('A2A.AspNetCore'),
  replacing 3 fragmented sources (A2A.Processor, A2A.HttpProcessor, A2A.Endpoint)
- Client spans on all 11 IA2AClient methods via 2 instrumented private helpers
- A2ACardResolver span for agent card discovery
- W3C Trace Context auto-propagated via HttpClient

DI Integration:
- AddA2AAgent<T>(): one-line service registration with AOT support
- MapA2A(path): DI-aware endpoint mapping resolving from container

Samples:
- All agents rewritten to IAgentHandler pattern (67-144 lines → 20-97 lines)
- Program.cs uses AddA2AAgent<T>() + MapA2A() DI pattern
- SemanticKernelAgent migrated to IAgentHandler + TaskUpdater

Tests: 302 pass (231 UnitTests + 71 AspNetCore) on net8.0 + net10.0
TCK: 76 mandatory tests pass
…ndler tracing

- Rename taskManager → requestHandler across all AspNetCore processors and tests
  for consistency with IA2ARequestHandler interface name
- Add Activity tracing + ILogger to all 12 REST handlers (REST.* span names)
- Delete simplified (no-trace, no-log) exception wrappers — unified wrapper pattern
- All 17 HTTP handlers now have Activity spans + error logging
- V0.3 CancelTaskAsync: re-fetch task after UpdateStatusAsync instead of
  returning pre-cancellation object (port of upstream a2aproject#283)
- V1 MaterializeResponseAsync: re-fetch task from store after consuming
  all events to reflect final persisted state (status updates, artifacts)
- Both throw if re-fetch returns null to surface store inconsistencies
  rather than silently returning stale data

Critical for stores that don't mutate objects in-place (distributed
caches, databases). Masked by InMemoryTaskStore's reference semantics.
- add IEventStore, ITaskEventStore, EventEnvelope, TaskProjection, InMemoryEventStore
- implement spec-compliant SubscribeToTaskAsync with catch-up-then-live
- simplify PersistEventAsync to single AppendAsync, fix artifact append semantics
- remove ITaskStore, InMemoryTaskStore, DistributedCacheTaskStore, TaskStoreAdapter
- add 35 new unit tests, pass all 76 TCK mandatory tests

🏗️ - Generated by Copilot
- add file-backed ITaskEventStore with per-task JSONL event logs
- maintain materialized projection files for O(1) GetTaskAsync
- add context index files for efficient ListTasksAsync filtering
- make TaskStateExtensions.IsTerminal and TaskProjection public for external use

📁 - Generated by Copilot
- add self-contained demo with server start, task creation, stop, restart, verify
- demonstrate ListTasksAsync by context filter works across restarts
- add --store file and --data-dir options to AgentServer sample
- make TaskStateExtensions public for external ITaskEventStore implementors

📁 - Generated by Copilot
- extract notification concern into ChannelEventNotifier and ChannelEventSubscriber
- remove ~115 lines of duplicate subscriber boilerplate from InMemoryEventStore and FileEventStore
- add GetTaskWithVersionAsync for atomic task+version reads (fixes TOCTOU race in subscribe)
- add dedicated storage JSON options for FileEventStore JSONL safety
- add 13 new tests for subscriber, notifier, and atomic version reads

🏗️ - Generated by Copilot
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @rokonec, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a preview implementation of the A2A v1.0 protocol specification, marking a significant upgrade to the SDK's core architecture. The changes involve a complete overhaul of the data models, client, and server components to align with the new protocol's serialization conventions and interaction patterns. A dedicated compatibility layer has been added to ease the transition for existing users, alongside extensive documentation and updated samples to demonstrate the new API usage.

Highlights

  • A2A v1.0 Protocol Implementation: The core SDK has been refactored to align with the A2A v1.0 specification, adopting ProtoJSON serialization conventions (SCREAMING_SNAKE_CASE enums, field-presence 'oneof' patterns) and replacing discriminator-based polymorphism with flat sealed types.
  • Backward Compatibility Layer: A new 'A2A.V0_3' NuGet package and project have been introduced, containing the v0.3 SDK models and logic, allowing for a phased migration strategy for existing consumers.
  • Server-Side Architecture Refactoring: The server-side components have been overhauled to use an event-sourcing pattern with 'ITaskEventStore', 'IEventSubscriber', and 'AgentEventQueue', providing a more robust and scalable task management system.
  • New REST API Binding: The SDK now includes support for an HTTP+JSON REST API binding alongside the existing JSON-RPC binding, offering more flexibility in agent communication.
  • Enhanced Client and Server APIs: Client methods and server-side handlers have been updated to reflect the new v1 API, including new operations like 'ListTasks' and improved handling of push notifications and extended agent cards.
  • Updated Documentation and Samples: Comprehensive migration guides ('docs/migration-guide-v1.md', 'docs/taskmanager-migration-guide.md') and updated sample applications are provided to assist developers in adopting the new version.
Changelog
  • .gitignore
    • Added Copilot tracking artifacts to the ignore list.
  • .vscode/launch.json
    • Added new launch configurations for various sample applications.
  • .vscode/tasks.json
    • Added new build tasks for FileStoreDemo and AgentServer projects.
  • A2A.slnx
    • Included the newly created 'A2A.V0_3' project and its associated unit tests.
  • README.md
    • Updated the protocol compatibility section to reflect A2A v1.0 specification.
    • Added information about the migration guide and the 'A2A.V0_3' NuGet package.
    • Revised the 'Getting Started' example code to demonstrate the new v1 API.
  • docs/migration-guide-v1.md
    • Added a new migration guide detailing the upgrade process from v0.3 to v1.
  • docs/taskmanager-migration-guide.md
    • Added a new migration guide specifically for the TaskManager component from v0.3 to v1.
  • samples/A2ACli/A2ACli.csproj
    • Updated the target framework to net10.0.
  • samples/A2ACli/Host/A2ACli.cs
    • Updated client calls to utilize the new v1 API, including changes to agent card URL resolution, task retrieval, part creation, and message sending parameters.
  • samples/AgentClient/AgentClient.csproj
    • Updated the target framework to net10.0.
  • samples/AgentClient/Samples/GetAgentDetailsSample.cs
    • Added JsonSerializerOptions for indented output in agent card display.
  • samples/AgentClient/Samples/MessageBasedCommunicationSample.cs
    • Updated client calls to conform to the new v1 API for message-based communication.
  • samples/AgentClient/Samples/TaskBasedCommunicationSample.cs
    • Updated client calls to conform to the new v1 API for task-based communication.
  • samples/AgentServer/AgentServer.csproj
    • Updated the target framework to net10.0.
  • samples/AgentServer/EchoAgent.cs
    • Refactored to implement the new 'IAgentHandler' interface and utilize 'TaskUpdater' for server-side logic.
  • samples/AgentServer/EchoAgentWithTasks.cs
    • Refactored to implement the new 'IAgentHandler' interface and utilize 'TaskUpdater' for server-side logic.
  • samples/AgentServer/FileEventStore.cs
    • Added a new file implementing a file-backed event store for task persistence.
  • samples/AgentServer/Program.cs
    • Updated agent registration to use the new 'AddA2AAgent' DI extension and introduced an option for a file-backed event store.
    • Updated OpenTelemetry activity sources.
  • samples/AgentServer/ResearcherAgent.cs
    • Refactored to implement the new 'IAgentHandler' interface and utilize 'TaskUpdater' for server-side logic.
  • samples/AgentServer/SpecComplianceAgent.cs
    • Refactored to implement the new 'IAgentHandler' interface and utilize 'TaskUpdater' for server-side logic.
  • samples/FileStoreDemo/FileStoreDemo.csproj
    • Added a new project for demonstrating the file-backed event store.
  • samples/FileStoreDemo/Program.cs
    • Added a new demo program illustrating the functionality of the file-backed event store.
  • samples/SemanticKernelAgent/Program.cs
    • Updated DI registration to use the new 'IAgentHandler' interface and 'A2AServer' components.
  • samples/SemanticKernelAgent/SemanticKernelAgent.csproj
    • Updated the target framework to net10.0.
  • samples/SemanticKernelAgent/SemanticKernelTravelAgent.cs
    • Refactored to implement the new 'IAgentHandler' interface and utilize 'TaskUpdater' for server-side logic.
  • src/A2A.AspNetCore/A2A.AspNetCore.csproj
    • Updated target frameworks to net10.0;net8.0.
  • src/A2A.AspNetCore/A2AAspNetCoreDiagnostics.cs
    • Added a new diagnostics class for ASP.NET Core integration.
  • src/A2A.AspNetCore/A2AEndpointRouteBuilderExtensions.cs
    • Refactored 'MapA2A' and 'MapWellKnownAgentCard' to use DI-registered services.
    • Added 'MapHttpA2A' for mapping new REST API endpoints.
  • src/A2A.AspNetCore/A2AHttpProcessor.cs
    • Refactored to handle new v1 REST API endpoints and response types.
    • Updated exception handling and logging.
  • src/A2A.AspNetCore/A2AJsonRpcProcessor.cs
    • Refactored to handle new v1 JSON-RPC methods, parameters, and version negotiation.
    • Updated parameter deserialization and validation logic.
  • src/A2A.AspNetCore/A2AServiceCollectionExtensions.cs
    • Added new DI extension methods for simplified agent hosting setup.
  • src/A2A.AspNetCore/Caching/DistributedCacheTaskStore.cs
    • Removed the DistributedCacheTaskStore implementation.
  • src/A2A.AspNetCore/JsonRpcResponseResult.cs
    • Changed the class to sealed.
  • src/A2A.AspNetCore/JsonRpcStreamedResult.cs
    • Changed the class to sealed and updated error handling for streaming responses.
  • src/A2A.V0_3/A2A.V0_3.csproj
    • Added a new project for v0.3 backward compatibility, targeting net10.0;net8.0.
  • src/A2A.V0_3/A2AErrorCode.cs
    • Added a new file containing v0.3 specific A2A error codes.
  • src/A2A.V0_3/A2AException.cs
    • Added a new file containing the v0.3 A2AException class.
  • src/A2A.V0_3/A2AExceptionExtensions.cs
    • Added a new file for v0.3 A2AException extension methods.
  • src/A2A.V0_3/A2AJsonConverter.cs
    • Renamed from 'src/A2A/A2AJsonConverter.cs' to support v0.3 models.
  • src/A2A.V0_3/A2AJsonUtilities.cs
    • Added a new file for v0.3 JSON serialization utilities.
  • src/A2A.V0_3/BaseKindDiscriminatorConverter.cs
    • Renamed from 'src/A2A/BaseKindDiscriminatorConverter.cs' to support v0.3 models.
  • src/A2A.V0_3/Client/A2ACardResolver.cs
    • Added a new file for the v0.3 A2A card resolver.
  • src/A2A.V0_3/Client/A2AClient.cs
    • Added a new file for the v0.3 A2A client implementation.
  • src/A2A.V0_3/Client/A2AClientExtensions.cs
    • Added a new file for v0.3 A2A client extension methods.
  • src/A2A.V0_3/Client/IA2AClient.cs
    • Added a new file for the v0.3 A2A client interface.
  • src/A2A.V0_3/Client/JsonRpcContent.cs
    • Added a new file for v0.3 JSON-RPC content handling.
  • src/A2A.V0_3/Extensions/AIContentExtensions.cs
    • Added a new file for v0.3 AI content extension methods.
  • src/A2A.V0_3/Extensions/AdditionalPropertiesExtensions.cs
    • Added a new file for v0.3 additional properties extension methods.
  • src/A2A.V0_3/Extensions/AgentTaskExtensions.cs
    • Added a new file for v0.3 agent task extension methods.
  • src/A2A.V0_3/GlobalSuppressions.cs
    • Added a new file for v0.3 global code analysis suppressions.
  • src/A2A.V0_3/JsonRpc/A2AMethods.cs
    • Added a new file for v0.3 JSON-RPC method constants.
  • src/A2A.V0_3/JsonRpc/JsonRpcError.cs
    • Added a new file for v0.3 JSON-RPC error model.
  • src/A2A.V0_3/JsonRpc/JsonRpcId.cs
    • Added a new file for v0.3 JSON-RPC ID model.
  • src/A2A.V0_3/JsonRpc/JsonRpcRequest.cs
    • Added a new file for v0.3 JSON-RPC request model.
  • src/A2A.V0_3/JsonRpc/JsonRpcRequestConverter.cs
    • Added a new file for v0.3 JSON-RPC request converter.
  • src/A2A.V0_3/JsonRpc/JsonRpcResponse.cs
    • Added a new file for v0.3 JSON-RPC response model.
  • src/A2A.V0_3/JsonRpc/MethodNotFoundError.cs
    • Added a new file for v0.3 method not found error model.
  • src/A2A.V0_3/KebabCaseLowerJsonStringEnumConverter.cs
    • Renamed from 'src/A2A/KebabCaseLowerJsonStringEnumConverter.cs' to support v0.3 models.
  • src/A2A.V0_3/Log.cs
    • Added a new file for v0.3 logging utilities.
  • src/A2A.V0_3/Models/A2AEventKind.cs
    • Renamed from 'src/A2A/Models/A2AEventKind.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/A2AResponse.cs
    • Renamed from 'src/A2A/Models/A2AResponse.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/AgentCapabilities.cs
    • Added a new file for v0.3 agent capabilities model.
  • src/A2A.V0_3/Models/AgentCard.cs
    • Added a new file for v0.3 agent card model.
  • src/A2A.V0_3/Models/AgentCardSignature.cs
    • Added a new file for v0.3 agent card signature model.
  • src/A2A.V0_3/Models/AgentExtension.cs
    • Added a new file for v0.3 agent extension model.
  • src/A2A.V0_3/Models/AgentInterface.cs
    • Added a new file for v0.3 agent interface model.
  • src/A2A.V0_3/Models/AgentMessage.cs
    • Renamed from 'src/A2A/Models/AgentMessage.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/AgentProvider.cs
    • Added a new file for v0.3 agent provider model.
  • src/A2A.V0_3/Models/AgentSkill.cs
    • Added a new file for v0.3 agent skill model.
  • src/A2A.V0_3/Models/AgentTask.cs
    • Added a new file for v0.3 agent task model.
  • src/A2A.V0_3/Models/AgentTaskStatus.cs
    • Renamed from 'src/A2A/Models/AgentTaskStatus.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/AgentTransport.cs
    • Renamed from 'src/A2A/Models/AgentTransport.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/Artifact.cs
    • Added a new file for v0.3 artifact model.
  • src/A2A.V0_3/Models/DataPart.cs
    • Renamed from 'src/A2A/Models/DataPart.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/FileContent.cs
    • Renamed from 'src/A2A/Models/FileContent.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/FilePart.cs
    • Renamed from 'src/A2A/Models/FilePart.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/GetTaskPushNotificationConfigParams.cs
    • Renamed from 'src/A2A/Models/GetTaskPushNotificationConfigParams.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/MessageSendParams.cs
    • Renamed from 'src/A2A/Models/MessageSendParams.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/Part.cs
    • Added a new file for v0.3 part model.
  • src/A2A.V0_3/Models/PartKind.cs
    • Renamed from 'src/A2A/Models/PartKind.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/PushNotificationAuthenticationInfo.cs
    • Renamed from 'src/A2A/Models/PushNotificationAuthenticationInfo.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/PushNotificationConfig.cs
    • Added a new file for v0.3 push notification config model.
  • src/A2A.V0_3/Models/SecurityScheme.cs
    • Added a new file for v0.3 security scheme model.
  • src/A2A.V0_3/Models/TaskArtifactUpdateEvent.cs
    • Added a new file for v0.3 task artifact update event model.
  • src/A2A.V0_3/Models/TaskIdParams.cs
    • Renamed from 'src/A2A/Models/TaskIdParams.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/TaskPushNotificationConfig.cs
    • Added a new file for v0.3 task push notification config model.
  • src/A2A.V0_3/Models/TaskQueryParams.cs
    • Renamed from 'src/A2A/Models/TaskQueryParams.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/TaskState.cs
    • Added a new file for v0.3 task state enum.
  • src/A2A.V0_3/Models/TaskStatusUpdateEvent.cs
    • Added a new file for v0.3 task status update event model.
  • src/A2A.V0_3/Models/TaskUpdateEvent.cs
    • Renamed from 'src/A2A/Models/TaskUpdateEvent.cs' to support v0.3 models.
  • src/A2A.V0_3/Models/TextPart.cs
    • Renamed from 'src/A2A/Models/TextPart.cs' to support v0.3 models.
  • src/A2A.V0_3/Server/ITaskManager.cs
    • Renamed from 'src/A2A/Server/ITaskManager.cs' to support v0.3 server components.
  • src/A2A.V0_3/Server/ITaskStore.cs
    • Renamed from 'src/A2A/Server/ITaskStore.cs' to support v0.3 server components.
  • src/A2A.V0_3/Server/InMemoryTaskStore.cs
    • Renamed from 'src/A2A/Server/InMemoryTaskStore.cs' to support v0.3 server components.
  • src/A2A.V0_3/Server/TaskManager.cs
    • Renamed from 'src/A2A/Server/TaskManager.cs' to support v0.3 server components.
    • Updated task cancellation logic to fetch the task after status update.
  • src/A2A.V0_3/Server/TaskUpdateEventEnumerator.cs
    • Added a new file for the v0.3 task update event enumerator.
  • src/A2A/A2A.csproj
    • Updated target frameworks to net10.0;net8.0 and added IsAotCompatible.
    • Removed polyfills for newer .NET versions.
  • src/A2A/A2AErrorCode.cs
    • Added new error codes for InvalidAgentResponse, ExtendedAgentCardNotConfigured, ExtensionSupportRequired, and VersionNotSupported.
  • src/A2A/A2AJsonUtilities.cs
    • Updated JSON serialization options to remove custom converters, relying on source generation and field-presence patterns.
    • Updated JsonSerializable attributes to reflect new v1 models.
  • src/A2A/Client/A2ACardResolver.cs
    • Updated to use new v1 API and diagnostics for tracing.
  • src/A2A/Client/A2AClient.cs
    • Updated client methods to use new v1 request/response types and JSON-RPC methods.
    • Added IDisposable implementation.
    • Introduced OpenTelemetry diagnostics for client requests.
  • src/A2A/Client/A2AClientExtensions.cs
    • Updated extension methods to use the new v1 API for simplified text message sending.
  • src/A2A/Client/IA2AClient.cs
    • Updated the client interface to reflect the new v1 API methods and request/response types.
  • src/A2A/Client/JsonRpcContent.cs
    • Removed conditional compilation for NET8_0_OR_GREATER, as it's now universally supported.
  • src/A2A/Diagnostics/A2ADiagnostics.cs
    • Added a new diagnostics class for OpenTelemetry tracing and metrics.
  • src/A2A/Extensions/AIContentExtensions.cs
    • Updated to map between new v1 'Message' and 'Part' models and 'ChatMessage' and 'AIContent' types.
  • src/A2A/Extensions/TaskStateExtensions.cs
    • Added a new extension method to check if a 'TaskState' is terminal.
  • src/A2A/JsonRpc/A2AMethods.cs
    • Updated JSON-RPC method names to align with the v1 specification (e.g., 'SendMessage' instead of 'message/send').
    • Added new methods for 'ListTasks', 'GetExtendedAgentCard', and push notification management.
  • src/A2A/Models/AgentCapabilities.cs
    • Updated fields to align with the v1 specification, including nullable properties and 'ExtendedAgentCard' capability.
  • src/A2A/Models/AgentCard.cs
    • Major refactoring of the 'AgentCard' structure to align with the v1 specification, including removal of 'Url', addition of 'SupportedInterfaces', and changes to required fields.
  • src/A2A/Models/AgentCardSignature.cs
    • Updated the 'Header' property type to 'Dictionary<string, JsonElement>'.
  • src/A2A/Models/AgentExtension.cs
    • Updated fields to align with the v1 specification, including nullable 'Required' and 'Params' as JsonElement.
  • src/A2A/Models/AgentInterface.cs
    • Updated fields to align with the v1 specification, including 'ProtocolBinding' and 'ProtocolVersion'.
  • src/A2A/Models/AgentSkill.cs
    • Updated fields to align with the v1 specification, including 'SecurityRequirements'.
  • src/A2A/Models/AgentTask.cs
    • Updated fields to align with the v1 specification, including 'TaskStatus' and nullable 'History'.
  • src/A2A/Models/ApiKeySecurityScheme.cs
    • Added a new file for the v1 API key security scheme model.
  • src/A2A/Models/Artifact.cs
    • Updated fields to align with the v1 specification, including nullable 'Extensions' and 'Metadata'.
  • src/A2A/Models/AuthenticationInfo.cs
    • Added a new file for the v1 authentication information model.
  • src/A2A/Models/AuthorizationCodeOAuthFlow.cs
    • Added a new file for the v1 authorization code OAuth flow model.
  • src/A2A/Models/CancelTaskRequest.cs
    • Added a new file for the v1 cancel task request model.
  • src/A2A/Models/ClientCredentialsOAuthFlow.cs
    • Added a new file for the v1 client credentials OAuth flow model.
  • src/A2A/Models/CreateTaskPushNotificationConfigRequest.cs
    • Added a new file for the v1 create task push notification config request model.
  • src/A2A/Models/DeleteTaskPushNotificationConfigRequest.cs
    • Added a new file for the v1 delete task push notification config request model.
  • src/A2A/Models/DeviceCodeOAuthFlow.cs
    • Added a new file for the v1 device code OAuth flow model.
  • src/A2A/Models/GetExtendedAgentCardRequest.cs
    • Added a new file for the v1 get extended agent card request model.
  • src/A2A/Models/GetTaskPushNotificationConfigRequest.cs
    • Added a new file for the v1 get task push notification config request model.
  • src/A2A/Models/GetTaskRequest.cs
    • Added a new file for the v1 get task request model.
  • src/A2A/Models/HttpAuthSecurityScheme.cs
    • Added a new file for the v1 HTTP auth security scheme model.
  • src/A2A/Models/ImplicitOAuthFlow.cs
    • Added a new file for the v1 implicit OAuth flow model, marked as obsolete.
  • src/A2A/Models/ListTaskPushNotificationConfigRequest.cs
    • Added a new file for the v1 list task push notification config request model.
  • src/A2A/Models/ListTaskPushNotificationConfigResponse.cs
    • Added a new file for the v1 list task push notification config response model.
  • src/A2A/Models/ListTasksRequest.cs
    • Added a new file for the v1 list tasks request model.
  • src/A2A/Models/ListTasksResponse.cs
    • Added a new file for the v1 list tasks response model.
  • src/A2A/Models/Message.cs
    • Added a new file for the v1 message model.
  • src/A2A/Models/MutualTlsSecurityScheme.cs
    • Added a new file for the v1 mutual TLS security scheme model.
  • src/A2A/Models/OAuth2SecurityScheme.cs
    • Added a new file for the v1 OAuth2 security scheme model.
  • src/A2A/Models/OAuthFlows.cs
    • Added a new file for the v1 OAuth flows model.
  • src/A2A/Models/OpenIdConnectSecurityScheme.cs
    • Added a new file for the v1 OpenID Connect security scheme model.
  • src/A2A/Models/Part.cs
    • Added a new file for the v1 part model, using field-presence for content types.
  • src/A2A/Models/PasswordOAuthFlow.cs
    • Added a new file for the v1 password OAuth flow model, marked as obsolete.
  • src/A2A/Models/PushNotificationConfig.cs
    • Updated fields to align with the v1 specification, including 'AuthenticationInfo'.
  • src/A2A/Models/Role.cs
    • Added a new file for the v1 role enum, using SCREAMING_SNAKE_CASE.
  • src/A2A/Models/SecurityRequirement.cs
    • Added a new file for the v1 security requirement model.
  • src/A2A/Models/SecurityScheme.cs
    • Refactored to use field-presence instead of JsonPolymorphic for security scheme types.
  • src/A2A/Models/SendMessageConfiguration.cs
    • Added a new file for the v1 send message configuration model.
  • src/A2A/Models/SendMessageRequest.cs
    • Added a new file for the v1 send message request model.
  • src/A2A/Models/SendMessageResponse.cs
    • Added a new file for the v1 send message response model.
  • src/A2A/Models/StreamResponse.cs
    • Added a new file for the v1 stream response model.
  • src/A2A/Models/StringList.cs
    • Added a new file for the v1 string list model.
  • src/A2A/Models/SubscribeToTaskRequest.cs
    • Added a new file for the v1 subscribe to task request model.
  • src/A2A/Models/TaskArtifactUpdateEvent.cs
    • Updated fields to align with the v1 specification, including explicit taskId and contextId.
  • src/A2A/Models/TaskPushNotificationConfig.cs
    • Updated fields to align with the v1 specification, including explicit 'Id' and 'Tenant'.
  • src/A2A/Models/TaskState.cs
    • Updated enum values to SCREAMING_SNAKE_CASE with type prefix.
  • src/A2A/Models/TaskStatus.cs
    • Added a new file for the v1 task status model.
  • src/A2A/Models/TaskStatusUpdateEvent.cs
    • Updated fields to align with the v1 specification, including explicit taskId and contextId.
  • src/A2A/Server/A2AServer.cs
    • Added a new server implementation for v1, orchestrating request lifecycle, event sourcing, and agent handling.
  • src/A2A/Server/A2AServerOptions.cs
    • Added a new file for A2AServer configuration options.
  • src/A2A/Server/AgentContext.cs
    • Added a new file for the agent context model.
  • src/A2A/Server/AgentEventQueue.cs
    • Added a new file for the agent event queue.
  • src/A2A/Server/ChannelEventNotifier.cs
    • Added a new file for the channel-based event notifier.
  • src/A2A/Server/ChannelEventSubscriber.cs
    • Added a new file for the channel-based event subscriber.
  • src/A2A/Server/EventEnvelope.cs
    • Added a new file for the event envelope model.
  • src/A2A/Server/IA2ARequestHandler.cs
    • Added a new interface for the A2A request handler.
  • src/A2A/Server/IAgentHandler.cs
    • Added a new interface for the agent handler, defining core agent logic.
  • src/A2A/Server/IEventStore.cs
    • Added a new interface for the append-only event store.
  • src/A2A/Server/ITaskEventStore.cs
    • Added a new interface combining event store and query capabilities for tasks.
  • src/A2A/Server/InMemoryEventStore.cs
    • Added a new in-memory event store implementation with inline projection.
  • src/A2A/Server/TaskProjection.cs
    • Added a new static class for projecting task state from event streams.
  • src/A2A/Server/TaskUpdater.cs
    • Added a new convenience wrapper for common task lifecycle operations.
  • tests/A2A.AspNetCore.UnitTests/A2AEndpointRouteBuilderExtensionsTests.cs
    • Updated tests to reflect new DI-based endpoint mapping and REST API support.
  • tests/A2A.AspNetCore.UnitTests/A2AHttpProcessorTests.cs
    • Updated tests to reflect new v1 API and error handling, including new server setup.
  • tests/A2A.AspNetCore.UnitTests/A2AJsonRpcProcessorTests.cs
    • Updated tests to reflect new v1 API, method names, and version negotiation logic.
  • tests/A2A.AspNetCore.UnitTests/DistributedCacheTaskStoreTests.cs
    • Removed DistributedCacheTaskStore tests.
  • tests/A2A.AspNetCore.UnitTests/ProcessMessageTests.cs
    • Removed ProcessMessageTests.
  • tests/A2A.UnitTests/A2A.UnitTests.csproj
    • Updated target frameworks to net10.0;net8.0.
  • tests/A2A.UnitTests/Client/A2ACardResolverTests.cs
    • Updated tests to reflect the new v1 'AgentCard' structure.
  • tests/A2A.UnitTests/Client/A2AClientTests.cs
    • Updated tests to reflect the new v1 API for client operations.
  • tests/A2A.UnitTests/Client/JsonRpcContentTests.cs
    • Updated tests to reflect the new v1 'TaskStatus' enum values.
  • tests/A2A.UnitTests/GitHubIssues/Issue160.cs
    • Updated test to align with v1 model changes, specifically regarding 'AgentTask' deserialization.
  • tests/A2A.V0_3.UnitTests/Models/A2AEventTests.cs
    • Renamed from 'tests/A2A.UnitTests/Models/A2AEventTests.cs'.
  • tests/A2A.V0_3.UnitTests/Models/A2AResponseTests.cs
    • Renamed from 'tests/A2A.UnitTests/Models/A2AResponseTests.cs'.
  • tests/A2A.V0_3.UnitTests/Models/AgentTransportTests.cs
    • Renamed from 'tests/A2A.UnitTests/Models/AgentTransportTests.cs'.
  • tests/A2A.V0_3.UnitTests/Models/BaseKindDiscriminatorConverterEdgeTests.cs
    • Renamed from 'tests/A2A.UnitTests/Models/BaseKindDiscriminatorConverterEdgeTests.cs'.
  • tests/A2A.V0_3.UnitTests/Models/FileContentSpecComplianceTests.cs
    • Renamed from 'tests/A2A.UnitTests/Models/FileContentSpecComplianceTests.cs'.
  • tests/A2A.V0_3.UnitTests/Models/MessageSendParamsTests.cs
    • Renamed from 'tests/A2A.UnitTests/Models/MessageSendParamsTests.cs'.
  • tests/A2A.V0_3.UnitTests/Server/InMemoryTaskStoreTests.cs
    • Renamed from 'tests/A2A.UnitTests/Server/InMemoryTaskStoreTests.cs'.
  • tests/A2A.V0_3.UnitTests/Server/TaskManagerTests.cs
    • Renamed from 'tests/A2A.UnitTests/Server/TaskManagerTests.cs'.
  • tests/A2A.V0_3.UnitTests/Server/TaskUpdateEventEnumeratorTests.cs
    • Renamed from 'tests/A2A.UnitTests/Server/TaskUpdateEventEnumeratorTests.cs'.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@rokonec rokonec changed the title Rokonec/implement preview version of v1.0 Implement alfa version of v1.0 Feb 25, 2026
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a significant and well-executed refactoring to implement version 1.0 of the A2A protocol SDK. The changes are extensive, including a new DI-based server-side API, an event sourcing pattern for task persistence, a v0.3 compatibility layer, and improved observability through tracing and metrics. The new architecture is a major improvement in terms of design and robustness. The code quality is high, and the inclusion of detailed migration guides is commendable. I've found one minor issue regarding specification compliance that I've commented on.

@darrelmiller darrelmiller changed the title Implement alfa version of v1.0 Implement alpha version of v1.0 Feb 26, 2026
rokonec added 11 commits March 3, 2026 15:36
- replace IEventStore/ITaskEventStore (7 methods) with ITaskStore (4 CRUD methods)
- add atomic per-task locking in ChannelEventNotifier for race-free subscribe
- remove EventEnvelope, ChannelEventSubscriber, and all version/replay infrastructure
- add 10 new tests: pagination, timestamp filter, concurrent access, race conditions
- eliminate Task.Delay in subscribe tests with deterministic TaskCompletionSource

🏗️ - Generated by Copilot
…parameter

- count task creation only when store has no existing task (currentTask is null)
- rename @event to streamEvent in TaskProjection.Apply to avoid keyword escaping

🔧 - Generated by Copilot
…PersistEvents

- rename PersistEventAsync to ApplyEventAsync to reflect read-mutate-save-notify semantics
- remove AutoPersistEvents option (server cannot function without applying events)
- simplify MaterializeResponseAsync and SendStreamingMessageAsync by removing conditional

🔧 - Generated by Copilot
- add Metadata property to CancelTaskRequest (spec proto field 3)
- wire request.Metadata to AgentContext in CancelTaskAsync
- add test verifying metadata passthrough to cancel handler

🔧 - Generated by Copilot
- add historyLength >= 0 validation in A2AServer.GetTaskAsync (covers both JSON-RPC and REST)
- remove duplicate validation from A2AJsonRpcProcessor (server handles it)
- update test to expect InvalidParams error for negative historyLength

🔧 - Generated by Copilot
- clarify that the property indicates streaming response mode, not request streaming
- avoid terminology conflict with v1.1 streaming request support (per review feedback)

🔧 - Generated by Copilot
- align with Python SDK naming (RequestContext)
- avoid overloading 'context' with A2A protocol contextId
- 29 edits across 12 files via symbol rename

🔧 - Generated by Copilot
…creation

- make RequestContext.ContextId nullable (string?) to expose client-provided vs generated
- move GUID generation from ResolveContextAsync to TaskUpdater constructor
- agents can now distinguish null (client didn't provide) from non-null (client or existing task)
- update samples to use updater.ContextId for resolved value

🔧 - Generated by Copilot
…extId

- rename AgentContext to RequestContext in DemoAgent
- use updater.ContextId instead of context.ContextId for null-safety

🔧 - Generated by Copilot
…Id flag

- spec requires agents MUST generate contextId when client doesn't provide one
- restore GUID generation in ResolveContextAsync (was broken for message-only flows)
- make ContextId non-null again (required string) for spec compliance
- add ClientProvidedContextId bool so agents can distinguish client vs SDK-generated
- revert TaskUpdater to accept non-null string contextId

🔧 - Generated by Copilot
- add MessageResponder with ReplyAsync(text) and ReplyAsync(parts) methods
- auto-sets Role.Agent, MessageId, and ContextId on all replies
- fixes spec compliance: agent response messages now always include contextId
- update EchoAgent and FileStoreDemo to use MessageResponder
- add 3 MessageResponder unit tests

🔧 - Generated by Copilot
@rokonec rokonec marked this pull request as ready for review March 4, 2026 23:29
rokonec added 3 commits March 4, 2026 21:54
…extId

- rename AgentContext to RequestContext in DemoAgent
- use updater.ContextId instead of context.ContextId for null-safety

🔧 - Generated by Copilot
…Id flag

- spec requires agents MUST generate contextId when client doesn't provide one
- restore GUID generation in ResolveContextAsync (was broken for message-only flows)
- make ContextId non-null again (required string) for spec compliance
- add ClientProvidedContextId bool so agents can distinguish client vs SDK-generated
- revert TaskUpdater to accept non-null string contextId

🔧 - Generated by Copilot
- add MessageResponder with ReplyAsync(text) and ReplyAsync(parts) methods
- auto-sets Role.Agent, MessageId, and ContextId on all replies
- fixes spec compliance: agent response messages now always include contextId
- update EchoAgent and FileStoreDemo to use MessageResponder
- add 3 MessageResponder unit tests

🔧 - Generated by Copilot
@rokonec rokonec marked this pull request as ready for review March 4, 2026 23:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants