UAT: A2aLocalFacade missing standard A2A operations message/send and message/stream — agent conversation routing is unimplemented #3537

Closed
opened 2026-04-05 19:04:07 +00:00 by freemo · 2 comments
Owner

Metadata

  • Branch: fix/v3.6.0/a2a-facade-message-send-stream
  • Commit Message: fix(a2a): implement message/send and message/stream handlers in A2aLocalFacade
  • Milestone: v3.6.0
  • Parent Epic: #933

Summary

The A2aLocalFacade in src/cleveragents/a2a/facade.py does not implement the two standard A2A operations that are the foundation of all agent-user interaction: message/send and message/stream. The spec states these are the primary operations for sending messages to the orchestrator actor and receiving streaming responses.

The facade must handle message/send and message/stream by routing to SessionWorkflow.tell(). These operations use a Task-centric model: each call creates or updates a Task that transitions through states: submittedworkingcompleted (or failed, canceled, input-required).

Actual Behavior

A2aLocalFacade._EXTENSION_OPERATIONS and _LEGACY_OPERATIONS contain no entries for message/send or message/stream. The _handlers() method has no mapping for these operations. Dispatching either operation raises A2aOperationNotFoundError.

# src/cleveragents/a2a/facade.py — _EXTENSION_OPERATIONS list
# No message/send or message/stream entries
_EXTENSION_OPERATIONS: list[str] = [
    "_cleveragents/plan/use",
    "_cleveragents/plan/execute",
    # ... only _cleveragents/* methods
]

The agents session tell command also bypasses A2A entirely — it calls service.append_message() directly and generates a hardcoded stub response ("Acknowledged: {prompt[:100]}") without routing through A2aLocalFacade or invoking any actor.

Steps to Reproduce

  1. Instantiate A2aLocalFacade and dispatch a message/send request:
    from cleveragents.a2a.facade import A2aLocalFacade
    from cleveragents.a2a.models import A2aRequest
    facade = A2aLocalFacade()
    req = A2aRequest(method="message/send", params={"message": {"role": "user", "parts": [{"kind": "text", "text": "Hello"}]}})
    facade.dispatch(req)  # Raises A2aOperationNotFoundError
    
  2. Observe: A2aOperationNotFoundError: Unknown A2A method: message/send

Code Location

  • src/cleveragents/a2a/facade.py_EXTENSION_OPERATIONS, _LEGACY_OPERATIONS, _handlers() — missing message/send and message/stream handlers
  • src/cleveragents/cli/commands/session.pytell() command bypasses A2A facade entirely

Spec References

  • spec §A2A Standard Operations: message/send maps to SessionWorkflow.tell(), message/stream maps to SessionWorkflow.tell() with streaming
  • spec §Transport Modes: "In local mode, Standard A2A operations (message/send, message/stream) drive the conversation"
  • spec §Server Presentation Layer: "Standard A2A operations (message/send, message/stream): Routed to SessionWorkflow and actor execution"

Subtasks

  • Add message/send to _EXTENSION_OPERATIONS (or a new _STANDARD_OPERATIONS list) in A2aLocalFacade
  • Add message/stream to _EXTENSION_OPERATIONS (or _STANDARD_OPERATIONS) in A2aLocalFacade
  • Implement _handle_message_send() handler routing to SessionWorkflow.tell()
  • Implement _handle_message_stream() handler routing to SessionWorkflow.tell() with streaming, yielding TaskStatusUpdateEvent / TaskArtifactUpdateEvent
  • Wire agents session tell CLI command through A2aLocalFacade.dispatch() instead of calling service.append_message() directly
  • Remove hardcoded stub response ("Acknowledged: {prompt[:100]}") from session.py
  • Add Behave scenarios for message/send dispatch and Task state transitions (submittedworkingcompleted)
  • Add Behave scenarios for message/stream dispatch and SSE event emission
  • Run nox (all default sessions), fix any errors
  • Verify coverage > 97% via nox -s coverage_report

Definition of Done

  • A2aLocalFacade.dispatch("message/send", ...) routes to SessionWorkflow.tell() and returns a valid Task response
  • A2aLocalFacade.dispatch("message/stream", ...) routes to SessionWorkflow.tell() with streaming and yields TaskStatusUpdateEvent / TaskArtifactUpdateEvent
  • agents session tell CLI command routes through A2aLocalFacade (no direct service.append_message() bypass)
  • No hardcoded stub responses remain in session.py
  • All Behave scenarios for message/send and message/stream pass
  • All nox stages pass
  • Coverage > 97%

Automated by CleverAgents Bot
Supervisor: UAT Testing | Agent: ca-new-issue-creator

## Metadata - **Branch**: `fix/v3.6.0/a2a-facade-message-send-stream` - **Commit Message**: `fix(a2a): implement message/send and message/stream handlers in A2aLocalFacade` - **Milestone**: v3.6.0 - **Parent Epic**: #933 ## Summary The `A2aLocalFacade` in `src/cleveragents/a2a/facade.py` does not implement the two standard A2A operations that are the foundation of all agent-user interaction: `message/send` and `message/stream`. The spec states these are the primary operations for sending messages to the orchestrator actor and receiving streaming responses. The facade must handle `message/send` and `message/stream` by routing to `SessionWorkflow.tell()`. These operations use a **Task-centric model**: each call creates or updates a Task that transitions through states: `submitted` → `working` → `completed` (or `failed`, `canceled`, `input-required`). ## Actual Behavior `A2aLocalFacade._EXTENSION_OPERATIONS` and `_LEGACY_OPERATIONS` contain no entries for `message/send` or `message/stream`. The `_handlers()` method has no mapping for these operations. Dispatching either operation raises `A2aOperationNotFoundError`. ```python # src/cleveragents/a2a/facade.py — _EXTENSION_OPERATIONS list # No message/send or message/stream entries _EXTENSION_OPERATIONS: list[str] = [ "_cleveragents/plan/use", "_cleveragents/plan/execute", # ... only _cleveragents/* methods ] ``` The `agents session tell` command also bypasses A2A entirely — it calls `service.append_message()` directly and generates a hardcoded stub response (`"Acknowledged: {prompt[:100]}"`) without routing through `A2aLocalFacade` or invoking any actor. ## Steps to Reproduce 1. Instantiate `A2aLocalFacade` and dispatch a `message/send` request: ```python from cleveragents.a2a.facade import A2aLocalFacade from cleveragents.a2a.models import A2aRequest facade = A2aLocalFacade() req = A2aRequest(method="message/send", params={"message": {"role": "user", "parts": [{"kind": "text", "text": "Hello"}]}}) facade.dispatch(req) # Raises A2aOperationNotFoundError ``` 2. Observe: `A2aOperationNotFoundError: Unknown A2A method: message/send` ## Code Location - `src/cleveragents/a2a/facade.py` — `_EXTENSION_OPERATIONS`, `_LEGACY_OPERATIONS`, `_handlers()` — missing `message/send` and `message/stream` handlers - `src/cleveragents/cli/commands/session.py` — `tell()` command bypasses A2A facade entirely ## Spec References - spec §A2A Standard Operations: `message/send` maps to `SessionWorkflow.tell()`, `message/stream` maps to `SessionWorkflow.tell()` with streaming - spec §Transport Modes: *"In local mode, Standard A2A operations (`message/send`, `message/stream`) drive the conversation"* - spec §Server Presentation Layer: *"Standard A2A operations (`message/send`, `message/stream`): Routed to `SessionWorkflow` and actor execution"* ## Subtasks - [ ] Add `message/send` to `_EXTENSION_OPERATIONS` (or a new `_STANDARD_OPERATIONS` list) in `A2aLocalFacade` - [ ] Add `message/stream` to `_EXTENSION_OPERATIONS` (or `_STANDARD_OPERATIONS`) in `A2aLocalFacade` - [ ] Implement `_handle_message_send()` handler routing to `SessionWorkflow.tell()` - [ ] Implement `_handle_message_stream()` handler routing to `SessionWorkflow.tell()` with streaming, yielding `TaskStatusUpdateEvent` / `TaskArtifactUpdateEvent` - [ ] Wire `agents session tell` CLI command through `A2aLocalFacade.dispatch()` instead of calling `service.append_message()` directly - [ ] Remove hardcoded stub response (`"Acknowledged: {prompt[:100]}"`) from `session.py` - [ ] Add Behave scenarios for `message/send` dispatch and Task state transitions (`submitted` → `working` → `completed`) - [ ] Add Behave scenarios for `message/stream` dispatch and SSE event emission - [ ] Run `nox` (all default sessions), fix any errors - [ ] Verify coverage > 97% via `nox -s coverage_report` ## Definition of Done - [ ] `A2aLocalFacade.dispatch("message/send", ...)` routes to `SessionWorkflow.tell()` and returns a valid Task response - [ ] `A2aLocalFacade.dispatch("message/stream", ...)` routes to `SessionWorkflow.tell()` with streaming and yields `TaskStatusUpdateEvent` / `TaskArtifactUpdateEvent` - [ ] `agents session tell` CLI command routes through `A2aLocalFacade` (no direct `service.append_message()` bypass) - [ ] No hardcoded stub responses remain in `session.py` - [ ] All Behave scenarios for `message/send` and `message/stream` pass - [ ] All nox stages pass - [ ] Coverage > 97% --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: ca-new-issue-creator
freemo added this to the v3.6.0 milestone 2026-04-05 19:04:12 +00:00
Author
Owner

Issue triaged by project owner:

  • State: Verified
  • Priority: Critical — message/send and message/stream are the two foundational A2A operations that drive all agent-user interaction. Without them, no conversation can occur through the A2A protocol.
  • Milestone: v3.6.0 (already set, correct — A2A standardization is in M7 scope)
  • Story Points: 8 — XL — Requires implementing two core A2A operation handlers with Task state machine transitions, streaming SSE support for message/stream, rewiring the CLI session tell command through the facade, removing hardcoded stubs, plus comprehensive Behave scenarios for both operations. High complexity due to streaming and state management.
  • MoSCoW: Must Have — The spec §A2A Standard Operations explicitly defines these as the primary operations. They are the foundation of all agent communication in both local and server modes. Without them, the A2A protocol layer is non-functional.
  • Parent Epic: #933 (A2A Protocol Compliance)

Automated by CleverAgents Bot
Supervisor: Project Owner | Agent: ca-project-owner

Issue triaged by project owner: - **State**: Verified - **Priority**: Critical — `message/send` and `message/stream` are the two foundational A2A operations that drive all agent-user interaction. Without them, no conversation can occur through the A2A protocol. - **Milestone**: v3.6.0 (already set, correct — A2A standardization is in M7 scope) - **Story Points**: 8 — XL — Requires implementing two core A2A operation handlers with Task state machine transitions, streaming SSE support for `message/stream`, rewiring the CLI `session tell` command through the facade, removing hardcoded stubs, plus comprehensive Behave scenarios for both operations. High complexity due to streaming and state management. - **MoSCoW**: Must Have — The spec §A2A Standard Operations explicitly defines these as the primary operations. They are the foundation of all agent communication in both local and server modes. Without them, the A2A protocol layer is non-functional. - **Parent Epic**: #933 (A2A Protocol Compliance) --- **Automated by CleverAgents Bot** Supervisor: Project Owner | Agent: ca-project-owner
Author
Owner

Closing as duplicate of #2569.

Both issues describe the same bug: A2aLocalFacade is missing standard A2A operations message/send and message/stream. Issue #2569 is the established tracking issue with State/Verified and Priority/High labels.

Note: If this work needs to be prioritized for v3.6.0 rather than v3.8.0, please update the milestone on #2569 accordingly.


Automated by CleverAgents Bot
Supervisor: Backlog Grooming | Agent: ca-backlog-groomer

Closing as duplicate of #2569. Both issues describe the same bug: `A2aLocalFacade` is missing standard A2A operations `message/send` and `message/stream`. Issue #2569 is the established tracking issue with `State/Verified` and `Priority/High` labels. Note: If this work needs to be prioritized for v3.6.0 rather than v3.8.0, please update the milestone on #2569 accordingly. --- **Automated by CleverAgents Bot** Supervisor: Backlog Grooming | Agent: ca-backlog-groomer
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
cleveragents/cleveragents-core#3537
No description provided.