From 5c4413bd7be8bd0c2a099d9fd0a2f2e212cf00b5 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Thu, 23 Apr 2026 07:37:30 -0400 Subject: [PATCH] fix(a2a): export Checkpoint, switch _process_task_response to TaskState enum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Export ``Checkpoint`` TypedDict from the top-level ``adcp`` package so callers can ``from adcp import Checkpoint`` instead of reaching into ``adcp.client`` for the persistence-key type. - Compare ``task.status.state`` against ``TaskState.completed`` / ``TaskState.failed`` in ``_process_task_response`` to match the enum-based membership check in ``_NONTERMINAL_TASK_STATES`` — an upstream rename in a2a-sdk now fails as a type error instead of a silent classification drift. Also flips the in-progress release-please PR from 5.0.0 to 4.0.1. The prior commit (#258) landed breaking-style changes (``pending_task_id`` → ``active_task_id``, ``ValueError`` → ``TypeError`` on non-A2A) but 4.0.0 shipped under 48h earlier with no known A2A adopters — the salesagent migration is on MCP, and A2A adoption is deferred behind pluggable TaskStore / push-notification work. Treating those as pre-adoption corrections rather than a major bump. Release-As: 4.0.1 Co-Authored-By: Claude Opus 4.7 (1M context) --- src/adcp/__init__.py | 3 ++- src/adcp/protocols/a2a.py | 4 ++-- tests/fixtures/public_api_snapshot.json | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/adcp/__init__.py b/src/adcp/__init__.py index 39b93fb9..22deb88d 100644 --- a/src/adcp/__init__.py +++ b/src/adcp/__init__.py @@ -27,7 +27,7 @@ build_synthetic_capabilities, validate_capabilities, ) -from adcp.client import ADCPClient, ADCPMultiAgentClient +from adcp.client import ADCPClient, ADCPMultiAgentClient, Checkpoint from adcp.exceptions import ( # noqa: F401 AdagentsNotFoundError, AdagentsTimeoutError, @@ -566,6 +566,7 @@ def get_adcp_version() -> str: # Client classes "ADCPClient", "ADCPMultiAgentClient", + "Checkpoint", "RegistryClient", "PropertyRegistry", "RegistrySync", diff --git a/src/adcp/protocols/a2a.py b/src/adcp/protocols/a2a.py index 3fdcbbb5..3f519b73 100644 --- a/src/adcp/protocols/a2a.py +++ b/src/adcp/protocols/a2a.py @@ -523,7 +523,7 @@ def _process_task_response(self, task: Task, debug_info: DebugInfo | None) -> Ta """Process a Task response from A2A into our TaskResult format.""" task_state = task.status.state - if task_state == "completed": + if task_state == TaskState.completed: # Extract the result from the artifacts array result_data = self._extract_result_from_task(task) @@ -542,7 +542,7 @@ def _process_task_response(self, task: Task, debug_info: DebugInfo | None) -> Ta }, debug_info=debug_info, ) - elif task_state == "failed": + elif task_state == TaskState.failed: # Protocol-level failure - extract error message from TextPart error_msg = self._extract_text_from_task(task) or "Task failed" return TaskResult[Any]( diff --git a/tests/fixtures/public_api_snapshot.json b/tests/fixtures/public_api_snapshot.json index a5bcf2cc..0fafdde3 100644 --- a/tests/fixtures/public_api_snapshot.json +++ b/tests/fixtures/public_api_snapshot.json @@ -72,6 +72,7 @@ "ChangeHandler", "CheckGovernanceRequest", "CheckGovernanceResponse", + "Checkpoint", "ComplyTestControllerRequest", "ComplyTestControllerResponse", "ConsentBasis",