fix: reject SendMessage to tasks in terminal state with UnsupportedOperationError#746
Conversation
…erationError Per A2A spec section 3.1.1 (CORE-SEND-002), the SDK MUST return an UnsupportedOperationError when a client attempts to send a message to a task that is already in a terminal state (completed, canceled, rejected, or failed). The guard is added in DefaultRequestHandler.initMessageSend(), which is called by both onMessageSend (blocking) and onMessageSendStream (streaming). This ensures the check happens before the message is forwarded to the AgentExecutor on all three transports (JSON-RPC, gRPC, HTTP+JSON). This fixes a2aproject#741
Summary of ChangesHello, 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 addresses a critical compliance issue by ensuring that the system correctly rejects attempts to send messages to tasks that have reached a final, non-active state. This change aligns the system's behavior with the A2A specification, improving robustness and predictability by preventing operations on tasks that are no longer capable of processing new messages. Highlights
Changelog
Activity
Using Gemini Code AssistThe 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
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 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
|
There was a problem hiding this comment.
Code Review
This pull request implements a new validation rule in DefaultRequestHandler.java to prevent sending messages to tasks that are in a terminal state (completed, canceled, rejected, or failed), as per A2A spec section 3.1.1 (CORE-SEND-002). The initMessageSend method now throws an UnsupportedOperationError in such cases, and its signature has been updated to declare throws A2AError. Comprehensive unit tests have been added and modified in DefaultRequestHandlerTest.java to verify this behavior for all terminal states and for both standard and streaming message sending operations, ensuring the correct error is thrown.
Summary
SendMessage to a task in a terminal state (completed, canceled, rejected, failed) succeeds instead of returning
UnsupportedOperationError. Fails on all three transports (JSON-RPC, gRPC, HTTP+JSON).Requirement
Changes
Added a guard in
DefaultRequestHandler.initMessageSend(), which is invoked by bothonMessageSend(blocking) andonMessageSendStream(streaming). The guard checks whether the referenced task is in a final state before forwarding the message toAgentExecutor:Tests
Added 5 new tests in
DefaultRequestHandlerTest:testSendMessage_ToCompletedTask_ThrowsUnsupportedOperationErrortestSendMessage_ToCanceledTask_ThrowsUnsupportedOperationErrortestSendMessage_ToRejectedTask_ThrowsUnsupportedOperationErrortestSendMessage_ToFailedTask_ThrowsUnsupportedOperationErrortestSendMessageStream_ToCompletedTask_ThrowsUnsupportedOperationError(streaming path)All 11 tests in
DefaultRequestHandlerTestpass.This fixes #741