Skip to content

feat: add JSON-RPC client transport implementation - #79

Merged
yarolegovich merged 13 commits into
a2aproject:mainfrom
joshuafuller:feature/jsonrpc-client-transport
Oct 28, 2025
Merged

feat: add JSON-RPC client transport implementation#79
yarolegovich merged 13 commits into
a2aproject:mainfrom
joshuafuller:feature/jsonrpc-client-transport

Conversation

@joshuafuller

Copy link
Copy Markdown
Contributor

Overview

Adds JSON-RPC 2.0 client transport support to the Go SDK. Implementation follows the structure and code style discussed in #73.

Implementation

  • All 10 required A2A JSON-RPC methods (message/send, message/stream, tasks/*, etc.)
  • SSE streaming for real-time updates
  • Thread-safe agent card caching
  • 5-second default timeout (matches Python SDK)
  • No external dependencies beyond stdlib
  • Located in a2aclient/jsonrpc.go following the grpcTransport pattern

Testing & Validation

Following the guidance in #73, I validated the implementation against the Python SDK reference implementation to ensure behavioral consistency:

  • Compared method signatures and behavior with the a2a-python transport
  • Verified JSON-RPC request/response structures match spec
  • Confirmed proper SSE parsing and error handling

Test suite includes 58.6% coverage with race detection:

$ go test -race ./a2aclient -run TestJSONRPC
PASS
ok      github.com/a2aproject/a2a-go/a2aclient  1.163s

All tests validate spec compliance including required field validation (Task: id/contextId/status.state, Message: id/role/parts).

Files

  • a2aclient/jsonrpc.go (558 lines) - Transport implementation
  • a2aclient/jsonrpc_test.go (755 lines) - Test suite

Fixes #73

Implements JSON-RPC 2.0 client transport for A2A protocol communication
per specification §7. Provides complete support for all 10 required
methods with SSE streaming capabilities.

Key features:
- Full A2A JSONRPC 2.0 specification compliance (§6.11, §7)
- All 10 required methods: message/send, message/stream, tasks/get,
  tasks/cancel, tasks/resubscribe, and push notification config methods
- SSE streaming support for real-time task updates
- Thread-safe agent card management with RWMutex
- 5-second default timeout matching Python SDK behavior
- Comprehensive test suite with race detection

Implementation details:
- Validates all required fields per A2A spec (Task: id/contextId/status.state,
  Message: id/role/parts) to ensure strict spec compliance
- Proper resource cleanup with context cancellation monitoring
- Behavioral parity with Python SDK reference implementation
- 58.6% test coverage including concurrent access scenarios

Fixes #73
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @joshuafuller, 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 new JSON-RPC 2.0 client transport implementation for the Go SDK, designed to facilitate communication with A2A agents over HTTP. It provides comprehensive support for all required A2A JSON-RPC methods, including both standard and Server-Sent Events (SSE) streaming for real-time updates. The implementation emphasizes robustness with features like thread-safe agent card caching, a default 5-second HTTP timeout, and a minimal dependency footprint by relying only on the Go standard library. It has been thoroughly validated against the Python SDK reference implementation to ensure behavioral consistency and includes a robust test suite.

Highlights

  • JSON-RPC 2.0 Client Transport: Introduces full JSON-RPC 2.0 client transport support for the Go SDK, enabling communication with A2A agents over HTTP.
  • Comprehensive Method Support: Implements all ten required A2A JSON-RPC methods, covering message sending, streaming, and various task management operations.
  • Server-Sent Events (SSE): Integrates SSE for streaming JSON-RPC responses, facilitating real-time updates and event delivery.
  • Thread-Safe Agent Card Caching: Includes thread-safe caching for agent cards, optimizing performance and ensuring data consistency in concurrent environments.
  • Default Timeout Configuration: Sets a default 5-second HTTP client timeout, aligning with the behavior of the Python SDK.
  • Minimal Dependencies: The implementation relies solely on the Go standard library, avoiding external dependencies for a lightweight solution.
  • Code Structure and Location: The new transport is located in "a2aclient/jsonrpc.go", following the established "grpcTransport" pattern for consistency.
  • Behavioral Consistency Validation: The implementation has been validated against the Python SDK reference to ensure consistent behavior and adherence to the A2A specification.
  • Test Coverage and Quality: A comprehensive test suite provides 58.6% code coverage with race detection, ensuring robustness and spec compliance.
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.

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

Copy link
Copy Markdown
Contributor

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 comprehensive implementation of a JSON-RPC 2.0 client transport for the A2A Go SDK, including support for all required methods, SSE streaming, and thread-safe caching. The implementation is well-structured and is accompanied by a thorough test suite. My review focuses on improving concurrency patterns, simplifying complex logic, and enhancing maintainability by removing hardcoded values. I've also identified a potential issue in a concurrent test case that could mask a race condition.

Comment thread a2aclient/jsonrpc_test.go Outdated
Comment thread a2aclient/jsonrpc.go
Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go
- Fix concurrent test to verify exactly 1 network call
- Extract hardcoded strings to constants for maintainability
- Remove unnecessary goroutine for context cancellation
- Simplify agent card locking with standard double-checked pattern

All tests pass with race detection.
@joshuafuller

joshuafuller commented Oct 21, 2025

Copy link
Copy Markdown
Contributor Author

Thanks for the review feedback! I've addressed all the points in commit fb75ea1:

High Priority:

  • Fixed concurrent test to verify exactly 1 network call (changed from lenient > 3 check)

Medium Priority:

  • Extracted all hardcoded strings to constants (JSON-RPC methods, headers, protocol version)
  • Removed unnecessary context cancellation goroutines (HTTP client handles this)
  • Simplified agent card locking to clean double-checked pattern

All tests pass with race detection. Net result: cleaner, more maintainable code (-18 lines).

@joshuafuller

Copy link
Copy Markdown
Contributor Author

/gemini review

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

Copy link
Copy Markdown
Contributor

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 solid implementation of a JSON-RPC 2.0 client transport for the Go SDK. The code is well-structured, follows Go best practices like using functional options, and includes a comprehensive test suite, notably with a good concurrency test for GetAgentCard. My review focuses on a few areas to enhance robustness and maintainability: ensuring clear resource ownership by removing redundant defer calls, improving error handling by wrapping errors with more context for better debugging, and promoting consistent error checking within the test suite.

Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc_test.go Outdated

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

Copy link
Copy Markdown
Contributor

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 well-structured and comprehensive implementation of a JSON-RPC 2.0 client transport for the A2A Go SDK. The code is clean, follows Go best practices, and includes an extensive test suite that covers core functionality, streaming, error handling, and concurrency. The use of functional options for configuration is a nice touch. I've identified a couple of minor issues related to resource management and error handling that could be improved for better robustness and debuggability. Overall, this is a high-quality contribution.

Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go Outdated
- Remove redundant defer body.Close() calls (parseSSEStream owns closure)
- Add error context to unmarshalEvent for clearer failure messages
- Add explicit error checking to test JSON decode calls

All tests pass with race detection.
@joshuafuller

Copy link
Copy Markdown
Contributor Author

Addressed the second round of feedback in commit acdd074:

Resource Ownership:

  • Removed redundant defer body.Close() calls in streaming methods - parseSSEStream owns and closes the body

Error Context:

  • Added contextual error wrapping in unmarshalEvent to indicate which event type failed parsing (Task, Message, TaskStatusUpdateEvent, TaskArtifactUpdateEvent)

Test Error Handling:

  • Added explicit error checking to all JSON decode calls in tests (6 locations)

All tests continue to pass with race detection.

@joshuafuller

Copy link
Copy Markdown
Contributor Author

/gemini review

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

Copy link
Copy Markdown
Contributor

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 adds a comprehensive implementation of a JSON-RPC 2.0 client transport for the A2A Go SDK. The code is well-structured, follows Go idioms, and includes a good set of tests covering various scenarios, including concurrency. The implementation correctly handles non-streaming and streaming (SSE) requests, resource management (like closing HTTP bodies), and thread-safe caching of the agent card. My review includes suggestions to improve efficiency, reduce code duplication, and fix a potential data race condition to further enhance the robustness of this new transport.

Comment thread a2aclient/jsonrpc.go
Comment thread a2aclient/jsonrpc.go
Comment thread a2aclient/jsonrpc.go Outdated
- Fix GetAgentCard to return copies to prevent data races
- Refactor SendMessage to use unmarshalEvent (avoid double unmarshaling)
- Extract streamRequestToEvents helper to reduce code duplication

All tests pass with race detection.
@joshuafuller

Copy link
Copy Markdown
Contributor Author

Addressed the third round of feedback in commit fdbe4ae:

High Priority:

  • Fixed GetAgentCard to return copies of the cached card to prevent data races from concurrent modifications

Medium Priority:

  • Refactored SendMessage to use unmarshalEvent helper (eliminates double unmarshaling for better efficiency)
  • Extracted streamRequestToEvents helper method to eliminate code duplication between SendStreamingMessage and ResubscribeToTask

All tests pass with race detection. Net result: cleaner code with better efficiency (+31, -48 lines).

@joshuafuller

Copy link
Copy Markdown
Contributor Author

/gemini review

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

Copy link
Copy Markdown
Contributor

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 comprehensive implementation of a JSON-RPC 2.0 client transport for the A2A Go SDK. The implementation is well-structured, following the existing grpcTransport pattern, and includes support for all required A2A methods, SSE streaming, and thread-safe agent card caching. The accompanying test suite is thorough, covering various scenarios including success cases, error handling, streaming, and concurrency, which provides good confidence in the new transport's correctness.

My review focuses on improving debuggability and performance. I've suggested enhancing error messages with response bodies for failed HTTP requests and optimizing the SSE parsing loop to reduce memory allocations. Overall, this is a solid contribution that significantly enhances the SDK's capabilities.

Comment thread a2aclient/jsonrpc.go
Comment on lines +181 to +183
if httpResp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("unexpected HTTP status code: %d", httpResp.StatusCode)
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

When a non-200 HTTP status is received, the response body often contains useful error details. Including this body in the error message will significantly improve debuggability.

Suggested change
if httpResp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("unexpected HTTP status code: %d", httpResp.StatusCode)
}
if httpResp.StatusCode != http.StatusOK {
bodyBytes, _ := io.ReadAll(httpResp.Body)
return nil, fmt.Errorf("unexpected HTTP status code: %d, body: %s", httpResp.StatusCode, string(bodyBytes))
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

we don't expect anything in the body, but I'd rather log status text than code:

--- a/a2aclient/jsonrpc.go
+++ b/a2aclient/jsonrpc.go
@@ -179,7 +179,7 @@ func (t *jsonrpcTransport) sendRequest(ctx context.Context, method string, param
        defer func() { _ = httpResp.Body.Close() }()

        if httpResp.StatusCode != http.StatusOK {
-               return nil, fmt.Errorf("unexpected HTTP status code: %d", httpResp.StatusCode)
+               return nil, fmt.Errorf("unexpected HTTP status code: %s", httpResp.Status)
        }

Comment thread a2aclient/jsonrpc.go
Comment on lines +224 to +227
if httpResp.StatusCode != http.StatusOK {
httpResp.Body.Close()
return nil, fmt.Errorf("unexpected HTTP status code: %d", httpResp.StatusCode)
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

When a non-200 HTTP status is received, the response body often contains useful error details. Including this body in the error message will significantly improve debuggability. Note that the body is already being closed here in case of an error, so reading it first is safe.

Suggested change
if httpResp.StatusCode != http.StatusOK {
httpResp.Body.Close()
return nil, fmt.Errorf("unexpected HTTP status code: %d", httpResp.StatusCode)
}
if httpResp.StatusCode != http.StatusOK {
bodyBytes, _ := io.ReadAll(httpResp.Body)
httpResp.Body.Close()
return nil, fmt.Errorf("unexpected HTTP status code: %d, body: %s", httpResp.StatusCode, string(bodyBytes))
}

Comment thread a2aclient/jsonrpc.go
@joshuafuller

Copy link
Copy Markdown
Contributor Author

After three rounds of automated review feedback, the implementation has been significantly improved:

  • Extracted constants, simplified locking, fixed race conditions
  • Better error context and consistent error handling
  • Eliminated code duplication and double unmarshaling

All CI checks pass with 58.6% test coverage. The code is ready for maintainer review. Happy to continue iterating if needed, but I believe this is in good shape for the initial JSON-RPC transport contribution.

Thanks for the feedback and guidance!

Explicitly handle error returns from Close(), Write(), and Encode()
calls in cleanup paths and test helpers.
Refactor parseSSEStream to eliminate unnecessary allocations in the
streaming loop by using byte operations instead of string operations:

- Use scanner.Bytes() instead of scanner.Text() to avoid string allocation
- Replace strings.HasPrefix with bytes.HasPrefix for direct byte comparison
- Hoist prefix bytes conversion outside loop to prevent repeated allocations
- Use byte slicing instead of strings.TrimPrefix
- Remove unnecessary byte-to-string conversions

This optimization reduces GC pressure and improves throughput in
high-volume streaming scenarios by eliminating intermediate allocations
on each SSE event.
Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go Outdated
Comment thread a2aclient/jsonrpc.go Outdated
Address code review comments from yarolegovich:

1. Replace interface{} with any throughout the codebase
   - Updated function parameters and type assertions to use 'any'
   - Removed unused sync import

2. Refactor parseSSEStream resource ownership
   - Changed signature from io.ReadCloser to io.Reader
   - Moved defer body.Close() to caller for cleaner resource management

3. Implement kind-based event discrimination
   - Added MarshalJSON methods to Message, Task, TaskStatusUpdateEvent,
     and TaskArtifactUpdateEvent to inject 'kind' field per A2A spec
   - Created UnmarshalEventJSON() function in a2a package for centralized
     event unmarshaling using 'kind' discriminator
   - Removed transport-specific unmarshalEvent() function that used
     fragile field introspection
   - Added comprehensive test coverage for new Event JSON functionality

4. Remove agent card caching from transport layer
   - Simplified GetAgentCard to return provided card without caching
   - Removed mutex and extended card fetching logic
   - Updated tests to reflect simplified behavior

All changes follow existing patterns in the codebase (ContentParts
unmarshaling, TextPart marshaling) and align with A2A specification.

Test coverage: All existing tests pass with race detection enabled.
Added 4 new test functions covering Event JSON marshaling/unmarshaling.
@joshuafuller

Copy link
Copy Markdown
Contributor Author

Thanks for the detailed review! I've addressed all four comments in 1061a48:

  1. Replaced interface{} with any throughout
  2. Refactored parseSSEStream to accept io.Reader with caller-managed closing
  3. Implemented kind-based event discrimination following the existing ContentParts and TextPart patterns - added
    MarshalJSON methods to all Event types and created UnmarshalEventJSON() in the a2a package
  4. Removed agent card caching from the transport layer

All tests pass with race detection enabled. I also added comprehensive test coverage for the new Event JSON
functionality.

Comment thread a2aclient/jsonrpc_test.go Outdated
Comment thread a2a/event_json_test.go Outdated
Comment thread a2a/event_json_test.go Outdated
Comment thread a2aclient/jsonrpc.go
Comment thread a2aclient/jsonrpc_test.go Outdated
Comment thread a2aclient/jsonrpc_test.go
Comment thread a2aclient/jsonrpc.go
@yarolegovich

Copy link
Copy Markdown
Member

nice work, I've checked that SSE is working with a Python sample:
image

can you please mark comments you've addressed (including those from gemini) as resolved so that it's easier to navigate the PR

Addresses PR #79 review feedback from yarolegovich:

"got before want" test pattern:
- Update all test error messages to follow Go best practices
- a2aclient/jsonrpc_test.go: 48 messages updated
- a2a/event_json_test.go: all messages updated
- Example: "Expected POST, got %s" → "got %s, want POST"
- Reference: https://go.dev/wiki/TestComments#got-before-want

Simplify checkJSON with wantSubstrings:
- Replace checkJSON functions with declarative wantSubstrings field
- Reduced code by ~40 lines while maintaining coverage

Use strings.Contains from stdlib:
- Remove custom contains() and containsAt() helper functions
- Use stdlib strings.Contains() throughout

Add TODO comments for error logging:
- Add TODO(yarolegovich) for all swallowed errors (3 locations)
- Track future logging implementation once approach is decided
Addresses PR #79 review feedback from yarolegovich to include
JSON-RPC transport in default options.

Changes:
- Add WithJSONRPCTransport() to defaultOptions
- Order transports to match other A2A SDKs: JSON-RPC first, then gRPC

Cross-SDK research shows consistent defaults:
- Python SDK: JSON-RPC is primary/fallback transport
- Java SDK: JSON-RPC included by default in client artifact
- JavaScript SDK: jsonrpc_transport_handler.ts as main transport
- Go SDK: Now matches with JSON-RPC first, gRPC second

This ensures consistent behavior across all A2A client implementations.

References:
- https://github.com/a2aproject/a2a-python/blob/main/src/a2a/client/client_factory.py
- https://github.com/a2aproject/a2a-java
- https://github.com/a2aproject/a2a-js
Addresses PR #79 review feedback from yarolegovich:

Remove obsolete concurrent test:
- Removed TestJSONRPCTransport_GetAgentCard_Concurrent
- Test is no longer needed since agent card caching was removed in 1061a48
- Concurrency concerns are now trivial without cache/locking

Add TODO for error conversion:
- Add TODO(yarolegovich) for transport-agnostic error format
- Need to support errors.Is(err, a2a.ErrMethodNotFound)
- Applies to all transports (not yet in grpc either)
- Reviewer will open ticket to track this work
@yarolegovich

Copy link
Copy Markdown
Member

lgtm, @mazas-google, @hyangah can you have a look please?

@yarolegovich
yarolegovich requested a review from lkawka October 24, 2025 09:41
@yarolegovich

Copy link
Copy Markdown
Member

got a green light to proceed with merge from @herczyn

@yarolegovich
yarolegovich merged commit 1690088 into a2aproject:main Oct 28, 2025
4 checks passed
pull Bot pushed a commit to joshuafuller/a2a-go that referenced this pull request Nov 4, 2025
🤖 I have created a release *beep* *boop*
---


## 0.3.0 (2025-11-04)


### Features

* add JSON-RPC client transport implementation
([#79](a2aproject#79))
([1690088](a2aproject@1690088))
* agent card resolver
([#48](a2aproject#48))
([0951293](a2aproject@0951293))
* blocking flag handling
([#97](a2aproject#97))
([f7aa465](a2aproject@f7aa465)),
closes [#96](a2aproject#96)
* client API proposal
([#32](a2aproject#32))
([b6ca54f](a2aproject@b6ca54f))
* client auth interceptor
([#90](a2aproject#90))
([25b9aae](a2aproject@25b9aae))
* client interceptor invocations
([#51](a2aproject#51))
([3e9f2ae](a2aproject@3e9f2ae))
* core types JSON codec
([#42](a2aproject#42))
([c5b3982](a2aproject@c5b3982))
* define core types and interfaces
([#16](a2aproject#16))
([69b96ea](a2aproject@69b96ea))
* disallow custom types and circular refs in Metadata
([#43](a2aproject#43))
([53bc928](a2aproject@53bc928))
* get task implementation
([#59](a2aproject#59))
([f74d854](a2aproject@f74d854))
* grpc authenticated agent card and producer utils
([#85](a2aproject#85))
([9d82f31](a2aproject@9d82f31)),
closes [#82](a2aproject#82)
* grpc client transport
([#66](a2aproject#66))
([fee703e](a2aproject@fee703e))
* grpc code generation from A2A .proto spec
([#11](a2aproject#11))
([2993b98](a2aproject@2993b98))
* handling artifacts and implementing send message stream
([#52](a2aproject#52))
([c3fa631](a2aproject@c3fa631))
* implement an a2aclient.Factory
([#50](a2aproject#50))
([49deee7](a2aproject@49deee7))
* implementing grpc server wrapper
([#37](a2aproject#37))
([071e952](a2aproject@071e952))
* implementing message-message interaction
([#34](a2aproject#34))
([b568979](a2aproject@b568979))
* implementing task pushes
([#86](a2aproject#86))
([c210240](a2aproject@c210240))
* input-required and auth-required handling
([#70](a2aproject#70))
([3ac89ba](a2aproject@3ac89ba))
* jsonrpc server ([#91](a2aproject#91))
([5491030](a2aproject@5491030))
* logger ([#56](a2aproject#56))
([86ab9d2](a2aproject@86ab9d2))
* request context loading
([#60](a2aproject#60))
([ab7a29b](a2aproject@ab7a29b))
* result aggregation part 1 - task store
([#38](a2aproject#38))
([d3c02f5](a2aproject@d3c02f5))
* result aggregation part 3 - concurrent task executor
([#40](a2aproject#40))
([265c3e7](a2aproject@265c3e7))
* result aggregation part 4 - integration
([#41](a2aproject#41))
([bab72d9](a2aproject@bab72d9))
* SDK type utilities
([#31](a2aproject#31))
([32b77b4](a2aproject@32b77b4))
* server middleware API
([#63](a2aproject#63))
([738bf85](a2aproject@738bf85))
* server middleware integration
([#64](a2aproject#64))
([5dc8be0](a2aproject@5dc8be0))
* smarter a2aclient
([#88](a2aproject#88))
([322d05b](a2aproject@322d05b))
* task event factory
([#95](a2aproject#95))
([fbf3bcf](a2aproject@fbf3bcf)),
closes [#84](a2aproject#84)
* task executor docs
([#36](a2aproject#36))
([b6868df](a2aproject@b6868df))
* task update logic
([0ac987f](a2aproject@0ac987f))


### Bug Fixes

* Execute() callers missing events
([#74](a2aproject#74))
([4c3389f](a2aproject@4c3389f))
* mark task failed when execution fails
([#94](a2aproject#94))
([ee0e7ed](a2aproject@ee0e7ed))
* push semantics update
([#93](a2aproject#93))
([76bff9f](a2aproject@76bff9f))
* race detector queue closed access
([c07b7d0](a2aproject@c07b7d0))
* regenerate proto and update converters
([#81](a2aproject#81))
([c732060](a2aproject@c732060))
* streaming ([#92](a2aproject#92))
([ca7a64b](a2aproject@ca7a64b))


### Miscellaneous Chores

* release 0.3.0
([fa7cfba](a2aproject@fa7cfba))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
ivanmkc pushed a commit to ivanmkc/a2a-go that referenced this pull request Nov 11, 2025
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.

[Feature] JSONRPC Client Transport - Planning to Implement & Contribute

2 participants