codex-a2a 1.1.2__tar.gz → 1.2.0__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-1.1.2 → codex_a2a-1.2.0}/.github/workflows/ci.yml +1 -1
- codex_a2a-1.2.0/.github/workflows/compatibility.yml +76 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/CONTRIBUTING.md +2 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/PKG-INFO +9 -10
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/README.md +2 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/docs/compatibility.md +1 -1
- codex_a2a-1.2.0/docs/conformance-triage.md +66 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/docs/conformance.md +7 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/docs/guide.md +26 -18
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/docs/maintainer-architecture.md +2 -2
- codex_a2a-1.2.0/mypy.ini +14 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/pyproject.toml +15 -10
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/README.md +1 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/conformance.sh +41 -7
- codex_a2a-1.2.0/scripts/smoke_test_live_codex.sh +47 -0
- codex_a2a-1.2.0/scripts/tck_auth_plugin.py +48 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/validate_baseline.sh +5 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/a2a_proto.py +4 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/cli.py +6 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/agent_card.py +1 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/client.py +2 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/config.py +16 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/contracts/extension_specs.py +11 -11
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/contracts/extensions.py +0 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/stream_processor.py +145 -121
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/application.py +13 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/errors.py +24 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/payload_mapping.py +13 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/session_query.py +2 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/thread_lifecycle_control.py +1 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/metrics.py +34 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/protocol_versions.py +1 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/application.py +43 -3
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/call_context.py +4 -4
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/http_middlewares.py +210 -114
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/openapi.py +3 -3
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/request_handler.py +31 -1
- codex_a2a-1.2.0/src/codex_a2a/server/runtime_limits.py +167 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/task_store.py +11 -83
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/client.py +4 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/stream_bridge.py +100 -60
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/transport.py +11 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a.egg-info/PKG-INFO +9 -10
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a.egg-info/SOURCES.txt +6 -3
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a.egg-info/requires.txt +5 -7
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_lifecycle.py +2 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/config/test_settings.py +18 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/contracts/test_extension_contract_consistency.py +4 -3
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_cancellation.py +7 -3
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_metrics.py +24 -4
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_request_metadata.py +5 -3
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_codex_session_extension.py +1 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_guard_hooks.py +5 -3
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_protocol_payload_mapping.py +1 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/package/test_release_distribution_contract.py +38 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/scripts/test_script_health_contract.py +4 -0
- codex_a2a-1.2.0/tests/scripts/test_tck_auth_plugin.py +28 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_agent_card.py +2 -10
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_call_context_builder.py +2 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_output_negotiation.py +2 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_request_handler.py +12 -5
- codex_a2a-1.2.0/tests/server/test_runtime_limits.py +122 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_runtime_state.py +4 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_transport_contract.py +264 -34
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/support/context.py +2 -1
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/support/dummy_clients.py +2 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/support/fixtures.py +2 -2
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/upstream/test_codex_client_params.py +2 -4
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/upstream/test_modular_upstream_components.py +19 -0
- codex_a2a-1.2.0/uv.lock +2159 -0
- codex_a2a-1.1.2/docs/conformance-triage.md +0 -49
- codex_a2a-1.1.2/mypy.ini +0 -14
- codex_a2a-1.1.2/src/codex_a2a/parts/text.py +0 -15
- codex_a2a-1.1.2/tests/parts/test_text.py +0 -41
- codex_a2a-1.1.2/tests/upstream/__init__.py +0 -0
- codex_a2a-1.1.2/uv.lock +0 -1676
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/.github/dependabot.yml +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/.github/workflows/dependency-health.yml +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/.github/workflows/publish.yml +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/.gitignore +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/.pre-commit-config.yaml +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/.secrets.baseline +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/AGENTS.md +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/LICENSE +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/SECURITY.md +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/docs/a2a-extension-baseline.md +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/docs/architecture.md +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/docs/extension-specifications.md +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/audit_low_call_sites.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/check_dead_code.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/dependency_health.sh +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/health_common.sh +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/publish_github_release.sh +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/smoke_test_built_cli.sh +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/sync_codex_docs.sh +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/scripts/validate_runtime_matrix.sh +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/setup.cfg +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/auth.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/auth.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/config.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/errors.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/extension_negotiation.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/manager.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/payload_text.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/client/request_context.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/contracts/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/contracts/extension_registry.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/contracts/runtime_output.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/discovery_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/exec_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/executor.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/output_mapping.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/request_metadata.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/request_overrides.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/response_emitter.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/review_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/session_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/stream_chunks.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/stream_interrupts.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/stream_state.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/streaming.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/thread_lifecycle_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/tool_call_payloads.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/execution/watch_events.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/input_mapping.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/discovery_control.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/discovery_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/discovery_payload_mapping.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/discovery_query.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/dispatch.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/exec_control.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/exec_control_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/hooks.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/interrupt_lifecycle.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/interrupt_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/interrupt_recovery.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/interrupt_recovery_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/interrupts.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/owner_guard.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/params_common.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/query_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/request_models.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/review_control.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/review_control_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/thread_lifecycle_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/turn_control.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/jsonrpc/turn_control_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/logging_context.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/media_modes.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/payload_helpers.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/profile/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/profile/runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/py.typed +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/agent_card.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/database.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/migrations.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/openapi_contract_fragments.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/output_negotiation.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/push_config_store.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/runtime_state.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/server/runtime_state_schema.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/conversation_facade.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/discovery_payloads.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/interrupt_bridge.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/interrupts.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/models.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/notification_mapping.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/request_mapping.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a/upstream/startup.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a.egg-info/dependency_links.txt +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a.egg-info/entry_points.txt +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/src/codex_a2a.egg-info/top_level.txt +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_agent_card.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_cli.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_client_flow.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_client_manager.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_errors.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_payload_text.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/client/test_request_context.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/config/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/contracts/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/contracts/test_extension_registry.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_agent_errors.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_codex_agent_session_binding.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_directory_validation.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_discovery_exec_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_review_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_session_ownership.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_session_persistence.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_session_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_stream_chunks.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_stream_interrupts.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_streaming_output_contract.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_thread_lifecycle_runtime.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/execution/test_tool_call_payloads.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/fixtures/codex_app_server/command_execution_output_delta.json +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/fixtures/codex_app_server/file_change_output_delta.json +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_codex_discovery_extension.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_codex_exec_extension.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_codex_thread_lifecycle_extension.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_codex_turn_review_extension.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_dispatch.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_interrupt_lifecycle.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_interrupt_params.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_interrupt_protocol_handlers.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/jsonrpc/test_jsonrpc_models.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/package/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/package/test_logging.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/package/test_publish_github_release_script.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/package/test_typing_contract.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/package/test_version.py +0 -0
- {codex_a2a-1.1.2/tests/parts → codex_a2a-1.2.0/tests/profile}/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/profile/test_profile.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/scripts/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/scripts/test_audit_low_call_sites.py +0 -0
- {codex_a2a-1.1.2/tests/profile → codex_a2a-1.2.0/tests/server}/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_auth.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_cli.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_database.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_database_app_persistence.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_migrations.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_push_config_store.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/server/test_task_store.py +0 -0
- {codex_a2a-1.1.2/tests/server → codex_a2a-1.2.0/tests/support}/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/support/http_auth.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/support/jsonrpc_errors.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/support/settings.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/test_a2a_proto.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/test_input_mapping.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/test_protocol_versions.py +0 -0
- {codex_a2a-1.1.2/tests/support → codex_a2a-1.2.0/tests/upstream}/__init__.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/upstream/test_interrupt_bridge.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/upstream/test_interrupt_persistence.py +0 -0
- {codex_a2a-1.1.2 → codex_a2a-1.2.0}/tests/upstream/test_request_mapping.py +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
name: Scheduled Compatibility
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: "17 4 * * 1"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
a2a-tck:
|
|
13
|
+
name: A2A Mandatory TCK
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
timeout-minutes: 30
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout
|
|
19
|
+
uses: actions/checkout@v6
|
|
20
|
+
|
|
21
|
+
- name: Setup Python
|
|
22
|
+
uses: actions/setup-python@v6
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.13"
|
|
25
|
+
|
|
26
|
+
- name: Setup uv
|
|
27
|
+
uses: astral-sh/setup-uv@v7
|
|
28
|
+
with:
|
|
29
|
+
enable-cache: true
|
|
30
|
+
|
|
31
|
+
- name: Run pinned mandatory TCK
|
|
32
|
+
env:
|
|
33
|
+
CONFORMANCE_TCK_REF: 5996b79f9cefa6fc390980e383e358a66fb9e49e # pragma: allowlist secret
|
|
34
|
+
run: bash ./scripts/conformance.sh mandatory
|
|
35
|
+
|
|
36
|
+
- name: Upload TCK evidence
|
|
37
|
+
if: always()
|
|
38
|
+
uses: actions/upload-artifact@v7
|
|
39
|
+
with:
|
|
40
|
+
name: a2a-tck-evidence
|
|
41
|
+
path: run/conformance/
|
|
42
|
+
if-no-files-found: error
|
|
43
|
+
retention-days: 14
|
|
44
|
+
|
|
45
|
+
live-codex:
|
|
46
|
+
name: Latest Codex App Server Smoke
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
timeout-minutes: 10
|
|
49
|
+
|
|
50
|
+
steps:
|
|
51
|
+
- name: Checkout
|
|
52
|
+
uses: actions/checkout@v6
|
|
53
|
+
|
|
54
|
+
- name: Setup Python
|
|
55
|
+
uses: actions/setup-python@v6
|
|
56
|
+
with:
|
|
57
|
+
python-version: "3.13"
|
|
58
|
+
|
|
59
|
+
- name: Setup Node.js
|
|
60
|
+
uses: actions/setup-node@v6
|
|
61
|
+
with:
|
|
62
|
+
node-version: "24"
|
|
63
|
+
|
|
64
|
+
- name: Setup uv
|
|
65
|
+
uses: astral-sh/setup-uv@v7
|
|
66
|
+
with:
|
|
67
|
+
enable-cache: true
|
|
68
|
+
|
|
69
|
+
- name: Sync dependencies
|
|
70
|
+
run: uv sync --all-extras --frozen
|
|
71
|
+
|
|
72
|
+
- name: Install latest stable Codex CLI
|
|
73
|
+
run: npm install --global @openai/codex@latest
|
|
74
|
+
|
|
75
|
+
- name: Verify real Codex app-server initialization
|
|
76
|
+
run: bash ./scripts/smoke_test_live_codex.sh
|
|
@@ -51,7 +51,7 @@ CODEX_WORKSPACE_ROOT=/abs/path/to/workspace uv run codex-a2a serve
|
|
|
51
51
|
5. Inspect the discovery surfaces:
|
|
52
52
|
|
|
53
53
|
- `http://127.0.0.1:8000/.well-known/agent-card.json`
|
|
54
|
-
- `curl -H "Authorization: Bearer ${DEMO_BEARER_TOKEN}" http://127.0.0.1:8000/
|
|
54
|
+
- `curl -H "Authorization: Bearer ${DEMO_BEARER_TOKEN}" http://127.0.0.1:8000/extendedAgentCard`
|
|
55
55
|
|
|
56
56
|
## Validation Baseline
|
|
57
57
|
|
|
@@ -61,7 +61,7 @@ Run the default validation baseline before opening or updating a PR:
|
|
|
61
61
|
bash ./scripts/validate_baseline.sh
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
This script runs `
|
|
64
|
+
This script checks untracked files before the tracked repository, runs `mypy`, runs `pytest` with the repository coverage floor and a 90% changed-line coverage gate against `origin/main`, then builds the package and smoke-tests the freshly built wheel.
|
|
65
65
|
|
|
66
66
|
For shell script changes, validate the touched scripts directly, for example:
|
|
67
67
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-a2a
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Codex A2A runtime adapter
|
|
5
5
|
Author: liujuanjuan1984@Intelligent-Internet
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -17,24 +17,22 @@ Classifier: Programming Language :: Python :: 3
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
21
|
Classifier: Framework :: FastAPI
|
|
21
22
|
Classifier: Topic :: Internet :: WWW/HTTP
|
|
22
23
|
Requires-Python: >=3.11
|
|
23
24
|
Description-Content-Type: text/markdown
|
|
24
25
|
License-File: LICENSE
|
|
25
|
-
Requires-Dist: a2a-sdk==1.1.
|
|
26
|
+
Requires-Dist: a2a-sdk==1.1.2
|
|
26
27
|
Requires-Dist: aiosqlite<1.0,>=0.20
|
|
27
|
-
Requires-Dist: fastapi<0.
|
|
28
|
+
Requires-Dist: fastapi<0.142,>=0.121
|
|
28
29
|
Requires-Dist: httpx<0.29,>=0.28.1
|
|
29
30
|
Requires-Dist: protobuf<7.0,>=6.33.5
|
|
30
|
-
Requires-Dist: pyasn1<1.0,>=0.6.3
|
|
31
|
-
Requires-Dist: python-dotenv<2.0,>=1.2.2
|
|
32
31
|
Requires-Dist: pydantic<3.0,>=2.6
|
|
33
32
|
Requires-Dist: pydantic-settings<3.0,>=2.2
|
|
34
|
-
Requires-Dist: requests<3.0,>=2.33.0
|
|
35
33
|
Requires-Dist: sqlalchemy<3.0,>=2.0
|
|
36
34
|
Requires-Dist: sse-starlette<4.0,>=2.1
|
|
37
|
-
Requires-Dist: uvicorn<0.
|
|
35
|
+
Requires-Dist: uvicorn<0.53,>=0.29
|
|
38
36
|
Provides-Extra: dev
|
|
39
37
|
Requires-Dist: pip-audit<3.0,>=2.9; extra == "dev"
|
|
40
38
|
Requires-Dist: pre-commit>=3.7; extra == "dev"
|
|
@@ -42,8 +40,9 @@ Requires-Dist: pygments<3.0,>=2.20.0; extra == "dev"
|
|
|
42
40
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
43
41
|
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
44
42
|
Requires-Dist: pytest-cov<8.0,>=5.0; extra == "dev"
|
|
43
|
+
Requires-Dist: diff-cover<10,>=9; extra == "dev"
|
|
45
44
|
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
46
|
-
Requires-Dist: mypy<2.
|
|
45
|
+
Requires-Dist: mypy<2.4,>=1.11; extra == "dev"
|
|
47
46
|
Dynamic: license-file
|
|
48
47
|
|
|
49
48
|
# codex-a2a
|
|
@@ -163,7 +162,7 @@ Agent Card: `http://127.0.0.1:8000/.well-known/agent-card.json`
|
|
|
163
162
|
|
|
164
163
|
Authenticated extended card:
|
|
165
164
|
- JSON-RPC: `agent/getAuthenticatedExtendedCard`
|
|
166
|
-
- HTTP: `GET /
|
|
165
|
+
- HTTP: `GET /extendedAgentCard`
|
|
167
166
|
|
|
168
167
|
Outbound peer auth is configured with `A2A_CLIENT_BEARER_TOKEN` or `A2A_CLIENT_BASIC_AUTH`; see the Usage Guide for the complete client-side matrix.
|
|
169
168
|
|
|
@@ -186,7 +185,7 @@ Look elsewhere if:
|
|
|
186
185
|
|
|
187
186
|
## Highlights
|
|
188
187
|
|
|
189
|
-
- A2A HTTP+JSON endpoints such as `/
|
|
188
|
+
- A2A HTTP+JSON endpoints such as `/message:send` and `/message:stream`
|
|
190
189
|
- A2A JSON-RPC support on `POST /`
|
|
191
190
|
- Embedded client access through `codex-a2a call`
|
|
192
191
|
- Autonomous outbound peer calls through the `a2a_call` tool
|
|
@@ -115,7 +115,7 @@ Agent Card: `http://127.0.0.1:8000/.well-known/agent-card.json`
|
|
|
115
115
|
|
|
116
116
|
Authenticated extended card:
|
|
117
117
|
- JSON-RPC: `agent/getAuthenticatedExtendedCard`
|
|
118
|
-
- HTTP: `GET /
|
|
118
|
+
- HTTP: `GET /extendedAgentCard`
|
|
119
119
|
|
|
120
120
|
Outbound peer auth is configured with `A2A_CLIENT_BEARER_TOKEN` or `A2A_CLIENT_BASIC_AUTH`; see the Usage Guide for the complete client-side matrix.
|
|
121
121
|
|
|
@@ -138,7 +138,7 @@ Look elsewhere if:
|
|
|
138
138
|
|
|
139
139
|
## Highlights
|
|
140
140
|
|
|
141
|
-
- A2A HTTP+JSON endpoints such as `/
|
|
141
|
+
- A2A HTTP+JSON endpoints such as `/message:send` and `/message:stream`
|
|
142
142
|
- A2A JSON-RPC support on `POST /`
|
|
143
143
|
- Embedded client access through `codex-a2a call`
|
|
144
144
|
- Autonomous outbound peer calls through the `a2a_call` tool
|
|
@@ -83,7 +83,7 @@ The current service profile is intentionally:
|
|
|
83
83
|
|
|
84
84
|
One deployed instance should be treated as a single-tenant trust boundary, not as a secure multi-tenant runtime boundary.
|
|
85
85
|
|
|
86
|
-
The supported HTTP+JSON contract is rooted at
|
|
86
|
+
The supported HTTP+JSON contract is rooted at the service root (A2A 1.0 resolves REST paths from the advertised interface URL, and protocol version is negotiated via the `A2A-Version` header rather than a URL prefix). Tenant-prefixed REST aliases such as `/{tenant}/...` are intentionally not part of the supported surface for this single-tenant deployment profile.
|
|
87
87
|
|
|
88
88
|
The compatibility surface distinguishes between:
|
|
89
89
|
|
|
@@ -0,0 +1,66 @@
|
|
|
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==1.1.2` as installed in this repository.
|
|
8
|
+
- The default A2A protocol version advertised by this repository: `1.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 behavior should be tracked as implementation 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 `1.0` baseline.
|
|
18
|
+
- `Protocol gap`: the failure identifies work needed to complete the repository's declared `1.0` surface.
|
|
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 extended card skills/examples, 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
|
+
2026-08-21 (pinned TCK `5996b79f9cefa6fc390980e383e358a66fb9e49e`, jsonrpc transport, `must` level; 8 failed / 61 passed / 166 skipped):
|
|
42
|
+
|
|
43
|
+
- `test_artifacts.py::TestTextArtifact::test_task_has_text_artifact[jsonrpc]`: Local experiment artifact. The dummy-backed SUT echoes fixed text instead of the TCK-provided content. Next action: none (fixture limitation of the dummy SUT).
|
|
44
|
+
- `test_artifacts.py::TestFileArtifact::test_task_has_file_artifact[jsonrpc]`: Local experiment artifact. Dummy SUT returns a text part where the TCK expects a file part. Next action: none.
|
|
45
|
+
- `test_artifacts.py::TestFileUrlArtifact::test_task_has_file_url_artifact[jsonrpc]`: Local experiment artifact. Same dummy-SUT limitation. Next action: none.
|
|
46
|
+
- `test_artifacts.py::TestDataArtifact::test_task_has_data_artifact[jsonrpc]`: Local experiment artifact. Same dummy-SUT limitation. Next action: none.
|
|
47
|
+
- `test_artifacts.py::TestMessageResponse::test_returns_message_with_text_part[jsonrpc]`: Local experiment artifact. The adapter returns a Task for plain send (streaming-first contract); the TCK expects a Message for this case. Next action: none (documented deviation; see `docs/compatibility.md`).
|
|
48
|
+
- `test_error_codes.py::TestJsonRpcErrorCodeMappings::test_content_type_not_supported_error[jsonrpc]`: Local experiment artifact. The TCK sends a raw unauthenticated request; the repository's auth wall (by design) returns 401 before the content-type check can produce `ContentTypeNotSupportedError` (-32005). The authenticated path returns -32005 (covered by repository regression tests). Next action: none.
|
|
49
|
+
- `test_error_codes.py::TestJsonRpcErrorCodeMappings::test_version_not_supported_error[jsonrpc]`: Local experiment artifact. Same raw unauthenticated call; the authenticated path returns `VersionNotSupportedError` (-32009). Next action: none.
|
|
50
|
+
- `test_error_codes.py::TestJsonRpcErrorCodeRange::test_error_code_in_valid_range[SendMessage-bad-version]`: Local experiment artifact. Same raw unauthenticated call; the authenticated path returns -32009, which is in the valid A2A range. Next action: none.
|
|
51
|
+
|
|
52
|
+
Previously failing adapter defects fixed in this pass (verified by the same pinned TCK run and repository regression tests):
|
|
53
|
+
|
|
54
|
+
- `test_error_handling.py::TestCoreErrorStructure::test_error_has_code_and_message_jsonrpc`: Fixed. The 401 unauthorized body now carries `code`/`message` (A2A error shape).
|
|
55
|
+
- `test_requirements.py::test_must_requirement[STREAM-SUB-004-jsonrpc]` and `test_sse_streaming.py::TestSseSubscribeToTask::test_subscribe_nonexistent_task_returns_error`: Fixed. SubscribeToTask for a missing task now returns `TaskNotFoundError` (-32001) instead of -32603.
|
|
56
|
+
- `test_task_lifecycle.py::TestMultiTurn::test_reject_mismatching_context[jsonrpc]` (CORE-MULTI-006): Fixed. SendMessage with a mismatching contextId is now rejected.
|
|
57
|
+
|
|
58
|
+
## Summary
|
|
59
|
+
|
|
60
|
+
Keep the summary short and separate:
|
|
61
|
+
|
|
62
|
+
- Count clean runtime issues.
|
|
63
|
+
- Count TCK mismatches.
|
|
64
|
+
- Count protocol gaps.
|
|
65
|
+
- Count local experiment artifacts.
|
|
66
|
+
- List follow-up issue numbers when created.
|
|
@@ -7,6 +7,7 @@ This repository keeps internal regression and external interoperability experime
|
|
|
7
7
|
- `./scripts/validate_baseline.sh` remains the default internal regression entrypoint.
|
|
8
8
|
- `./scripts/conformance.sh` is a local/manual experiment entrypoint for official external tooling.
|
|
9
9
|
- External conformance output is investigation input, not an automatic merge gate.
|
|
10
|
+
- `.github/workflows/compatibility.yml` runs the mandatory TCK weekly against a pinned TCK commit and preserves its evidence as a workflow artifact.
|
|
10
11
|
|
|
11
12
|
## Current Experiment Shape
|
|
12
13
|
|
|
@@ -19,6 +20,7 @@ The default `./scripts/conformance.sh` workflow does the following:
|
|
|
19
20
|
5. Preserves raw logs and machine-readable reports under `run/conformance/<timestamp>/`.
|
|
20
21
|
|
|
21
22
|
The default local SUT uses the repository test double `DummyChatCodexClient`. That keeps the experiment reproducible without requiring a live Codex upstream.
|
|
23
|
+
For current TCK releases that do not expose authentication options, the runner loads `scripts/tck_auth_plugin.py` to inject the configured test credential into HTTP transport clients. The SUT authentication middleware remains enabled.
|
|
22
24
|
|
|
23
25
|
## Usage
|
|
24
26
|
|
|
@@ -61,6 +63,8 @@ Each run keeps the following artifacts in the selected output directory:
|
|
|
61
63
|
- `tck.log`: raw TCK console output
|
|
62
64
|
- `pytest-report.json`: pytest-json-report output emitted by the TCK runner when available
|
|
63
65
|
- `failed-tests.json`: compact list of failed/error node IDs for triage when a report is available
|
|
66
|
+
- `compatibility.json` / `compatibility.html`: current TCK compatibility reports when emitted
|
|
67
|
+
- `tck_report.html` / `junitreport.xml`: current TCK pytest reports when emitted
|
|
64
68
|
- `metadata.json`: experiment metadata including local repo commit and cached TCK commit
|
|
65
69
|
|
|
66
70
|
## Interpretation Guidance
|
|
@@ -68,11 +72,13 @@ Each run keeps the following artifacts in the selected output directory:
|
|
|
68
72
|
When a TCK run fails, inspect the raw report before changing the runtime:
|
|
69
73
|
|
|
70
74
|
- Some failures may point to real runtime gaps.
|
|
71
|
-
- Some failures may come from TCK assumptions that do not match `a2a-sdk==1.
|
|
75
|
+
- Some failures may come from TCK assumptions that do not match `a2a-sdk==1.1.2`.
|
|
72
76
|
- Some failures may come from older A2A naming or schema expectations that no longer match the repository's `1.0` contract.
|
|
73
77
|
- Some failures may be local experiment artifacts from the dummy-backed runtime.
|
|
74
78
|
|
|
75
79
|
The experiment is useful only if those categories stay separate during triage.
|
|
76
80
|
Use the authenticated compatibility profile and wire contract `protocol_compatibility` fields as the repository-owned declaration of which protocol lines are supported today.
|
|
77
81
|
|
|
82
|
+
The same scheduled workflow installs the latest stable Codex CLI and runs `scripts/smoke_test_live_codex.sh`. The smoke check only verifies the real stdio app-server initialization and shutdown handshake; it does not send a model request or require provider credentials.
|
|
83
|
+
|
|
78
84
|
Record first-pass classifications in [conformance-triage.md](./conformance-triage.md).
|
|
@@ -5,14 +5,14 @@ This guide covers runtime configuration, transport contracts, streaming/session/
|
|
|
5
5
|
## Transport Contracts
|
|
6
6
|
|
|
7
7
|
- The service supports both transports:
|
|
8
|
-
- HTTP+JSON (REST endpoints such as `/
|
|
8
|
+
- HTTP+JSON (REST endpoints such as `/message:send`)
|
|
9
9
|
- Shared JSON-RPC (`POST /`) for both core A2A methods and provider-private extension methods
|
|
10
10
|
- Agent Card publishes both HTTP+JSON and JSON-RPC endpoints through `supported_interfaces[]`.
|
|
11
|
-
- Both supported interfaces
|
|
11
|
+
- Both supported interfaces publish the same `public_url`. For HTTP+JSON, that URL is the REST service root: per A2A 1.0 the concrete REST methods (`/message:send`, `/tasks/...`) live at that root, and the protocol version is negotiated via the `A2A-Version` header rather than a URL prefix.
|
|
12
12
|
- The public Agent Card at `/.well-known/agent-card.json` is intentionally slimmed to the minimum discovery surface.
|
|
13
13
|
- The authenticated extended card exposes the authenticated provider-private skill inventory and deployment-aware examples:
|
|
14
14
|
- preferred: JSON-RPC `GetExtendedAgentCard`
|
|
15
|
-
- HTTP core route: `GET /
|
|
15
|
+
- HTTP core route: `GET /extendedAgentCard`
|
|
16
16
|
- Anonymous shared-contract hints are available through OpenAPI metadata:
|
|
17
17
|
- `GET /openapi.json`
|
|
18
18
|
- `x-a2a-extension-contracts` for negotiated shared extensions and shared interrupt callback hints
|
|
@@ -20,7 +20,7 @@ This guide covers runtime configuration, transport contracts, streaming/session/
|
|
|
20
20
|
- Agent Card responses publish `ETag` and `Cache-Control`; clients should revalidate instead of repeatedly fetching full payloads.
|
|
21
21
|
- Larger discovery documents support gzip compression on these HTTP GET routes:
|
|
22
22
|
- `/.well-known/agent-card.json`
|
|
23
|
-
- `GET /
|
|
23
|
+
- `GET /extendedAgentCard`
|
|
24
24
|
- `GET /openapi.json`
|
|
25
25
|
- Streaming and task routes do not rely on this gzip behavior.
|
|
26
26
|
- Payload schema is transport-specific and should not be mixed:
|
|
@@ -48,9 +48,9 @@ Current behavior:
|
|
|
48
48
|
- `CancelTask`
|
|
49
49
|
- `SubscribeToTask`
|
|
50
50
|
- core HTTP endpoints:
|
|
51
|
-
- `/
|
|
52
|
-
- `/
|
|
53
|
-
- `/
|
|
51
|
+
- `/message:send`
|
|
52
|
+
- `/message:stream`
|
|
53
|
+
- `/tasks/{id}:subscribe`
|
|
54
54
|
- extension JSON-RPC methods are declared separately from the core baseline even though they share the same `POST /` endpoint
|
|
55
55
|
- `codex.interrupts.list` is an always-on adapter-local recovery surface for pending interrupt request IDs
|
|
56
56
|
- `codex.turns.steer` becomes deployment-conditional when `A2A_ENABLE_TURN_CONTROL=false`
|
|
@@ -130,9 +130,9 @@ Current profile shape:
|
|
|
130
130
|
- `CancelTask`
|
|
131
131
|
- `SubscribeToTask`
|
|
132
132
|
- core HTTP endpoints:
|
|
133
|
-
- `/
|
|
134
|
-
- `/
|
|
135
|
-
- `/
|
|
133
|
+
- `/message:send`
|
|
134
|
+
- `/message:stream`
|
|
135
|
+
- `/tasks/{id}:subscribe`
|
|
136
136
|
|
|
137
137
|
Retention guidance:
|
|
138
138
|
|
|
@@ -196,11 +196,14 @@ Use the grouped sections below as the deployment-first reading order:
|
|
|
196
196
|
- `A2A_LOG_LEVEL`: `DEBUG/INFO/WARNING/ERROR`, default `WARNING`
|
|
197
197
|
- `A2A_LOG_PAYLOADS`: log A2A/Codex payload bodies, default `false`
|
|
198
198
|
- `A2A_LOG_BODY_LIMIT`: payload log body size limit, default `0` (no truncation)
|
|
199
|
+
- `A2A_REQUEST_BODY_MAX_BYTES`: hard HTTP request body limit, default `4194304` (4 MiB); set `0` to disable
|
|
200
|
+
- `A2A_MAX_CONCURRENT_OPERATIONS`: process-local active POST and task-subscription limit, default `32`; set `0` to disable
|
|
201
|
+
- `A2A_ENABLE_METRICS_ENDPOINT`: enable the authenticated Prometheus `/metrics` endpoint, default `true`
|
|
199
202
|
- `A2A_TITLE`: agent name, default `Codex A2A`
|
|
200
203
|
- `A2A_DESCRIPTION`: agent description exposed on Agent Card and docs surfaces
|
|
201
204
|
- `A2A_VERSION`: agent version string
|
|
202
205
|
- `A2A_PROJECT`: optional project label injected into examples and discovery metadata
|
|
203
|
-
- `A2A_PROTOCOL_VERSION`: advertised A2A protocol version, default `1.0
|
|
206
|
+
- `A2A_PROTOCOL_VERSION`: advertised A2A protocol version, default `1.0`; values outside the `1.0` protocol line are rejected
|
|
204
207
|
- `A2A_DOCUMENTATION_URL`: optional external documentation URL exposed on Agent Card
|
|
205
208
|
- `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`.
|
|
206
209
|
|
|
@@ -275,6 +278,8 @@ These variables are forwarded to the local `codex app-server` subprocess.
|
|
|
275
278
|
| `A2A_LOG_LEVEL` | Log level |
|
|
276
279
|
| `A2A_LOG_PAYLOADS` | Log bodies |
|
|
277
280
|
| `A2A_LOG_BODY_LIMIT` | Body log limit |
|
|
281
|
+
| `A2A_REQUEST_BODY_MAX_BYTES` | HTTP request body limit |
|
|
282
|
+
| `A2A_MAX_CONCURRENT_OPERATIONS` | Active operation capacity |
|
|
278
283
|
| `A2A_TITLE` | Agent title |
|
|
279
284
|
| `A2A_DESCRIPTION` | Agent description |
|
|
280
285
|
| `A2A_VERSION` | Agent version |
|
|
@@ -282,6 +287,7 @@ These variables are forwarded to the local `codex app-server` subprocess.
|
|
|
282
287
|
| `A2A_PROTOCOL_VERSION` | Protocol version |
|
|
283
288
|
| `A2A_DOCUMENTATION_URL` | Documentation URL |
|
|
284
289
|
| `A2A_ENABLE_HEALTH_ENDPOINT` | Enable /health |
|
|
290
|
+
| `A2A_ENABLE_METRICS_ENDPOINT` | Enable /metrics |
|
|
285
291
|
| `A2A_ENABLE_TURN_CONTROL` | Enable turn control |
|
|
286
292
|
| `A2A_ENABLE_REVIEW_CONTROL` | Enable review control |
|
|
287
293
|
| `A2A_ENABLE_EXEC_CONTROL` | Enable interactive exec |
|
|
@@ -439,6 +445,8 @@ On the current npm global install layout for Linux x64, the command above resolv
|
|
|
439
445
|
### Health, Auth, and Deployment Boundary
|
|
440
446
|
|
|
441
447
|
- `GET /health` is a lightweight authenticated status probe. It requires the same configured inbound auth as other protected endpoints and returns service status plus a structured `profile` summary; it does not call upstream Codex.
|
|
448
|
+
- `GET /ready` is enabled with `/health` and reports whether the initialized Codex app-server subprocess is alive and its stdout reader is running. It does not make a model request.
|
|
449
|
+
- `GET /metrics` exposes authenticated Prometheus text metrics, including active operations and resource-limit rejections. Disable it with `A2A_ENABLE_METRICS_ENDPOINT=false` when metrics are collected through another integration.
|
|
442
450
|
- Protected routes accept configured inbound `Authorization: Bearer <token>` and/or `Authorization: Basic <base64(username:password)>` credentials. The public Agent Card endpoints are public; authenticated extended card routes still require inbound auth.
|
|
443
451
|
- Static credential registry mode is the only supported inbound auth shape. It lets deployments define multiple bearer tokens and/or multiple Basic credentials with stable `principal` values.
|
|
444
452
|
- Stable `principal` values back runtime ownership checks. This avoids tying session, watch, or exec ownership to a bearer token hash that changes during token rotation.
|
|
@@ -452,7 +460,7 @@ On the current npm global install layout for Linux x64, the command above resolv
|
|
|
452
460
|
### Session and Task Behavior
|
|
453
461
|
|
|
454
462
|
- The service forwards A2A `message:send` requests and `SendMessage` JSON-RPC calls to Codex session/message flows.
|
|
455
|
-
- Streaming is always enabled for this service surface. `/
|
|
463
|
+
- Streaming is always enabled for this service surface. `/message:stream` and JSON-RPC `SendStreamingMessage` are compatibility-sensitive core capabilities rather than deployment-time toggles.
|
|
456
464
|
- `codex.exec.start`, `codex.exec.write`, `codex.exec.resize`, and `codex.exec.terminate` expose a standalone interactive `command/exec` runtime when `A2A_ENABLE_EXEC_CONTROL=true`. This surface is intended for internal or tightly controlled deployments where interactive terminal control is an explicit part of the adapter contract. `codex.exec.start` returns process/task handles immediately, while stdout/stderr deltas and the final result flow through normal A2A task streaming and `SubscribeToTask`.
|
|
457
465
|
- Rich input is supported on two surfaces:
|
|
458
466
|
- core A2A `SendMessage` and `SendStreamingMessage` keep standard A2A parts and map `Part(text)`, image `Part(url|raw)`, and `Part(data={"type":"mention"|"skill", ...})` into Codex turn input
|
|
@@ -477,7 +485,7 @@ On the current npm global install layout for Linux x64, the command above resolv
|
|
|
477
485
|
|
|
478
486
|
### Streaming and Interrupt Contract
|
|
479
487
|
|
|
480
|
-
- Streaming (`/
|
|
488
|
+
- Streaming (`/message:stream`) emits an initial working `Task`, then incremental `TaskArtifactUpdateEvent` / `TaskStatusUpdateEvent` updates, and finally a terminal `Task`.
|
|
481
489
|
- If task persistence fails while processing a request, the service maps that failure to a stable failed task or failed final status instead of leaking raw task-store exceptions.
|
|
482
490
|
- Those task-store failure surfaces use `metadata.codex.error` with `type=TASK_STORE_UNAVAILABLE` and an `operation` field such as `get` or `save`.
|
|
483
491
|
- Stream artifacts carry `artifact.metadata.shared.stream.block_type` with values `text`, `reasoning`, and `tool_call`.
|
|
@@ -565,7 +573,7 @@ Server behavior:
|
|
|
565
573
|
Minimal example:
|
|
566
574
|
|
|
567
575
|
```bash
|
|
568
|
-
curl -sS http://127.0.0.1:8000/
|
|
576
|
+
curl -sS http://127.0.0.1:8000/message:send \
|
|
569
577
|
-H 'content-type: application/json' \
|
|
570
578
|
-H "Authorization: Bearer ${DEMO_BEARER_TOKEN}" \
|
|
571
579
|
-d '{
|
|
@@ -755,7 +763,7 @@ curl -sS http://127.0.0.1:8000/ \
|
|
|
755
763
|
The JSON-RPC result returns `task_id` and `context_id`. Then use the standard task stream:
|
|
756
764
|
|
|
757
765
|
```bash
|
|
758
|
-
curl -sS http://127.0.0.1:8000/
|
|
766
|
+
curl -sS http://127.0.0.1:8000/tasks/<task_id>:subscribe \
|
|
759
767
|
-H "Authorization: Bearer ${DEMO_BEARER_TOKEN}"
|
|
760
768
|
```
|
|
761
769
|
|
|
@@ -886,7 +894,7 @@ curl -sS http://127.0.0.1:8000/ \
|
|
|
886
894
|
The JSON-RPC result returns `task_id` and `context_id`. Then use the standard task stream:
|
|
887
895
|
|
|
888
896
|
```bash
|
|
889
|
-
curl -sS http://127.0.0.1:8000/
|
|
897
|
+
curl -sS http://127.0.0.1:8000/tasks/<task_id>:subscribe \
|
|
890
898
|
-H "Authorization: Bearer ${DEMO_BEARER_TOKEN}"
|
|
891
899
|
```
|
|
892
900
|
|
|
@@ -1165,7 +1173,7 @@ curl -sS http://127.0.0.1:8000/ \
|
|
|
1165
1173
|
## Authentication Example (curl)
|
|
1166
1174
|
|
|
1167
1175
|
```bash
|
|
1168
|
-
curl -sS http://127.0.0.1:8000/
|
|
1176
|
+
curl -sS http://127.0.0.1:8000/message:send \
|
|
1169
1177
|
-H 'content-type: application/json' \
|
|
1170
1178
|
-H "Authorization: Bearer ${DEMO_BEARER_TOKEN}" \
|
|
1171
1179
|
-d '{
|
|
@@ -1199,7 +1207,7 @@ curl -sS http://127.0.0.1:8000/ \
|
|
|
1199
1207
|
|
|
1200
1208
|
## Streaming Re-Subscription (`subscribe`)
|
|
1201
1209
|
|
|
1202
|
-
If an SSE connection drops, use `GET /
|
|
1210
|
+
If an SSE connection drops, use `GET /tasks/{task_id}:subscribe` to re-subscribe while the task is still non-terminal.
|
|
1203
1211
|
|
|
1204
1212
|
Terminal-task note:
|
|
1205
1213
|
|
|
@@ -8,7 +8,7 @@ This document describes the internal structure, module boundaries, and request c
|
|
|
8
8
|
flowchart TD
|
|
9
9
|
subgraph Inbound["Server Layer (src/codex_a2a/server/)"]
|
|
10
10
|
App["application.py (FastAPI)"]
|
|
11
|
-
Routes["
|
|
11
|
+
Routes["SDK REST and Agent Card routes"]
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
subgraph Execution["Execution Layer (src/codex_a2a/execution/)"]
|
|
@@ -33,7 +33,7 @@ flowchart TD
|
|
|
33
33
|
|
|
34
34
|
### Inbound Message (Send/Stream)
|
|
35
35
|
|
|
36
|
-
1. **FastAPI Route**: `POST /
|
|
36
|
+
1. **FastAPI Route**: `POST /message:send` or `POST /message:stream` (or JSON-RPC equivalent).
|
|
37
37
|
2. **Handler**: Validates auth and maps transport-specific payloads into `RequestContext`.
|
|
38
38
|
3. **Executor (`CodexAgentExecutor.execute`)**:
|
|
39
39
|
- Maps A2A parts to Codex-compatible items.
|
codex_a2a-1.2.0/mypy.ini
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[mypy]
|
|
2
|
+
python_version = 3.11
|
|
3
|
+
files = src/codex_a2a, tests/client/test_agent_card.py, tests/client/test_errors.py, tests/client/test_lifecycle.py, tests/client/test_payload_text.py, tests/client/test_request_context.py, tests/config/test_settings.py, tests/contracts/test_extension_contract_consistency.py, tests/contracts/test_extension_registry.py, tests/execution/test_agent_errors.py, tests/execution/test_cancellation.py, tests/execution/test_directory_validation.py, tests/execution/test_metrics.py, tests/execution/test_request_metadata.py, tests/execution/test_session_persistence.py, tests/execution/test_session_runtime.py, tests/execution/test_stream_chunks.py, tests/execution/test_stream_interrupts.py, tests/execution/test_tool_call_payloads.py, tests/jsonrpc/test_codex_discovery_extension.py, tests/jsonrpc/test_codex_exec_extension.py, tests/jsonrpc/test_codex_session_extension.py, tests/jsonrpc/test_codex_thread_lifecycle_extension.py, tests/jsonrpc/test_codex_turn_review_extension.py, tests/jsonrpc/test_dispatch.py, tests/jsonrpc/test_guard_hooks.py, tests/jsonrpc/test_interrupt_params.py, tests/jsonrpc/test_jsonrpc_models.py, tests/jsonrpc/test_protocol_payload_mapping.py, tests/package/test_logging.py, tests/package/test_publish_github_release_script.py, tests/package/test_release_distribution_contract.py, tests/package/test_typing_contract.py, tests/package/test_version.py, tests/profile/test_profile.py, tests/scripts/test_audit_low_call_sites.py, tests/scripts/test_script_health_contract.py, tests/scripts/test_tck_auth_plugin.py, tests/server/test_agent_card.py, tests/server/test_auth.py, tests/server/test_call_context_builder.py, tests/server/test_cli.py, tests/server/test_database.py, tests/server/test_database_app_persistence.py, tests/server/test_migrations.py, tests/server/test_output_negotiation.py, tests/server/test_push_config_store.py, tests/server/test_request_handler.py, tests/server/test_runtime_limits.py, tests/server/test_runtime_state.py, tests/support/context.py, tests/support/dummy_clients.py, tests/support/fixtures.py, tests/support/http_auth.py, tests/support/jsonrpc_errors.py, tests/support/settings.py, tests/test_a2a_proto.py, tests/test_input_mapping.py, tests/test_protocol_versions.py, tests/upstream/test_interrupt_bridge.py, tests/upstream/test_interrupt_persistence.py, tests/upstream/test_request_mapping.py
|
|
4
|
+
mypy_path = src
|
|
5
|
+
follow_imports = silent
|
|
6
|
+
warn_unused_ignores = True
|
|
7
|
+
warn_redundant_casts = True
|
|
8
|
+
show_error_codes = True
|
|
9
|
+
|
|
10
|
+
[mypy-a2a.*]
|
|
11
|
+
ignore_missing_imports = True
|
|
12
|
+
|
|
13
|
+
[mypy-setuptools_scm]
|
|
14
|
+
ignore_missing_imports = True
|
|
@@ -20,23 +20,21 @@ classifiers = [
|
|
|
20
20
|
"Programming Language :: Python :: 3.11",
|
|
21
21
|
"Programming Language :: Python :: 3.12",
|
|
22
22
|
"Programming Language :: Python :: 3.13",
|
|
23
|
+
"Programming Language :: Python :: 3.14",
|
|
23
24
|
"Framework :: FastAPI",
|
|
24
25
|
"Topic :: Internet :: WWW/HTTP",
|
|
25
26
|
]
|
|
26
27
|
dependencies = [
|
|
27
|
-
"a2a-sdk==1.1.
|
|
28
|
+
"a2a-sdk==1.1.2",
|
|
28
29
|
"aiosqlite>=0.20,<1.0",
|
|
29
|
-
"fastapi>=0.121,<0.
|
|
30
|
+
"fastapi>=0.121,<0.142",
|
|
30
31
|
"httpx>=0.28.1,<0.29",
|
|
31
32
|
"protobuf>=6.33.5,<7.0",
|
|
32
|
-
"pyasn1>=0.6.3,<1.0",
|
|
33
|
-
"python-dotenv>=1.2.2,<2.0",
|
|
34
33
|
"pydantic>=2.6,<3.0",
|
|
35
34
|
"pydantic-settings>=2.2,<3.0",
|
|
36
|
-
"requests>=2.33.0,<3.0",
|
|
37
35
|
"sqlalchemy>=2.0,<3.0",
|
|
38
36
|
"sse-starlette>=2.1,<4.0",
|
|
39
|
-
"uvicorn>=0.29,<0.
|
|
37
|
+
"uvicorn>=0.29,<0.53",
|
|
40
38
|
]
|
|
41
39
|
|
|
42
40
|
[project.optional-dependencies]
|
|
@@ -47,8 +45,9 @@ dev = [
|
|
|
47
45
|
"pytest>=8.0",
|
|
48
46
|
"pytest-asyncio>=0.23",
|
|
49
47
|
"pytest-cov>=5.0,<8.0",
|
|
48
|
+
"diff-cover>=9,<10",
|
|
50
49
|
"ruff>=0.5",
|
|
51
|
-
"mypy>=1.11,<2.
|
|
50
|
+
"mypy>=1.11,<2.4",
|
|
52
51
|
]
|
|
53
52
|
|
|
54
53
|
[project.scripts]
|
|
@@ -67,7 +66,13 @@ line-length = 100
|
|
|
67
66
|
src = ["src"]
|
|
68
67
|
|
|
69
68
|
[tool.ruff.lint]
|
|
70
|
-
select = ["E", "F", "I", "B", "UP"]
|
|
69
|
+
select = ["E", "F", "I", "B", "UP", "S", "C90"]
|
|
70
|
+
|
|
71
|
+
[tool.ruff.lint.mccabe]
|
|
72
|
+
max-complexity = 25
|
|
73
|
+
|
|
74
|
+
[tool.ruff.lint.per-file-ignores]
|
|
75
|
+
"tests/**" = ["S"]
|
|
71
76
|
|
|
72
77
|
[tool.ruff.format]
|
|
73
78
|
quote-style = "double"
|
|
@@ -83,12 +88,12 @@ fallback_version = "0.0.0+unknown"
|
|
|
83
88
|
tag_regex = "^v?(?P<version>.+)$"
|
|
84
89
|
|
|
85
90
|
[tool.pytest.ini_options]
|
|
86
|
-
addopts = "--cov=src/codex_a2a --cov-branch --cov-report=term-missing:skip-covered"
|
|
91
|
+
addopts = "--cov=src/codex_a2a --cov-branch --cov-report=term-missing:skip-covered --cov-report=xml"
|
|
87
92
|
filterwarnings = [
|
|
88
93
|
"ignore:'HTTP_413_REQUEST_ENTITY_TOO_LARGE' is deprecated. Use 'HTTP_413_CONTENT_TOO_LARGE' instead.:DeprecationWarning:a2a\\.server\\.apps\\.jsonrpc\\.fastapi_app",
|
|
89
94
|
]
|
|
90
95
|
|
|
91
96
|
[tool.coverage.report]
|
|
92
|
-
fail_under =
|
|
97
|
+
fail_under = 84
|
|
93
98
|
show_missing = true
|
|
94
99
|
skip_covered = true
|
|
@@ -19,6 +19,7 @@ This document only explains the remaining repository-local maintainer scripts. U
|
|
|
19
19
|
- [`scripts/conformance.sh`](./conformance.sh): run the official A2A TCK as a local/manual external compatibility experiment.
|
|
20
20
|
- [`scripts/dependency_health.sh`](./dependency_health.sh): run the standalone dependency review flow (`sync`/`pip check`, outdated package listing, and dev vulnerability audit).
|
|
21
21
|
- [`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.
|
|
22
|
+
- [`scripts/smoke_test_live_codex.sh`](./smoke_test_live_codex.sh): initialize and close a real locally installed Codex app-server without making a model request.
|
|
22
23
|
- [`scripts/sync_codex_docs.sh`](./sync_codex_docs.sh): refresh local upstream Codex reference snapshots when maintainers need them.
|
|
23
24
|
|
|
24
25
|
## Release Recovery
|
|
@@ -15,7 +15,8 @@ Purpose:
|
|
|
15
15
|
This script is intentionally separate from validate_baseline.sh and CI gates.
|
|
16
16
|
|
|
17
17
|
Category:
|
|
18
|
-
Defaults to "mandatory"
|
|
18
|
+
Defaults to "mandatory", which aliases the current TCK "must" level.
|
|
19
|
+
The current runner also accepts "must", "should", and "may".
|
|
19
20
|
|
|
20
21
|
Selected environment variables:
|
|
21
22
|
CONFORMANCE_OUTPUT_DIR Override artifact directory (default: run/conformance/<timestamp>)
|
|
@@ -156,12 +157,18 @@ json_report_name="pytest-${category}.json"
|
|
|
156
157
|
set +e
|
|
157
158
|
(
|
|
158
159
|
cd "${tck_dir}"
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
if uv run python - <<'PY'
|
|
161
|
+
import run_tck
|
|
162
|
+
|
|
163
|
+
raise SystemExit(0 if hasattr(run_tck, "run_test_category") else 1)
|
|
164
|
+
PY
|
|
165
|
+
then
|
|
166
|
+
CONFORMANCE_CATEGORY="${category}" \
|
|
167
|
+
CONFORMANCE_SUT_URL="${sut_url}" \
|
|
168
|
+
CONFORMANCE_JSON_REPORT_NAME="${json_report_name}" \
|
|
169
|
+
CONFORMANCE_TRANSPORT_STRATEGY="${transport_strategy}" \
|
|
170
|
+
CONFORMANCE_TRANSPORTS="${transports}" \
|
|
171
|
+
uv run python - <<'PY'
|
|
165
172
|
from __future__ import annotations
|
|
166
173
|
|
|
167
174
|
import os
|
|
@@ -181,6 +188,28 @@ raise SystemExit(
|
|
|
181
188
|
)
|
|
182
189
|
)
|
|
183
190
|
PY
|
|
191
|
+
else
|
|
192
|
+
case "${category}" in
|
|
193
|
+
mandatory | must)
|
|
194
|
+
level="must"
|
|
195
|
+
;;
|
|
196
|
+
should | may)
|
|
197
|
+
level="${category}"
|
|
198
|
+
;;
|
|
199
|
+
*)
|
|
200
|
+
echo "Unsupported current TCK level: ${category}" >&2
|
|
201
|
+
exit 2
|
|
202
|
+
;;
|
|
203
|
+
esac
|
|
204
|
+
normalized_transports="${transports//http-json/http_json}"
|
|
205
|
+
PYTHONPATH="${ROOT_DIR}${PYTHONPATH:+:${PYTHONPATH}}" \
|
|
206
|
+
uv run python run_tck.py \
|
|
207
|
+
--sut-host "${sut_url}" \
|
|
208
|
+
--level "${level}" \
|
|
209
|
+
--transport "${normalized_transports}" \
|
|
210
|
+
--verbose-log \
|
|
211
|
+
-- -p scripts.tck_auth_plugin
|
|
212
|
+
fi
|
|
184
213
|
) 2>&1 | tee "${tck_log}"
|
|
185
214
|
tck_exit="${PIPESTATUS[0]}"
|
|
186
215
|
set -e
|
|
@@ -189,6 +218,11 @@ report_path="${tck_dir}/reports/${json_report_name}"
|
|
|
189
218
|
if [[ -f "${report_path}" ]]; then
|
|
190
219
|
cp "${report_path}" "${output_dir}/pytest-report.json"
|
|
191
220
|
fi
|
|
221
|
+
for report_name in compatibility.json compatibility.html tck_report.html junitreport.xml; do
|
|
222
|
+
if [[ -f "${tck_dir}/reports/${report_name}" ]]; then
|
|
223
|
+
cp "${tck_dir}/reports/${report_name}" "${output_dir}/${report_name}"
|
|
224
|
+
fi
|
|
225
|
+
done
|
|
192
226
|
|
|
193
227
|
CONFORMANCE_CATEGORY="${category}" \
|
|
194
228
|
CONFORMANCE_OUTPUT_DIR="${output_dir}" \
|