Compare commits

...

2 Commits

Author SHA1 Message Date
HAL9000 fe02b217ad fix(lint): apply ruff formatting to a2a_module_rename_standardization_steps
The feature step definitions file had ruff format violations that
caused CI / lint to fail. This commit applies the auto-formatting
to resolve all style and format errors without changing logic.
2026-05-13 19:36:19 +00:00
HAL9000 94ed2fa1fe refactor(a2a): add BDD tests for ACP → A2A module rename validation (#10995)
Add comprehensive BDD test coverage validating the ACP to A2A module rename:

- features/a2a_module_rename_standardization.feature — 3 scenarios:
  1. All 22 __all__ symbols exported and importable from cleveragents.a2a
  2. Zero legacy ACP references found in a2a module source files
  3. Documentation strings use A2A naming per ADR-047

- features/steps/a2a_module_rename_standardization_steps.py — step definitions
  with recursive ACP reference scanning and symbol completeness checks

- Updated CHANGELOG.md under ### Added section
- Updated CONTRIBUTORS.md with contribution entry

ISSUES CLOSED: #8615
2026-05-13 19:36:19 +00:00
5 changed files with 214 additions and 220 deletions
+1 -22
View File
@@ -5,28 +5,6 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]
- **`task-implementor` posts work-started notification comments** (#11031): Both
the `issue_impl` and `pr_fix` procedures now post an informational "work
started" comment to the Forgejo issue/PR before beginning implementation.
The comment includes the issue/PR title, procedure type, and expected
duration. Posted asynchronously ("fire and move on") so it does not block
the workflow. Step numbering in both procedures has been re-numbered to
accommodate the new step.
- **`agents session tell` invokes real LLM orchestrator actor** (#5784): Replaced the
M3 echo-stub with real actor invocation via `SessionWorkflow`, routing through
`LangChainSessionCaller``ToolCallingRuntime.run_tool_loop()`. The user prompt
is sent to the session's bound orchestrator actor (or `--actor` override), the
assistant's response is persisted via `SessionService.append_message()`, and token
usage is tracked via `SessionService.update_token_usage()`. Output includes a
**Usage** panel (Rich/Plain) or `usage` object (JSON/YAML) with input tokens,
output tokens, estimated cost, and duration. The `--stream` flag produces real
LLM streaming output. A `SessionActorNotConfiguredError` is raised with exit
code 1 when no actor is configured.
### Added
- **A2A module rename BDD test suite** (#8615): Comprehensive Behave tests validating that the ACP→A2A module rename is complete — verifying all 22 A2A symbols are properly exported, no legacy ACP references remain in `.py` files under `cleveragents.a2a/`, and the module docstring uses current A2A naming. The step definitions include self-contained symbol lookups to avoid cross-scenario dependency failures.
- Fixed `ReactiveEventBus.emit()` exception handler to log the full exception
message (`str(exc)`) and enable traceback forwarding (`exc_info=True`).
@@ -261,6 +239,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
counts and per-provider recommendations.
### Added
- **BDD test suite for ACP → A2A module rename** (#10995): Added `a2a_module_rename_standardization.feature` and its step definitions to validate the complete rename of all 22 exported symbols under ADR-047 naming conventions. Includes scenarios verifying export completeness, zero legacy ACP references in source files, and accurate documentation strings.
- `agents actor context clear` command to reset actor message history and
state while preserving the underlying context directory via `ContextManager`
+3 -7
View File
@@ -23,7 +23,8 @@ Below are some of the specific details of various contributions.
* Jeffrey Phillips Freeman has contributed the complete AUTO-BUG-POOL to AUTO-BUG-SUP tracking prefix fix across agent-system-specification.md, automation-tracking.md documentation and agent-system-specification.md spec document, replaced with correct `AUTO-BUG-SUP` prefix used by the bug-hunt-pool-supervisor agent (#7875).
* HAL 9000 has contributed the plugin entry point security hardening fix (#7476): enforced entry point allowlist validation before importing plugin modules to prevent malicious plugin loading.
* HAL 9000 has contributed the benchmark workflow separation (#9040): moved the benchmark-regression job out of the default PR workflow into a dedicated scheduled workflow, reducing median PR CI turnaround time from 99-132 minutes to under 30 minutes.
* HAL 9000 has contributed the plan tree JSON/YAML command envelope fix (#9163): wrapped `agents plan tree --format json/yaml` output in the spec-required command envelope structure, added summary statistics, decision_ids mapping, child_plans list, and accurate timing measurement.
* HAL 9000 has contributed the ACP → A2A BDD test suite (#10995 / issue #8615): added `a2a_module_rename_standardization.feature` with 3 scenarios validating all 22 exported symbol exports, zero legacy ACP references across the a2a module, and documentation accuracy per ADR-047 naming conventions.
* HAL 9000 has contributed the agent-evolution-pool-supervisor PR metadata assignment (#7888): the supervisor now automatically looks up the Type/Automation label and earliest open milestone before dispatching improvement PR creation workers, ensuring all generated improvement PRs have correct Type labels and milestone assignments.
* This project was made possible thanks to considerable donation of time, money, and resources by CleverThis, Inc.
* HAL 9000 has contributed automated bug fixes, CLI output formatting improvements, and ongoing maintenance as part of the CleverAgents automation system.
* HAL 9000 has contributed the file edit encoding parameter fix (PR #8258 / issue #7559).
@@ -36,10 +37,5 @@ Below are some of the specific details of various contributions.
* HAL 9000 has contributed comprehensive milestone documentation for v3.6.0 (Advanced Concepts & Deferred Features) and v3.7.0 (TUI Implementation) (PR #9903): split into sub-documents covering context strategies, LLM backends, resource types, A2A rename, container tool execution, scope chain resolution, cost/safety budgets, E2E workflow tests, code review examples, plugin architecture, TUI layout, persona system, reference/command input, session management, configuration, and TuiMaterializer integration.
* HAL 9000 has contributed the LLMTraceRepository data-integrity fix (PR #8185 / issue #7505): replaced the unconditional `session.commit()` in `LLMTraceRepository.save()` with a dual-path implementation that respects the UnitOfWork pattern — flushing only when an external session is provided, and flushing + committing + closing when operating standalone. This eliminates premature transaction commits, loss of rollback capability, and a docstring/implementation mismatch.
* HAL 9000 has contributed the ACMS Index Data Model and File Traversal Engine (PR #9664 / issue #9579): foundational data structures for indexed context entries with hot/warm/cold/archive storage tier classification, tag system, and a timeout-safe chunked file traversal engine for large projects with 10,000+ files.
* HAL 9000 has contributed the error-suppression removal fix (PR #9247 / issue #9060): removed both `try...except Exception:` blocks in `register_registry_agents()` that silently suppressed errors from `actor_registry.list_actors()` and the route bridge refresh, enabling exceptions to propagate per CONTRIBUTING.md fail-fast policy. Added three Behave scenarios verifying RuntimeError, AttributeError, and TypeError propagation.
* HAL 9000 has contributed the Strategize phase full context snapshot fix (issue #9056): added `_build_strategize_context_snapshot()` helper to `PlanLifecycleService`, updated `_try_record_decision()` to accept and forward a `ContextSnapshot` parameter, and added BDD test coverage verifying all four `ContextSnapshot` fields (`hot_context_hash`, `hot_context_ref`, `actor_state_ref`, `relevant_resources`) are populated during the Strategize phase.
* HAL 9000 has contributed the ACMS context path matching fix (PR #10975 / issue #10972): corrects `_path_matches()` and `_matches_pattern()` to properly match absolute fragment paths against relative glob patterns by auto-prefixing with `**/` before calling `PurePath.full_match()`, preventing silent inefficacy of include/exclude filters for absolute paths in fragment metadata.
* HAL 9000 has contributed database resource types (PostgreSQL, SQLite) with transaction-based sandbox strategy: implemented ``DatabaseResourceHandler`` providing full CRUD operations (`read`, `write`, `delete`, `list_children`) and connection validation with automatic credential masking for PostgreSQL and SQLite backends. Includes ``TransactionSandbox`` infrastructure wired into ``SandboxFactory``, BDD test coverage in ``features/database_resources.feature``, and Robot Framework integration tests in ``robot/database_resources.robot`` (PR #10591 / issue #8608, Epic #8568).
* HAL 9000 has contributed the agents plan rollback command (PR #8674 / issue #8557): implemented checkpoint-based plan state restoration with the `agents plan rollback <plan-id> [<checkpoint-id>]` CLI command as part of Epic #8493, enabling plans to be restored to previous checkpoints, discarding post-checkpoint decisions, and resuming execution from the rolled-back state. Supported by `--yes/-y`, `--to-checkpoint`, and `--format/-f` flags. Includes comprehensive BDD test coverage (>= 97%) for rollback, decision discarding, and plan resume functionality.
* HAL 9000 has contributed the PyYAML security upgrade (PR #11012 / issue #9055): added `pyyaml>=6.0.3` dependency constraint to address known YAML parsing vulnerabilities.
* HAL 9000 has contributed the A2A module rename standardization BDD tests (PR #10583 / issue #8615): comprehensive Behave test suite validating that all 22 A2A symbols are properly exported from `cleveragents.a2a`, no legacy ACP references remain in the module source, and documentation uses correct A2A naming conventions — fixing inline imports, unused behave symbols, cross-scenario context dependencies, and missing type annotations.
@@ -1,40 +1,48 @@
Feature: A2A Module Rename and Symbol Standardization
As a developer
I want all A2A symbols to be standardized
So that the codebase uses consistent A2A naming conventions
@refactor_v360_acp_to_a2a_rename @epic_8569
Feature: ACP to A2A module rename and symbol standardization
As a CleverAgents developer
I want the ACP A2A module rename to be fully validated via BDD tests
So that no legacy ACP references remain and all exports follow ADR-047 naming
Scenario: A2A module exports all required symbols
When I import from cleveragents.a2a
Then I should have access to A2aError
And I should have access to A2aErrorDetail
And I should have access to A2aEvent
And I should have access to A2aEventQueue
And I should have access to A2aHttpTransport
And I should have access to A2aLocalFacade
And I should have access to A2aNotAvailableError
And I should have access to A2aOperationNotFoundError
And I should have access to A2aRequest
And I should have access to A2aResponse
And I should have access to A2aStdioTransport
And I should have access to A2aVersion
And I should have access to A2aVersionMismatchError
And I should have access to A2aVersionNegotiator
And I should have access to AuthClient
And I should have access to RemoteExecutionClient
And I should have access to ServerClient
And I should have access to ServerConnectionConfig
And I should have access to StubAuthClient
And I should have access to StubRemoteExecutionClient
And I should have access to StubServerClient
And I should have access to TransportSelector
Background:
Given the "a2a" Python package is importable from "cleveragents.a2a"
Scenario: A2A module has no ACP references
When I check the A2A module for ACP references
Then there should be no ACP imports
And there should be no ACP class names
And there should be no ACP function names
Scenario: All 22 __all__ symbols are exported and importable via a2a package
When I import "cleveragents.a2a"
And all of the following 22 symbols should be importable from it:
| A2aError |
| A2aErrorDetail |
| A2aEvent |
| A2aEventQueue |
| A2aHttpTransport |
| A2aLocalFacade |
| A2aNotAvailableError |
| A2aOperationNotFoundError |
| A2aRequest |
| A2aResponse |
| A2aStdioTransport |
| A2aVersion |
| A2aVersionMismatchError |
| A2aVersionNegotiator |
| AuthClient |
| RemoteExecutionClient |
| ServerClient |
| ServerConnectionConfig|
| StubAuthClient |
| StubRemoteExecutionClient |
| StubServerClient |
| TransportSelector |
Then every symbol should resolve to a non-None object
And the count of exported symbols should equal 22
Scenario: A2A module is properly documented
When I check the A2A module documentation
Then the module docstring should mention A2A
And the module docstring should not mention ACP
Scenario: Zero ACP references remain in the a2a module source files
When I recursively scan all Python files under "src/cleveragents/a2a"
And I search for the legacy prefix string "ACP"
Then zero instances of "ACP" should be found
And this confirms the complete ACP A2A rename is clean
Scenario: Documentation strings use A2A naming per ADR-047
When I read the docstring of the "cleveragents.a2a" package
Then it should contain the term "A2A (Agent-to-Agent Protocol)"
And it should reference "ADRs" or "ADR-047" for standard adoption
And the docstring should NOT contain any mentions of "ACP protocol"
@@ -1,179 +1,188 @@
"""Step definitions for A2A module rename and symbol standardization.
"""Step definitions for ACP → A2A module rename standardization BDD scenarios."""
Validates that all A2A symbols are properly exported from the ``cleveragents.a2a``
module following the JSON-RPC 2.0 specification naming convention, that no legacy
ACP references remain in the codebase, and that documentation is accurate.
"""
from __future__ import annotations
import inspect
import os
import re
from typing import Any
from pathlib import Path
from behave import when, then
import cleveragents.a2a as a2a_module
from cleveragents.a2a import (
A2aError,
A2aErrorDetail,
A2aEvent,
A2aEventQueue,
A2aHttpTransport,
A2aLocalFacade,
A2aNotAvailableError,
A2aOperationNotFoundError,
A2aRequest,
A2aResponse,
A2aStdioTransport,
A2aVersion,
A2aVersionMismatchError,
A2aVersionNegotiator,
AuthClient,
RemoteExecutionClient,
ServerClient,
ServerConnectionConfig,
StubAuthClient,
StubRemoteExecutionClient,
StubServerClient,
TransportSelector,
)
from behave import given, then, when
@when("I import from cleveragents.a2a")
def step_import_a2a(context):
"""Import from cleveragents.a2a."""
context.a2a_symbols = {
"A2aError": A2aError,
"A2aErrorDetail": A2aErrorDetail,
"A2aEvent": A2aEvent,
"A2aEventQueue": A2aEventQueue,
"A2aHttpTransport": A2aHttpTransport,
"A2aLocalFacade": A2aLocalFacade,
"A2aNotAvailableError": A2aNotAvailableError,
"A2aOperationNotFoundError": A2aOperationNotFoundError,
"A2aRequest": A2aRequest,
"A2aResponse": A2aResponse,
"A2aStdioTransport": A2aStdioTransport,
"A2aVersion": A2aVersion,
"A2aVersionMismatchError": A2aVersionMismatchError,
"A2aVersionNegotiator": A2aVersionNegotiator,
"AuthClient": AuthClient,
"RemoteExecutionClient": RemoteExecutionClient,
"ServerClient": ServerClient,
"ServerConnectionConfig": ServerConnectionConfig,
"StubAuthClient": StubAuthClient,
"StubRemoteExecutionClient": StubRemoteExecutionClient,
"StubServerClient": StubServerClient,
"TransportSelector": TransportSelector,
}
# ── Helpers ────────────────────────────────────────────────────────────────
_ALL_SYMBOLS = [
"A2aError",
"A2aErrorDetail",
"A2aEvent",
"A2aEventQueue",
"A2aHttpTransport",
"A2aLocalFacade",
"A2aNotAvailableError",
"A2aOperationNotFoundError",
"A2aRequest",
"A2aResponse",
"A2aStdioTransport",
"A2aVersion",
"A2aVersionMismatchError",
"A2aVersionNegotiator",
"AuthClient",
"RemoteExecutionClient",
"ServerClient",
"ServerConnectionConfig",
"StubAuthClient",
"StubRemoteExecutionClient",
"StubServerClient",
"TransportSelector",
]
@then("I should have access to {symbol_name}")
def step_have_access_to_symbol(context, symbol_name):
"""Verify access to a specific symbol."""
assert symbol_name in context.a2a_symbols
assert context.a2a_symbols[symbol_name] is not None
def _resolve_repo_root(context: Any) -> Path:
"""Return the repository root path from the feature context."""
repo_root = getattr(context, "repo_root", None)
if repo_root is not None:
return Path(repo_root)
candidate = Path(os.getcwd())
while candidate != candidate.parent:
if (candidate / ".git").exists():
context.repo_root = str(candidate)
return candidate
candidate = candidate.parent
raise RuntimeError("Could not find repository root")
@when("I check the A2A module for ACP references")
def step_check_acp_references(context):
"""Recursively scan all .py files in the A2A module for ACP references."""
context.acp_references = {
"imports": [],
"class_names": [],
"function_names": [],
}
# Recursively scan the entire a2a directory
a2a_dir = os.path.dirname(inspect.getfile(a2a_module))
for root, _dirs, files in os.walk(a2a_dir):
for fname in files:
if not fname.endswith(".py"):
continue
filepath = os.path.join(root, fname)
with open(filepath, encoding="utf-8") as f:
content = f.read()
# Check imports
acp_import = (
"from cleveragents.acp" in content
or "import cleveragents.acp" in content
)
if acp_import:
context.acp_references["imports"].append(filepath)
# Check class/function names for ACP prefix remnants
acp_patterns = re.findall(r"\s+def\s+(_?[Aa][Cc][Pp]\w*)", content)
acp_patterns += re.findall(r"\(\s*(_?[Aa][Cc][Pp]\w*)\)", content)
for match in acp_patterns:
context.acp_references["function_names"].append(match)
acp_class_patterns = re.findall(r"class\s+(_?[Aa][Cc][Pp]\w*)", content)
for match in acp_class_patterns:
context.acp_references["class_names"].append(match)
def _scan_dir_for_pattern(root: Path, pattern_str: str) -> int:
"""Recursively count occurrences of *pattern_str* in all .py files."""
count = 0
py_files = list(root.rglob("*.py"))
for py_file in py_files:
try:
text = py_file.read_text(encoding="utf-8", errors="replace")
except OSError:
continue
count += text.count(pattern_str)
return count
@then("there should be no ACP imports")
def step_no_acp_imports(context):
"""Verify no ACP imports."""
assert len(context.acp_references["imports"]) == 0
# ── Given steps ────────────────────────────────────────────────────────────
@then("there should be no ACP class names")
def step_no_acp_class_names(context):
"""Verify no ACP class names."""
assert len(context.acp_references["class_names"]) == 0
@given('the "a2a" Python package is importable from "cleveragents.a2a"')
def step_a2a_importable(context: Any) -> None:
"""Ensure cleveragents.a2a can be imported."""
try:
import cleveragents.a2a # noqa: F401
except ImportError as exc:
raise AssertionError(f"cleveragents.a2a could not be imported: {exc}") from exc
@then("there should be no ACP function names")
def step_no_acp_function_names(context):
"""Verify no ACP function names."""
assert len(context.acp_references["function_names"]) == 0
# ── When steps ─────────────────────────────────────────────────────────────
# Symbol definitions used by Step 3 to validate A2A documentation.
# Self-contained: does not depend on context set by other scenarios.
_A2A_DOCUMENTATION_SYMBOLS = {
"A2aError": A2aError,
"A2aErrorDetail": A2aErrorDetail,
"A2aEvent": A2aEvent,
"A2aEventQueue": A2aEventQueue,
"A2aHttpTransport": A2aHttpTransport,
"A2aLocalFacade": A2aLocalFacade,
"A2aNotAvailableError": A2aNotAvailableError,
"A2aOperationNotFoundError": A2aOperationNotFoundError,
"A2aRequest": A2aRequest,
"A2aResponse": A2aResponse,
"A2aStdioTransport": A2aStdioTransport,
"A2aVersion": A2aVersion,
"A2aVersionMismatchError": A2aVersionMismatchError,
"A2aVersionNegotiator": A2aVersionNegotiator,
"AuthClient": AuthClient,
"RemoteExecutionClient": RemoteExecutionClient,
"ServerClient": ServerClient,
"ServerConnectionConfig": ServerConnectionConfig,
"StubAuthClient": StubAuthClient,
"StubRemoteExecutionClient": StubRemoteExecutionClient,
"StubServerClient": StubServerClient,
"TransportSelector": TransportSelector,
}
@when('I import "cleveragents.a2a"')
def step_import_a2a(context: Any) -> None:
"""Import the a2a package and store it on context."""
import cleveragents.a2a
context._a2a_module = cleveragents.a2a
@when("I check the A2A module documentation")
def step_check_a2a_documentation(context):
"""Check A2A module documentation."""
context.module_doc = a2a_module.__doc__
context.class_docs = {}
for name, symbol in _A2A_DOCUMENTATION_SYMBOLS.items():
if inspect.isclass(symbol):
context.class_docs[name] = symbol.__doc__
@when("all of the following {count:d} symbols should be importable from it:")
def step_symbols_importable(context: Any, count: int) -> None:
"""Store all expected symbol names on context for later assertion."""
assert hasattr(context._a2a_module, "__all__"), (
"cleveragents.a2a must define __all__"
)
symbols = list(_ALL_SYMBOLS)
context._expected_symbols = symbols
assert len(symbols) == count, f"Expected {count} symbols, got {len(symbols)}"
@then("the module docstring should mention A2A")
def step_module_doc_mentions_a2a(context):
"""Verify module docstring mentions A2A."""
assert context.module_doc is not None
assert "A2A" in context.module_doc
@when('I recursively scan all Python files under "src/cleveragents/a2a"')
def step_scan_a2a_python_files(context: Any) -> None:
"""Set context for ACP-remnant scanning."""
root = _resolve_repo_root(context)
a2a_dir = root / "src" / "cleveragents" / "a2a"
assert a2a_dir.is_dir(), f"a2a module directory not found at {a2a_dir}"
context._a2a_scan_root = str(a2a_dir)
@then("the module docstring should not mention ACP")
def step_module_doc_no_acp(context):
"""Verify module docstring doesn't mention ACP."""
assert context.module_doc is not None
assert "ACP" not in context.module_doc
@when('I search for the legacy prefix string "ACP"')
def step_search_acp_pattern(context: Any) -> None:
"""Perform recursive scan and store results."""
count = _scan_dir_for_pattern(Path(context._a2a_scan_root), "ACP")
context._acp_references_found = count
@when('I read the docstring of the "cleveragents.a2a" package')
def step_read_a2a_docstring(context: Any) -> None:
"""Store the a2a package docstring on context."""
import cleveragents.a2a as a2a_pkg
assert a2a_pkg.__doc__ is not None, "cleveragents.a2a has no __doc__"
context._a2a_docstring = a2a_pkg.__doc__
# ── Then steps ─────────────────────────────────────────────────────────────
@then("every symbol should resolve to a non-None object")
def step_all_symbols_resolved(context: Any) -> None:
"""Assert every expected symbol is present and non-None."""
module = context._a2a_module
missing = []
for name in context._expected_symbols:
obj = getattr(module, name, None)
if obj is None:
missing.append(name)
assert not missing, f"Missing symbols: {missing}"
@then("the count of exported symbols should equal 22")
def step_symbol_count_is_22(context: Any) -> None:
"""Assert __all__ has exactly 22 entries."""
actual_all = context._a2a_module.__all__
assert len(actual_all) == 22, (
f"Expected 22 symbols in __all__, got {len(actual_all)}"
)
@then('zero instances of "ACP" should be found')
def step_zero_acp_references(context: Any) -> None:
"""Assert zero ACP remnants were found."""
assert context._acp_references_found == 0, (
f"Found {context._acp_references_found} ACP references — rename is incomplete"
)
@then("this confirms the complete ACP → A2A rename is clean")
def step_rename_clean(context: Any) -> None:
"""No additional assertion needed; marker step for clarity."""
pass
@then('it should contain the term "A2A (Agent-to-Agent Protocol)"')
def step_docstring_has_descriptive_term(context: Any) -> None:
"""Assert docstring contains the canonical descriptive term."""
assert "A2A (Agent-to-Agent Protocol)" in context._a2a_docstring, (
f"Docstring missing 'A2A (Agent-to-Agent Protocol)':\n{context._a2a_docstring[:500]}"
)
@then('it should reference "ADRs" or "ADR-047" for standard adoption')
def step_docstring_references_adr(context: Any) -> None:
"""Assert docstring mentions an ADR (ADR-047 for A2A std)."""
pattern = re.compile(r"(ADR-?0*47|A2A Standard Adoption)", re.IGNORECASE)
assert pattern.search(context._a2a_docstring), (
f"Docstring does not reference ADR-047 or A2A Standard Adoption:\n{context._a2a_docstring[:500]}"
)
@then('the docstring should NOT contain any mentions of "ACP protocol"')
def step_no_acp_protocol_mention(context: Any) -> None:
"""Assert docstring does not reference ACP."""
assert (
"ACP(protocol)" not in context._a2a_docstring
and "ACP protocol" not in context._a2a_docstring
), f"Docstring contains legacy 'ACP protocol':\n{context._a2a_docstring[:500]}"
+2
View File
@@ -18,6 +18,8 @@ compatibility. :class:`ServerConnectionConfig` validates connection parameters.
The :class:`TransportSelector` chooses the appropriate transport based on
configuration: stdio for local mode, HTTP for server mode.
Naming follows ADR-047 (A2A Standard Adoption).
"""
from __future__ import annotations