codex-a2a 0.6.2__tar.gz → 0.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- codex_a2a-0.7.1/.github/dependabot.yml +16 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.github/workflows/ci.yml +2 -2
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.github/workflows/dependency-health.yml +1 -1
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.github/workflows/publish.yml +5 -5
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/PKG-INFO +8 -7
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/README.md +1 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/architecture.md +1 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/compatibility.md +3 -0
- codex_a2a-0.7.1/docs/conformance-triage.md +49 -0
- codex_a2a-0.7.1/docs/conformance.md +78 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/guide.md +3 -1
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/pyproject.toml +6 -6
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/README.md +5 -0
- codex_a2a-0.7.1/scripts/conformance.sh +252 -0
- codex_a2a-0.7.1/scripts/doctor.sh +7 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/__init__.py +2 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/auth.py +20 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/client.py +14 -1
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/config.py +1 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/payload_text.py +11 -1
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/config.py +20 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/contracts/extensions.py +40 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/discovery_runtime.py +6 -17
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/output_mapping.py +17 -9
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/review_runtime.py +5 -17
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_interrupts.py +33 -69
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/thread_lifecycle_runtime.py +5 -17
- codex_a2a-0.7.1/src/codex_a2a/execution/watch_events.py +35 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/application.py +15 -4
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/control_params.py +3 -31
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_payload_mapping.py +4 -25
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_query.py +9 -21
- codex_a2a-0.7.1/src/codex_a2a/jsonrpc/errors.py +377 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/exec_control.py +14 -28
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_params.py +3 -15
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupts.py +13 -26
- codex_a2a-0.7.1/src/codex_a2a/jsonrpc/owner_guard.py +40 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/params_common.py +39 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/review_control.py +12 -18
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/session_control.py +12 -25
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/session_query.py +7 -17
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/thread_lifecycle_control.py +14 -51
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/thread_lifecycle_params.py +3 -15
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/turn_control.py +12 -17
- codex_a2a-0.7.1/src/codex_a2a/payload_helpers.py +52 -0
- codex_a2a-0.7.1/src/codex_a2a/protocol_versions.py +188 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/agent_card.py +4 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/http_middlewares.py +183 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/openapi.py +4 -0
- codex_a2a-0.7.1/src/codex_a2a/upstream/discovery_payloads.py +33 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/interrupts.py +16 -55
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/notification_mapping.py +10 -24
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/stream_bridge.py +2 -27
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/PKG-INFO +8 -7
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/SOURCES.txt +11 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/requires.txt +6 -6
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_client_flow.py +53 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/config/test_settings.py +28 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/contracts/test_extension_contract_consistency.py +3 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_thread_lifecycle_runtime.py +6 -6
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_release_distribution_contract.py +3 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/scripts/test_script_health_contract.py +33 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_agent_card.py +23 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_transport_contract.py +117 -1
- codex_a2a-0.7.1/tests/test_protocol_versions.py +83 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/uv.lock +235 -125
- codex_a2a-0.6.2/src/codex_a2a/jsonrpc/errors.py +0 -131
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.gitignore +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.pre-commit-config.yaml +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.secrets.baseline +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/AGENTS.md +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/CONTRIBUTING.md +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/LICENSE +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/SECURITY.md +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/extension-specifications.md +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/maintainer-architecture.md +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/mypy.ini +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/dependency_health.sh +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/health_common.sh +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/publish_github_release.sh +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/smoke_test_built_cli.sh +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/sync_codex_docs.sh +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/validate_baseline.sh +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/validate_runtime_matrix.sh +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/setup.cfg +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/auth.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/cli.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/agent_card.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/errors.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/manager.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/request_context.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/types.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/contracts/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/contracts/runtime_output.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/cancellation.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/directory_policy.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/exec_runtime.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/executor.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/request_metadata.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/request_overrides.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/response_emitter.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/session_runtime.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_chunks.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_processor.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_state.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/streaming.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/tool_call_payloads.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/input_mapping.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_control.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_params.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/dispatch.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/hooks.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_lifecycle.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_recovery.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_recovery_params.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/params.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/payload_mapping.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/query_params.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/review_control_params.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/turn_control_params.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/logging_context.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/media_modes.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/metrics.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/parts/text.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/profile/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/profile/runtime.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/py.typed +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/application.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/call_context.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/database.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/migrations.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/output_negotiation.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/request_handler.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/runtime_state.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/task_store.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/client.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/conversation_facade.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/exec_facade.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/interrupt_bridge.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/models.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/request_mapping.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/startup.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/transport.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/dependency_links.txt +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/entry_points.txt +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/top_level.txt +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_agent_card.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_cli.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_client_manager.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_errors.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_lifecycle.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_payload_text.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_request_context.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_types.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/config/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/contracts/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_agent_errors.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_cancellation.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_codex_agent_session_binding.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_directory_validation.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_discovery_exec_runtime.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_metrics.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_review_runtime.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_session_ownership.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_session_persistence.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_session_runtime.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_stream_chunks.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_stream_interrupts.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_streaming_output_contract.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_tool_call_payloads.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/fixtures/codex_app_server/command_execution_output_delta.json +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/fixtures/codex_app_server/file_change_output_delta.json +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_discovery_extension.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_exec_extension.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_session_extension.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_thread_lifecycle_extension.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_turn_review_extension.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_dispatch.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_guard_hooks.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_jsonrpc_models.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_logging.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_publish_github_release_script.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_typing_contract.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_version.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/parts/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/parts/test_text.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/profile/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/profile/test_profile.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/scripts/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_auth.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_call_context_builder.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_cli.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_database.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_database_app_persistence.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_migrations.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_request_handler.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_runtime_state.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_task_store.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/context.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/dummy_clients.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/fixtures.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/settings.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/test_input_mapping.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/upstream/__init__.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/upstream/test_codex_client_params.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/upstream/test_interrupt_persistence.py +0 -0
- {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/upstream/test_modular_upstream_components.py +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
updates:
|
|
4
|
+
- package-ecosystem: "uv"
|
|
5
|
+
directory: "/"
|
|
6
|
+
schedule:
|
|
7
|
+
interval: "weekly"
|
|
8
|
+
open-pull-requests-limit: 1
|
|
9
|
+
commit-message:
|
|
10
|
+
prefix: "deps"
|
|
11
|
+
labels:
|
|
12
|
+
- "dependencies"
|
|
13
|
+
groups:
|
|
14
|
+
uv-all-updates:
|
|
15
|
+
patterns:
|
|
16
|
+
- "*"
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
|
|
17
17
|
steps:
|
|
18
18
|
- name: Checkout
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v6
|
|
20
20
|
|
|
21
21
|
- name: Setup Python
|
|
22
22
|
uses: actions/setup-python@v6
|
|
@@ -44,7 +44,7 @@ jobs:
|
|
|
44
44
|
|
|
45
45
|
steps:
|
|
46
46
|
- name: Checkout
|
|
47
|
-
uses: actions/checkout@
|
|
47
|
+
uses: actions/checkout@v6
|
|
48
48
|
|
|
49
49
|
- name: Setup Python
|
|
50
50
|
uses: actions/setup-python@v6
|
|
@@ -28,7 +28,7 @@ jobs:
|
|
|
28
28
|
|
|
29
29
|
steps:
|
|
30
30
|
- name: Checkout
|
|
31
|
-
uses: actions/checkout@
|
|
31
|
+
uses: actions/checkout@v6
|
|
32
32
|
with:
|
|
33
33
|
fetch-depth: 0
|
|
34
34
|
ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag_name || github.ref_name }}
|
|
@@ -108,7 +108,7 @@ jobs:
|
|
|
108
108
|
WHEEL_PATH: ${{ steps.wheel.outputs.wheel_path }}
|
|
109
109
|
|
|
110
110
|
- name: Upload built artifacts
|
|
111
|
-
uses: actions/upload-artifact@
|
|
111
|
+
uses: actions/upload-artifact@v7
|
|
112
112
|
with:
|
|
113
113
|
name: ${{ steps.artifact_name.outputs.name }}
|
|
114
114
|
path: dist/
|
|
@@ -124,7 +124,7 @@ jobs:
|
|
|
124
124
|
|
|
125
125
|
steps:
|
|
126
126
|
- name: Download built artifacts
|
|
127
|
-
uses: actions/download-artifact@
|
|
127
|
+
uses: actions/download-artifact@v8
|
|
128
128
|
with:
|
|
129
129
|
name: ${{ needs.build_release_artifacts.outputs.artifact_name }}
|
|
130
130
|
path: dist
|
|
@@ -147,12 +147,12 @@ jobs:
|
|
|
147
147
|
|
|
148
148
|
steps:
|
|
149
149
|
- name: Checkout
|
|
150
|
-
uses: actions/checkout@
|
|
150
|
+
uses: actions/checkout@v6
|
|
151
151
|
with:
|
|
152
152
|
fetch-depth: 0
|
|
153
153
|
|
|
154
154
|
- name: Download built artifacts
|
|
155
|
-
uses: actions/download-artifact@
|
|
155
|
+
uses: actions/download-artifact@v8
|
|
156
156
|
with:
|
|
157
157
|
name: ${{ needs.build_release_artifacts.outputs.artifact_name }}
|
|
158
158
|
path: dist
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-a2a
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: Codex A2A runtime adapter
|
|
5
5
|
Author: liujuanjuan1984@Intelligent-Internet
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -22,18 +22,18 @@ Classifier: Topic :: Internet :: WWW/HTTP
|
|
|
22
22
|
Requires-Python: >=3.11
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
License-File: LICENSE
|
|
25
|
-
Requires-Dist: a2a-sdk==0.3.
|
|
25
|
+
Requires-Dist: a2a-sdk==0.3.26
|
|
26
26
|
Requires-Dist: aiosqlite<1.0,>=0.20
|
|
27
|
-
Requires-Dist: fastapi<0.
|
|
27
|
+
Requires-Dist: fastapi<0.136,>=0.121
|
|
28
28
|
Requires-Dist: httpx<0.29,>=0.28.1
|
|
29
|
-
Requires-Dist: protobuf<
|
|
29
|
+
Requires-Dist: protobuf<8.0,>=6.33.5
|
|
30
30
|
Requires-Dist: pyasn1<1.0,>=0.6.3
|
|
31
31
|
Requires-Dist: pydantic<3.0,>=2.6
|
|
32
32
|
Requires-Dist: pydantic-settings<3.0,>=2.2
|
|
33
33
|
Requires-Dist: requests<3.0,>=2.33.0
|
|
34
34
|
Requires-Dist: sqlalchemy<3.0,>=2.0
|
|
35
|
-
Requires-Dist: sse-starlette<
|
|
36
|
-
Requires-Dist: uvicorn<0.
|
|
35
|
+
Requires-Dist: sse-starlette<4.0,>=2.1
|
|
36
|
+
Requires-Dist: uvicorn<0.45,>=0.29
|
|
37
37
|
Provides-Extra: dev
|
|
38
38
|
Requires-Dist: pip-audit<3.0,>=2.9; extra == "dev"
|
|
39
39
|
Requires-Dist: pre-commit>=3.7; extra == "dev"
|
|
@@ -42,7 +42,7 @@ Requires-Dist: pytest>=8.0; extra == "dev"
|
|
|
42
42
|
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
43
43
|
Requires-Dist: pytest-cov<8.0,>=5.0; extra == "dev"
|
|
44
44
|
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
45
|
-
Requires-Dist: mypy<1.
|
|
45
|
+
Requires-Dist: mypy<1.21,>=1.11; extra == "dev"
|
|
46
46
|
Dynamic: license-file
|
|
47
47
|
|
|
48
48
|
# codex-a2a
|
|
@@ -198,6 +198,7 @@ The normative compatibility split and deployment model live in [Compatibility Gu
|
|
|
198
198
|
- [Architecture Guide](docs/architecture.md) System structure, boundaries, and request flow.
|
|
199
199
|
- [Maintainer Architecture Guide](docs/maintainer-architecture.md) Internal module structure, request call chains, and persistence touchpoints for contributors.
|
|
200
200
|
- [Compatibility Guide](docs/compatibility.md) Supported Python/runtime surface, extension stability, and ecosystem-facing compatibility expectations.
|
|
201
|
+
- [External Conformance Experiments](docs/conformance.md) Manual A2A TCK experiment entrypoint and triage workflow.
|
|
201
202
|
- [Security Policy](SECURITY.md) Threat model, deployment caveats, and vulnerability disclosure guidance.
|
|
202
203
|
|
|
203
204
|
## Development
|
|
@@ -151,6 +151,7 @@ The normative compatibility split and deployment model live in [Compatibility Gu
|
|
|
151
151
|
- [Architecture Guide](docs/architecture.md) System structure, boundaries, and request flow.
|
|
152
152
|
- [Maintainer Architecture Guide](docs/maintainer-architecture.md) Internal module structure, request call chains, and persistence touchpoints for contributors.
|
|
153
153
|
- [Compatibility Guide](docs/compatibility.md) Supported Python/runtime surface, extension stability, and ecosystem-facing compatibility expectations.
|
|
154
|
+
- [External Conformance Experiments](docs/conformance.md) Manual A2A TCK experiment entrypoint and triage workflow.
|
|
154
155
|
- [Security Policy](SECURITY.md) Threat model, deployment caveats, and vulnerability disclosure guidance.
|
|
155
156
|
|
|
156
157
|
## Development
|
|
@@ -93,6 +93,7 @@ Use the docs by responsibility:
|
|
|
93
93
|
- [Maintainer Architecture Guide](maintainer-architecture.md): internal module boundaries, request call chains, and persistence touchpoints
|
|
94
94
|
- [Extension Specifications](extension-specifications.md): stable extension URI/spec index and public-vs-extended disclosure rules
|
|
95
95
|
- [Compatibility Guide](compatibility.md): current compatibility promises and stability expectations
|
|
96
|
+
- [External Conformance Experiments](conformance.md): manual A2A TCK experiment entrypoint and triage workflow
|
|
96
97
|
- [Contributing Guide](../CONTRIBUTING.md): contributor workflow and validation
|
|
97
98
|
- [Security Policy](../SECURITY.md): threat model and disclosure guidance
|
|
98
99
|
|
|
@@ -7,9 +7,12 @@ This document explains the compatibility promises this repository currently trie
|
|
|
7
7
|
- Python versions: 3.11, 3.12, 3.13
|
|
8
8
|
- A2A SDK line: `0.3.x`
|
|
9
9
|
- A2A protocol version advertised by default: `0.3.0`
|
|
10
|
+
- Normalized protocol compatibility lines declared today: `0.3`, `1.0`
|
|
10
11
|
|
|
11
12
|
The repository pins the SDK version in `pyproject.toml` and validates the published CLI build in CI. Upgrade the SDK deliberately rather than relying on floating dependency resolution.
|
|
12
13
|
|
|
14
|
+
The authenticated compatibility profile and wire contract publish `default_protocol_version`, `supported_protocol_versions`, and `protocol_compatibility`. Request-time `A2A-Version` negotiation currently supports the default `0.3` line plus a partial `1.0` compatibility line for response header echo, PascalCase JSON-RPC method aliases, and protocol-aware error shaping. Transport payload schemas, enums, pagination, and push-notification behavior remain SDK-owned `0.3` behavior until separately implemented.
|
|
15
|
+
|
|
13
16
|
## Contract Honesty
|
|
14
17
|
|
|
15
18
|
Machine-readable discovery surfaces must reflect actual runtime behavior:
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# External Conformance Triage
|
|
2
|
+
|
|
3
|
+
This document is the standing triage template for local `./scripts/conformance.sh` runs against the official `a2aproject/a2a-tck`.
|
|
4
|
+
|
|
5
|
+
## Standards Used For Triage
|
|
6
|
+
|
|
7
|
+
- `a2a-sdk==0.3.26` as installed in this repository.
|
|
8
|
+
- The default A2A protocol version advertised by this repository: `0.3.0`.
|
|
9
|
+
- Repository compatibility policy:
|
|
10
|
+
- machine-readable Agent Card and OpenAPI contracts must reflect implemented runtime behavior;
|
|
11
|
+
- external TCK results are investigation input rather than default merge gates;
|
|
12
|
+
- unsupported `1.0` behavior should be tracked as future compatibility work, not silently declared as supported.
|
|
13
|
+
|
|
14
|
+
## Classification Labels
|
|
15
|
+
|
|
16
|
+
- `Runtime issue`: the failure reproduces against the repository's declared runtime behavior and should be fixed here.
|
|
17
|
+
- `TCK mismatch`: the failure appears to conflict with the installed SDK line or this repository's declared v0.3 baseline.
|
|
18
|
+
- `Future protocol gap`: the failure is not a v0.3 regression, but it identifies work needed for stronger v1.0 compatibility.
|
|
19
|
+
- `Local experiment artifact`: the failure comes from the dummy-backed SUT, local auth, local URLs, timing, or other experiment setup details.
|
|
20
|
+
- `Needs repro`: the failure needs a focused local probe before assigning ownership.
|
|
21
|
+
|
|
22
|
+
## Triage Workflow
|
|
23
|
+
|
|
24
|
+
For each failed or errored node ID:
|
|
25
|
+
|
|
26
|
+
1. Copy the node ID from `failed-tests.json`.
|
|
27
|
+
2. Inspect the corresponding raw details in `pytest-report.json` and `tck.log`.
|
|
28
|
+
3. Compare the expectation with `docs/compatibility.md`, authenticated Agent Card params, and OpenAPI `x-a2a-extension-contracts`.
|
|
29
|
+
4. Assign one classification label.
|
|
30
|
+
5. Record whether the next action belongs in this repository, the TCK, or a future protocol compatibility issue.
|
|
31
|
+
|
|
32
|
+
## Per-Test Triage
|
|
33
|
+
|
|
34
|
+
Add dated entries below after a real run:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
YYYY-MM-DD:
|
|
38
|
+
- <nodeid>: <classification>. <short rationale>. Next action: <repo/TCK/future/none>.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Summary
|
|
42
|
+
|
|
43
|
+
Keep the summary short and separate:
|
|
44
|
+
|
|
45
|
+
- Count clean runtime issues.
|
|
46
|
+
- Count TCK mismatches.
|
|
47
|
+
- Count future protocol gaps.
|
|
48
|
+
- Count local experiment artifacts.
|
|
49
|
+
- List follow-up issue numbers when created.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# External Conformance Experiments
|
|
2
|
+
|
|
3
|
+
This repository keeps internal regression and external interoperability experiments separate on purpose.
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
- `./scripts/doctor.sh` and `./scripts/validate_baseline.sh` remain the default internal regression entrypoints.
|
|
8
|
+
- `./scripts/conformance.sh` is a local/manual experiment entrypoint for official external tooling.
|
|
9
|
+
- External conformance output is investigation input, not an automatic merge gate.
|
|
10
|
+
|
|
11
|
+
## Current Experiment Shape
|
|
12
|
+
|
|
13
|
+
The default `./scripts/conformance.sh` workflow does the following:
|
|
14
|
+
|
|
15
|
+
1. Syncs the repository environment unless explicitly skipped.
|
|
16
|
+
2. Caches or refreshes the official `a2aproject/a2a-tck` checkout.
|
|
17
|
+
3. Starts a local dummy-backed `codex-a2a` runtime unless `CONFORMANCE_SUT_URL` points to an existing SUT.
|
|
18
|
+
4. Runs the requested TCK category, defaulting to `mandatory`.
|
|
19
|
+
5. Preserves raw logs and machine-readable reports under `run/conformance/<timestamp>/`.
|
|
20
|
+
|
|
21
|
+
The default local SUT uses the repository test double `DummyChatCodexClient`. That keeps the experiment reproducible without requiring a live Codex upstream.
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
Run the default mandatory experiment:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
bash ./scripts/conformance.sh
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Run a different TCK category:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
bash ./scripts/conformance.sh capabilities
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Target an already running runtime instead of the local dummy-backed SUT:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
CONFORMANCE_SUT_URL=http://127.0.0.1:8000 \
|
|
41
|
+
A2A_AUTH_TYPE=bearer \
|
|
42
|
+
A2A_AUTH_TOKEN=dev-token \
|
|
43
|
+
bash ./scripts/conformance.sh mandatory
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Skip local environment sync when the repository and cached TCK environment are already current:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
CONFORMANCE_SKIP_REPO_SYNC=1 \
|
|
50
|
+
CONFORMANCE_SKIP_TCK_SYNC=1 \
|
|
51
|
+
bash ./scripts/conformance.sh mandatory
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Artifacts
|
|
55
|
+
|
|
56
|
+
Each run keeps the following artifacts in the selected output directory:
|
|
57
|
+
|
|
58
|
+
- `agent-card.json`: fetched public Agent Card
|
|
59
|
+
- `health.json`: fetched authenticated health payload when the local SUT is used
|
|
60
|
+
- `repo-health.log`: repository environment sync and dependency compatibility output
|
|
61
|
+
- `tck.log`: raw TCK console output
|
|
62
|
+
- `pytest-report.json`: pytest-json-report output emitted by the TCK runner when available
|
|
63
|
+
- `failed-tests.json`: compact list of failed/error node IDs for triage when a report is available
|
|
64
|
+
- `metadata.json`: experiment metadata including local repo commit and cached TCK commit
|
|
65
|
+
|
|
66
|
+
## Interpretation Guidance
|
|
67
|
+
|
|
68
|
+
When a TCK run fails, inspect the raw report before changing the runtime:
|
|
69
|
+
|
|
70
|
+
- Some failures may point to real runtime gaps.
|
|
71
|
+
- Some failures may come from TCK assumptions that do not match `a2a-sdk==0.3.26`.
|
|
72
|
+
- Some failures may come from A2A v0.3 versus v1.0 naming or schema drift.
|
|
73
|
+
- Some failures may be local experiment artifacts from the dummy-backed runtime.
|
|
74
|
+
|
|
75
|
+
The experiment is useful only if those categories stay separate during triage.
|
|
76
|
+
Use the authenticated compatibility profile and wire contract `protocol_compatibility` fields as the repository-owned declaration of which protocol lines are supported today, partially supported for compatibility, or reserved for future work.
|
|
77
|
+
|
|
78
|
+
Record first-pass classifications in [conformance-triage.md](./conformance-triage.md).
|
|
@@ -163,7 +163,7 @@ Extension boundary principles:
|
|
|
163
163
|
|
|
164
164
|
Current implementation note:
|
|
165
165
|
|
|
166
|
-
- The compatibility profile is declarative. It does not introduce a global runtime `core-only` switch.
|
|
166
|
+
- The compatibility profile is declarative. It does not introduce a global runtime `core-only` switch; request-time `A2A-Version` negotiation is limited to the protocol lines and gaps published in the profile.
|
|
167
167
|
- This is intentional: current shared session/stream/interrupt behavior is part of the deployed interoperability contract, so a blanket runtime profile split would be misleading without broader wire-level changes.
|
|
168
168
|
- For compatibility policy and stability expectations, use [compatibility.md](./compatibility.md) as the normative repo document rather than this usage guide.
|
|
169
169
|
|
|
@@ -199,6 +199,7 @@ Use the grouped sections below as the deployment-first reading order:
|
|
|
199
199
|
- `A2A_VERSION`: agent version string
|
|
200
200
|
- `A2A_PROJECT`: optional project label injected into examples and discovery metadata
|
|
201
201
|
- `A2A_PROTOCOL_VERSION`: advertised A2A protocol version, default `0.3.0`
|
|
202
|
+
- `A2A_SUPPORTED_PROTOCOL_VERSIONS`: comma-separated request negotiation lines, default `0.3,1.0`
|
|
202
203
|
- `A2A_DOCUMENTATION_URL`: optional external documentation URL exposed on Agent Card
|
|
203
204
|
- `A2A_STATIC_AUTH_CREDENTIALS`: JSON array of static inbound credentials. Supports multiple `bearer` and `basic` entries, each with a stable `principal`; `bearer` entries must declare `principal`, while `basic` entries derive `principal` from `username`.
|
|
204
205
|
|
|
@@ -278,6 +279,7 @@ These variables are forwarded to the local `codex app-server` subprocess.
|
|
|
278
279
|
| `A2A_VERSION` | Agent version |
|
|
279
280
|
| `A2A_PROJECT` | Project label |
|
|
280
281
|
| `A2A_PROTOCOL_VERSION` | Protocol version |
|
|
282
|
+
| `A2A_SUPPORTED_PROTOCOL_VERSIONS` | Supported protocol versions |
|
|
281
283
|
| `A2A_DOCUMENTATION_URL` | Documentation URL |
|
|
282
284
|
| `A2A_ENABLE_HEALTH_ENDPOINT` | Enable /health |
|
|
283
285
|
| `A2A_ENABLE_SESSION_SHELL` | Enable session shell |
|
|
@@ -24,18 +24,18 @@ classifiers = [
|
|
|
24
24
|
"Topic :: Internet :: WWW/HTTP",
|
|
25
25
|
]
|
|
26
26
|
dependencies = [
|
|
27
|
-
"a2a-sdk==0.3.
|
|
27
|
+
"a2a-sdk==0.3.26",
|
|
28
28
|
"aiosqlite>=0.20,<1.0",
|
|
29
|
-
"fastapi>=0.121,<0.
|
|
29
|
+
"fastapi>=0.121,<0.136",
|
|
30
30
|
"httpx>=0.28.1,<0.29",
|
|
31
|
-
"protobuf>=6.33.5,<
|
|
31
|
+
"protobuf>=6.33.5,<8.0",
|
|
32
32
|
"pyasn1>=0.6.3,<1.0",
|
|
33
33
|
"pydantic>=2.6,<3.0",
|
|
34
34
|
"pydantic-settings>=2.2,<3.0",
|
|
35
35
|
"requests>=2.33.0,<3.0",
|
|
36
36
|
"sqlalchemy>=2.0,<3.0",
|
|
37
|
-
"sse-starlette>=2.1,<
|
|
38
|
-
"uvicorn>=0.29,<0.
|
|
37
|
+
"sse-starlette>=2.1,<4.0",
|
|
38
|
+
"uvicorn>=0.29,<0.45",
|
|
39
39
|
]
|
|
40
40
|
|
|
41
41
|
[project.optional-dependencies]
|
|
@@ -47,7 +47,7 @@ dev = [
|
|
|
47
47
|
"pytest-asyncio>=0.23",
|
|
48
48
|
"pytest-cov>=5.0,<8.0",
|
|
49
49
|
"ruff>=0.5",
|
|
50
|
-
"mypy>=1.11,<1.
|
|
50
|
+
"mypy>=1.11,<1.21",
|
|
51
51
|
]
|
|
52
52
|
|
|
53
53
|
[project.scripts]
|
|
@@ -12,8 +12,10 @@ This document only explains the remaining repository-local maintainer scripts. U
|
|
|
12
12
|
|
|
13
13
|
## Which Script to Use
|
|
14
14
|
|
|
15
|
+
- [`scripts/doctor.sh`](./doctor.sh): run the default local validation baseline through the shortest maintainer entrypoint.
|
|
15
16
|
- [`scripts/validate_baseline.sh`](./validate_baseline.sh): run the default local validation baseline used by contributors and CI.
|
|
16
17
|
- [`scripts/validate_runtime_matrix.sh`](./validate_runtime_matrix.sh): run the reduced runtime-only validation used by the multi-version CI matrix.
|
|
18
|
+
- [`scripts/conformance.sh`](./conformance.sh): run the official A2A TCK as a local/manual external compatibility experiment.
|
|
17
19
|
- [`scripts/dependency_health.sh`](./dependency_health.sh): run the standalone dependency review flow (`sync`/`pip check`, outdated package listing, and dev vulnerability audit).
|
|
18
20
|
- [`scripts/smoke_test_built_cli.sh`](./smoke_test_built_cli.sh): validate that a built wheel can be installed through `uv tool` and becomes healthy.
|
|
19
21
|
- [`scripts/sync_codex_docs.sh`](./sync_codex_docs.sh): refresh local upstream Codex reference snapshots when maintainers need them.
|
|
@@ -28,7 +30,10 @@ The `Publish` workflow now separates build, PyPI publish, and GitHub Release syn
|
|
|
28
30
|
|
|
29
31
|
## Notes
|
|
30
32
|
|
|
33
|
+
- `doctor.sh` is a thin alias for the default local regression baseline; `validate_baseline.sh` remains the CI-facing script name.
|
|
34
|
+
- `conformance.sh` intentionally stays outside the default regression gate. Use it to gather external compatibility evidence, then triage results in [`docs/conformance-triage.md`](../docs/conformance-triage.md).
|
|
31
35
|
- `validate_baseline.sh` and `dependency_health.sh` intentionally remain separate entrypoints and share common prerequisites through [`health_common.sh`](./health_common.sh).
|
|
32
36
|
- `validate_baseline.sh` now blocks on runtime dependency vulnerability audit, while `dependency_health.sh` remains focused on broader dependency review (`outdated` + dev audit).
|
|
37
|
+
- [`.github/dependabot.yml`](../.github/dependabot.yml) prefers a single weekly grouped Dependabot PR for `uv`, while the repository scripts remain the explicit audit and validation entrypoints.
|
|
33
38
|
- End-user runtime startup does not use repository scripts. Prefer the published CLI command documented in [README.md](../README.md) and [docs/guide.md](../docs/guide.md).
|
|
34
39
|
- Keep long-form documentation changes in `docs/` to avoid divergence.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Run a local-only external A2A conformance experiment without changing default gates.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
# shellcheck source=./health_common.sh
|
|
6
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/health_common.sh"
|
|
7
|
+
|
|
8
|
+
usage() {
|
|
9
|
+
cat <<'EOF'
|
|
10
|
+
Usage:
|
|
11
|
+
bash ./scripts/conformance.sh [category]
|
|
12
|
+
|
|
13
|
+
Purpose:
|
|
14
|
+
Run the official A2A TCK as a local/manual experiment.
|
|
15
|
+
This script is intentionally separate from doctor.sh, validate_baseline.sh, and CI gates.
|
|
16
|
+
|
|
17
|
+
Category:
|
|
18
|
+
Defaults to "mandatory". Any category supported by a2aproject/a2a-tck run_tck.py is accepted.
|
|
19
|
+
|
|
20
|
+
Selected environment variables:
|
|
21
|
+
CONFORMANCE_OUTPUT_DIR Override artifact directory (default: run/conformance/<timestamp>)
|
|
22
|
+
CONFORMANCE_TCK_DIR Override cached TCK checkout path (default: .cache/a2a-tck)
|
|
23
|
+
CONFORMANCE_TCK_REPO Override TCK repo URL (default: https://github.com/a2aproject/a2a-tck.git)
|
|
24
|
+
CONFORMANCE_TCK_REF Override TCK git ref (default: main)
|
|
25
|
+
CONFORMANCE_TRANSPORTS Override requested transports (default: jsonrpc)
|
|
26
|
+
CONFORMANCE_TRANSPORT_STRATEGY Override TCK transport strategy (default: agent_preferred)
|
|
27
|
+
CONFORMANCE_SUT_URL Use an already running SUT instead of the local dummy-backed runtime
|
|
28
|
+
CONFORMANCE_SUT_PORT Override local dummy-backed SUT port (default: 8011)
|
|
29
|
+
CONFORMANCE_SKIP_REPO_SYNC=1 Skip uv sync/uv pip check for this repository
|
|
30
|
+
CONFORMANCE_SKIP_TCK_SYNC=1 Skip uv sync inside the cached TCK checkout
|
|
31
|
+
CONFORMANCE_AUTH_TYPE Default auth type when A2A_AUTH_TYPE is unset (default: bearer)
|
|
32
|
+
CONFORMANCE_AUTH_TOKEN Default auth token when A2A_AUTH_TOKEN is unset (default: test-token)
|
|
33
|
+
|
|
34
|
+
Advanced authentication:
|
|
35
|
+
The script preserves caller-provided A2A_AUTH_* variables and only sets defaults
|
|
36
|
+
for the common bearer-token case used by the local dummy-backed runtime.
|
|
37
|
+
EOF
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
|
|
41
|
+
usage
|
|
42
|
+
exit 0
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
if [[ "$#" -gt 1 ]]; then
|
|
46
|
+
echo "Expected at most one positional argument: category" >&2
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
51
|
+
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
52
|
+
|
|
53
|
+
category="${1:-${CONFORMANCE_CATEGORY:-mandatory}}"
|
|
54
|
+
timestamp="$(date -u +%Y%m%dT%H%M%SZ)"
|
|
55
|
+
output_dir="${CONFORMANCE_OUTPUT_DIR:-${ROOT_DIR}/run/conformance/${timestamp}}"
|
|
56
|
+
tck_dir="${CONFORMANCE_TCK_DIR:-${ROOT_DIR}/.cache/a2a-tck}"
|
|
57
|
+
tck_repo="${CONFORMANCE_TCK_REPO:-https://github.com/a2aproject/a2a-tck.git}"
|
|
58
|
+
tck_ref="${CONFORMANCE_TCK_REF:-main}"
|
|
59
|
+
transport_strategy="${CONFORMANCE_TRANSPORT_STRATEGY:-agent_preferred}"
|
|
60
|
+
transports="${CONFORMANCE_TRANSPORTS:-jsonrpc}"
|
|
61
|
+
sut_port="${CONFORMANCE_SUT_PORT:-8011}"
|
|
62
|
+
repo_log="${output_dir}/repo-health.log"
|
|
63
|
+
tck_sync_log="${output_dir}/tck-sync.log"
|
|
64
|
+
sut_log="${output_dir}/sut.log"
|
|
65
|
+
tck_log="${output_dir}/tck.log"
|
|
66
|
+
|
|
67
|
+
mkdir -p "${output_dir}"
|
|
68
|
+
|
|
69
|
+
cleanup() {
|
|
70
|
+
local exit_code="$1"
|
|
71
|
+
if [[ -n "${sut_pid:-}" ]] && kill -0 "${sut_pid}" >/dev/null 2>&1; then
|
|
72
|
+
kill "${sut_pid}" >/dev/null 2>&1 || true
|
|
73
|
+
wait "${sut_pid}" >/dev/null 2>&1 || true
|
|
74
|
+
fi
|
|
75
|
+
exit "${exit_code}"
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
trap 'cleanup $?' EXIT
|
|
79
|
+
|
|
80
|
+
cd "${ROOT_DIR}"
|
|
81
|
+
|
|
82
|
+
if [[ "${CONFORMANCE_SKIP_REPO_SYNC:-0}" != "1" ]]; then
|
|
83
|
+
run_shared_repo_health_prerequisites "conformance" >"${repo_log}" 2>&1
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
mkdir -p "$(dirname "${tck_dir}")"
|
|
87
|
+
if [[ ! -d "${tck_dir}/.git" ]]; then
|
|
88
|
+
git clone --depth 1 "${tck_repo}" "${tck_dir}" >"${output_dir}/tck-clone.log" 2>&1
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
git -C "${tck_dir}" fetch --depth 1 origin "${tck_ref}" >"${output_dir}/tck-fetch.log" 2>&1
|
|
92
|
+
git -C "${tck_dir}" checkout --quiet FETCH_HEAD
|
|
93
|
+
|
|
94
|
+
if [[ "${CONFORMANCE_SKIP_TCK_SYNC:-0}" != "1" ]]; then
|
|
95
|
+
(
|
|
96
|
+
cd "${tck_dir}"
|
|
97
|
+
uv sync
|
|
98
|
+
) >"${tck_sync_log}" 2>&1
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
if [[ -z "${A2A_AUTH_TYPE:-}" ]]; then
|
|
102
|
+
export A2A_AUTH_TYPE="${CONFORMANCE_AUTH_TYPE:-bearer}"
|
|
103
|
+
fi
|
|
104
|
+
if [[ -z "${A2A_AUTH_TOKEN:-}" && "${A2A_AUTH_TYPE}" == "bearer" ]]; then
|
|
105
|
+
export A2A_AUTH_TOKEN="${CONFORMANCE_AUTH_TOKEN:-test-token}"
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
sut_url="${CONFORMANCE_SUT_URL:-}"
|
|
109
|
+
if [[ -z "${sut_url}" ]]; then
|
|
110
|
+
sut_url="http://127.0.0.1:${sut_port}"
|
|
111
|
+
export CONFORMANCE_SUT_PORT="${sut_port}"
|
|
112
|
+
export CONFORMANCE_SUT_URL="${sut_url}"
|
|
113
|
+
uv run python - <<'PY' >"${sut_log}" 2>&1 &
|
|
114
|
+
import os
|
|
115
|
+
|
|
116
|
+
import uvicorn
|
|
117
|
+
|
|
118
|
+
import codex_a2a.server.application as app_module
|
|
119
|
+
from tests.support.dummy_clients import DummyChatCodexClient
|
|
120
|
+
from tests.support.settings import make_settings
|
|
121
|
+
|
|
122
|
+
app_module.CodexClient = DummyChatCodexClient
|
|
123
|
+
settings = make_settings(
|
|
124
|
+
a2a_host="127.0.0.1",
|
|
125
|
+
a2a_port=int(os.environ["CONFORMANCE_SUT_PORT"]),
|
|
126
|
+
a2a_public_url=os.environ["CONFORMANCE_SUT_URL"],
|
|
127
|
+
a2a_bearer_token=os.environ.get("A2A_AUTH_TOKEN", "test-token"),
|
|
128
|
+
a2a_database_url=None,
|
|
129
|
+
)
|
|
130
|
+
app = app_module.create_app(settings)
|
|
131
|
+
uvicorn.run(app, host="127.0.0.1", port=settings.a2a_port, log_level="warning")
|
|
132
|
+
PY
|
|
133
|
+
sut_pid="$!"
|
|
134
|
+
|
|
135
|
+
for _ in $(seq 1 50); do
|
|
136
|
+
if curl -fsS "${sut_url}/.well-known/agent-card.json" >"${output_dir}/agent-card.json"; then
|
|
137
|
+
if curl -fsS -H "Authorization: Bearer ${A2A_AUTH_TOKEN:-test-token}" "${sut_url}/health" \
|
|
138
|
+
>"${output_dir}/health.json"; then
|
|
139
|
+
break
|
|
140
|
+
fi
|
|
141
|
+
fi
|
|
142
|
+
sleep 0.2
|
|
143
|
+
done
|
|
144
|
+
|
|
145
|
+
if [[ ! -f "${output_dir}/agent-card.json" || ! -f "${output_dir}/health.json" ]]; then
|
|
146
|
+
echo "SUT did not become ready at ${sut_url}" >&2
|
|
147
|
+
cat "${sut_log}" >&2 || true
|
|
148
|
+
exit 1
|
|
149
|
+
fi
|
|
150
|
+
else
|
|
151
|
+
curl -fsS "${sut_url}/.well-known/agent-card.json" >"${output_dir}/agent-card.json"
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
json_report_name="pytest-${category}.json"
|
|
155
|
+
|
|
156
|
+
set +e
|
|
157
|
+
(
|
|
158
|
+
cd "${tck_dir}"
|
|
159
|
+
CONFORMANCE_CATEGORY="${category}" \
|
|
160
|
+
CONFORMANCE_SUT_URL="${sut_url}" \
|
|
161
|
+
CONFORMANCE_JSON_REPORT_NAME="${json_report_name}" \
|
|
162
|
+
CONFORMANCE_TRANSPORT_STRATEGY="${transport_strategy}" \
|
|
163
|
+
CONFORMANCE_TRANSPORTS="${transports}" \
|
|
164
|
+
uv run python - <<'PY'
|
|
165
|
+
from __future__ import annotations
|
|
166
|
+
|
|
167
|
+
import os
|
|
168
|
+
import run_tck
|
|
169
|
+
|
|
170
|
+
raise SystemExit(
|
|
171
|
+
run_tck.run_test_category(
|
|
172
|
+
category=os.environ["CONFORMANCE_CATEGORY"],
|
|
173
|
+
sut_url=os.environ["CONFORMANCE_SUT_URL"],
|
|
174
|
+
verbose=False,
|
|
175
|
+
verbose_log=True,
|
|
176
|
+
generate_report=False,
|
|
177
|
+
json_report=os.environ["CONFORMANCE_JSON_REPORT_NAME"],
|
|
178
|
+
transport_strategy=os.environ["CONFORMANCE_TRANSPORT_STRATEGY"],
|
|
179
|
+
enable_equivalence_testing=None,
|
|
180
|
+
transports=os.environ["CONFORMANCE_TRANSPORTS"],
|
|
181
|
+
)
|
|
182
|
+
)
|
|
183
|
+
PY
|
|
184
|
+
) 2>&1 | tee "${tck_log}"
|
|
185
|
+
tck_exit="${PIPESTATUS[0]}"
|
|
186
|
+
set -e
|
|
187
|
+
|
|
188
|
+
report_path="${tck_dir}/reports/${json_report_name}"
|
|
189
|
+
if [[ -f "${report_path}" ]]; then
|
|
190
|
+
cp "${report_path}" "${output_dir}/pytest-report.json"
|
|
191
|
+
fi
|
|
192
|
+
|
|
193
|
+
CONFORMANCE_CATEGORY="${category}" \
|
|
194
|
+
CONFORMANCE_OUTPUT_DIR="${output_dir}" \
|
|
195
|
+
CONFORMANCE_SUT_URL="${sut_url}" \
|
|
196
|
+
CONFORMANCE_TCK_DIR="${tck_dir}" \
|
|
197
|
+
CONFORMANCE_TCK_REF="${tck_ref}" \
|
|
198
|
+
CONFORMANCE_TRANSPORTS="${transports}" \
|
|
199
|
+
CONFORMANCE_TRANSPORT_STRATEGY="${transport_strategy}" \
|
|
200
|
+
uv run python - <<'PY'
|
|
201
|
+
from __future__ import annotations
|
|
202
|
+
|
|
203
|
+
import json
|
|
204
|
+
import os
|
|
205
|
+
import subprocess
|
|
206
|
+
from pathlib import Path
|
|
207
|
+
|
|
208
|
+
output_dir = Path(os.environ["CONFORMANCE_OUTPUT_DIR"])
|
|
209
|
+
report_path = output_dir / "pytest-report.json"
|
|
210
|
+
|
|
211
|
+
metadata = {
|
|
212
|
+
"category": os.environ["CONFORMANCE_CATEGORY"],
|
|
213
|
+
"sut_url": os.environ["CONFORMANCE_SUT_URL"],
|
|
214
|
+
"tck_dir": os.environ["CONFORMANCE_TCK_DIR"],
|
|
215
|
+
"tck_ref": os.environ["CONFORMANCE_TCK_REF"],
|
|
216
|
+
"transports": os.environ["CONFORMANCE_TRANSPORTS"],
|
|
217
|
+
"transport_strategy": os.environ["CONFORMANCE_TRANSPORT_STRATEGY"],
|
|
218
|
+
"repo_commit": subprocess.check_output(["git", "rev-parse", "HEAD"], text=True).strip(),
|
|
219
|
+
"tck_commit": subprocess.check_output(
|
|
220
|
+
["git", "-C", os.environ["CONFORMANCE_TCK_DIR"], "rev-parse", "HEAD"],
|
|
221
|
+
text=True,
|
|
222
|
+
).strip(),
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
(output_dir / "metadata.json").write_text(json.dumps(metadata, indent=2) + "\n")
|
|
226
|
+
|
|
227
|
+
if report_path.exists():
|
|
228
|
+
report = json.loads(report_path.read_text())
|
|
229
|
+
failures = []
|
|
230
|
+
for test in report.get("tests", []):
|
|
231
|
+
outcome = test.get("outcome")
|
|
232
|
+
if outcome in {"failed", "error"}:
|
|
233
|
+
failures.append(
|
|
234
|
+
{
|
|
235
|
+
"nodeid": test.get("nodeid"),
|
|
236
|
+
"outcome": outcome,
|
|
237
|
+
"keywords": sorted(test.get("keywords", [])),
|
|
238
|
+
}
|
|
239
|
+
)
|
|
240
|
+
(output_dir / "failed-tests.json").write_text(json.dumps(failures, indent=2) + "\n")
|
|
241
|
+
PY
|
|
242
|
+
|
|
243
|
+
echo "Conformance artifacts: ${output_dir}"
|
|
244
|
+
echo "TCK log: ${tck_log}"
|
|
245
|
+
if [[ -f "${output_dir}/pytest-report.json" ]]; then
|
|
246
|
+
echo "Pytest JSON report: ${output_dir}/pytest-report.json"
|
|
247
|
+
fi
|
|
248
|
+
if [[ -f "${output_dir}/failed-tests.json" ]]; then
|
|
249
|
+
echo "Failed tests index: ${output_dir}/failed-tests.json"
|
|
250
|
+
fi
|
|
251
|
+
|
|
252
|
+
exit "${tck_exit}"
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Minimal A2A client facade package."""
|
|
2
2
|
|
|
3
|
+
from .auth import StaticCredentialService
|
|
3
4
|
from .client import A2AClient
|
|
4
5
|
from .config import A2AClientConfig
|
|
5
6
|
from .errors import (
|
|
@@ -25,6 +26,7 @@ __all__ = [
|
|
|
25
26
|
"A2AClient",
|
|
26
27
|
"A2AClientManager",
|
|
27
28
|
"A2AClientConfig",
|
|
29
|
+
"StaticCredentialService",
|
|
28
30
|
"A2AClientConfigError",
|
|
29
31
|
"A2AClientError",
|
|
30
32
|
"A2AClientLifecycleError",
|