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.
Files changed (219) hide show
  1. codex_a2a-0.7.1/.github/dependabot.yml +16 -0
  2. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.github/workflows/ci.yml +2 -2
  3. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.github/workflows/dependency-health.yml +1 -1
  4. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.github/workflows/publish.yml +5 -5
  5. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/PKG-INFO +8 -7
  6. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/README.md +1 -0
  7. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/architecture.md +1 -0
  8. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/compatibility.md +3 -0
  9. codex_a2a-0.7.1/docs/conformance-triage.md +49 -0
  10. codex_a2a-0.7.1/docs/conformance.md +78 -0
  11. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/guide.md +3 -1
  12. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/pyproject.toml +6 -6
  13. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/README.md +5 -0
  14. codex_a2a-0.7.1/scripts/conformance.sh +252 -0
  15. codex_a2a-0.7.1/scripts/doctor.sh +7 -0
  16. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/__init__.py +2 -0
  17. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/auth.py +20 -0
  18. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/client.py +14 -1
  19. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/config.py +1 -0
  20. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/payload_text.py +11 -1
  21. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/config.py +20 -0
  22. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/contracts/extensions.py +40 -0
  23. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/discovery_runtime.py +6 -17
  24. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/output_mapping.py +17 -9
  25. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/review_runtime.py +5 -17
  26. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_interrupts.py +33 -69
  27. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/thread_lifecycle_runtime.py +5 -17
  28. codex_a2a-0.7.1/src/codex_a2a/execution/watch_events.py +35 -0
  29. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/application.py +15 -4
  30. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/control_params.py +3 -31
  31. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_payload_mapping.py +4 -25
  32. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_query.py +9 -21
  33. codex_a2a-0.7.1/src/codex_a2a/jsonrpc/errors.py +377 -0
  34. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/exec_control.py +14 -28
  35. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_params.py +3 -15
  36. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupts.py +13 -26
  37. codex_a2a-0.7.1/src/codex_a2a/jsonrpc/owner_guard.py +40 -0
  38. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/params_common.py +39 -0
  39. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/review_control.py +12 -18
  40. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/session_control.py +12 -25
  41. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/session_query.py +7 -17
  42. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/thread_lifecycle_control.py +14 -51
  43. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/thread_lifecycle_params.py +3 -15
  44. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/turn_control.py +12 -17
  45. codex_a2a-0.7.1/src/codex_a2a/payload_helpers.py +52 -0
  46. codex_a2a-0.7.1/src/codex_a2a/protocol_versions.py +188 -0
  47. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/agent_card.py +4 -0
  48. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/http_middlewares.py +183 -0
  49. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/openapi.py +4 -0
  50. codex_a2a-0.7.1/src/codex_a2a/upstream/discovery_payloads.py +33 -0
  51. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/interrupts.py +16 -55
  52. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/notification_mapping.py +10 -24
  53. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/stream_bridge.py +2 -27
  54. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/PKG-INFO +8 -7
  55. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/SOURCES.txt +11 -0
  56. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/requires.txt +6 -6
  57. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_client_flow.py +53 -0
  58. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/config/test_settings.py +28 -0
  59. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/contracts/test_extension_contract_consistency.py +3 -0
  60. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_thread_lifecycle_runtime.py +6 -6
  61. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_release_distribution_contract.py +3 -0
  62. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/scripts/test_script_health_contract.py +33 -0
  63. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_agent_card.py +23 -0
  64. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_transport_contract.py +117 -1
  65. codex_a2a-0.7.1/tests/test_protocol_versions.py +83 -0
  66. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/uv.lock +235 -125
  67. codex_a2a-0.6.2/src/codex_a2a/jsonrpc/errors.py +0 -131
  68. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.gitignore +0 -0
  69. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.pre-commit-config.yaml +0 -0
  70. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/.secrets.baseline +0 -0
  71. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/AGENTS.md +0 -0
  72. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/CONTRIBUTING.md +0 -0
  73. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/LICENSE +0 -0
  74. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/SECURITY.md +0 -0
  75. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/extension-specifications.md +0 -0
  76. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/docs/maintainer-architecture.md +0 -0
  77. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/mypy.ini +0 -0
  78. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/dependency_health.sh +0 -0
  79. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/health_common.sh +0 -0
  80. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/publish_github_release.sh +0 -0
  81. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/smoke_test_built_cli.sh +0 -0
  82. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/sync_codex_docs.sh +0 -0
  83. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/validate_baseline.sh +0 -0
  84. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/scripts/validate_runtime_matrix.sh +0 -0
  85. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/setup.cfg +0 -0
  86. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/__init__.py +0 -0
  87. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/auth.py +0 -0
  88. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/cli.py +0 -0
  89. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/agent_card.py +0 -0
  90. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/errors.py +0 -0
  91. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/manager.py +0 -0
  92. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/request_context.py +0 -0
  93. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/client/types.py +0 -0
  94. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/contracts/__init__.py +0 -0
  95. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/contracts/runtime_output.py +0 -0
  96. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/__init__.py +0 -0
  97. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/cancellation.py +0 -0
  98. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/directory_policy.py +0 -0
  99. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/exec_runtime.py +0 -0
  100. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/executor.py +0 -0
  101. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/request_metadata.py +0 -0
  102. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/request_overrides.py +0 -0
  103. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/response_emitter.py +0 -0
  104. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/session_runtime.py +0 -0
  105. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_chunks.py +0 -0
  106. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_processor.py +0 -0
  107. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/stream_state.py +0 -0
  108. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/streaming.py +0 -0
  109. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/execution/tool_call_payloads.py +0 -0
  110. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/input_mapping.py +0 -0
  111. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/__init__.py +0 -0
  112. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_control.py +0 -0
  113. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/discovery_params.py +0 -0
  114. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/dispatch.py +0 -0
  115. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/hooks.py +0 -0
  116. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_lifecycle.py +0 -0
  117. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_recovery.py +0 -0
  118. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/interrupt_recovery_params.py +0 -0
  119. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/params.py +0 -0
  120. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/payload_mapping.py +0 -0
  121. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/query_params.py +0 -0
  122. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/review_control_params.py +0 -0
  123. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/jsonrpc/turn_control_params.py +0 -0
  124. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/logging_context.py +0 -0
  125. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/media_modes.py +0 -0
  126. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/metrics.py +0 -0
  127. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/parts/text.py +0 -0
  128. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/profile/__init__.py +0 -0
  129. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/profile/runtime.py +0 -0
  130. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/py.typed +0 -0
  131. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/__init__.py +0 -0
  132. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/application.py +0 -0
  133. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/call_context.py +0 -0
  134. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/database.py +0 -0
  135. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/migrations.py +0 -0
  136. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/output_negotiation.py +0 -0
  137. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/request_handler.py +0 -0
  138. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/runtime_state.py +0 -0
  139. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/server/task_store.py +0 -0
  140. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/__init__.py +0 -0
  141. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/client.py +0 -0
  142. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/conversation_facade.py +0 -0
  143. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/exec_facade.py +0 -0
  144. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/interrupt_bridge.py +0 -0
  145. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/models.py +0 -0
  146. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/request_mapping.py +0 -0
  147. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/startup.py +0 -0
  148. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a/upstream/transport.py +0 -0
  149. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/dependency_links.txt +0 -0
  150. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/entry_points.txt +0 -0
  151. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/src/codex_a2a.egg-info/top_level.txt +0 -0
  152. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/__init__.py +0 -0
  153. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/__init__.py +0 -0
  154. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_agent_card.py +0 -0
  155. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_cli.py +0 -0
  156. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_client_manager.py +0 -0
  157. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_errors.py +0 -0
  158. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_lifecycle.py +0 -0
  159. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_payload_text.py +0 -0
  160. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_request_context.py +0 -0
  161. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/client/test_types.py +0 -0
  162. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/config/__init__.py +0 -0
  163. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/contracts/__init__.py +0 -0
  164. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/__init__.py +0 -0
  165. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_agent_errors.py +0 -0
  166. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_cancellation.py +0 -0
  167. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_codex_agent_session_binding.py +0 -0
  168. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_directory_validation.py +0 -0
  169. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_discovery_exec_runtime.py +0 -0
  170. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_metrics.py +0 -0
  171. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_review_runtime.py +0 -0
  172. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_session_ownership.py +0 -0
  173. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_session_persistence.py +0 -0
  174. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_session_runtime.py +0 -0
  175. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_stream_chunks.py +0 -0
  176. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_stream_interrupts.py +0 -0
  177. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_streaming_output_contract.py +0 -0
  178. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/execution/test_tool_call_payloads.py +0 -0
  179. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/fixtures/codex_app_server/command_execution_output_delta.json +0 -0
  180. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/fixtures/codex_app_server/file_change_output_delta.json +0 -0
  181. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/__init__.py +0 -0
  182. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_discovery_extension.py +0 -0
  183. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_exec_extension.py +0 -0
  184. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_session_extension.py +0 -0
  185. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_thread_lifecycle_extension.py +0 -0
  186. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_codex_turn_review_extension.py +0 -0
  187. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_dispatch.py +0 -0
  188. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_guard_hooks.py +0 -0
  189. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/jsonrpc/test_jsonrpc_models.py +0 -0
  190. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/__init__.py +0 -0
  191. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_logging.py +0 -0
  192. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_publish_github_release_script.py +0 -0
  193. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_typing_contract.py +0 -0
  194. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/package/test_version.py +0 -0
  195. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/parts/__init__.py +0 -0
  196. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/parts/test_text.py +0 -0
  197. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/profile/__init__.py +0 -0
  198. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/profile/test_profile.py +0 -0
  199. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/scripts/__init__.py +0 -0
  200. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/__init__.py +0 -0
  201. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_auth.py +0 -0
  202. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_call_context_builder.py +0 -0
  203. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_cli.py +0 -0
  204. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_database.py +0 -0
  205. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_database_app_persistence.py +0 -0
  206. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_migrations.py +0 -0
  207. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_request_handler.py +0 -0
  208. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_runtime_state.py +0 -0
  209. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/server/test_task_store.py +0 -0
  210. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/__init__.py +0 -0
  211. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/context.py +0 -0
  212. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/dummy_clients.py +0 -0
  213. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/fixtures.py +0 -0
  214. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/support/settings.py +0 -0
  215. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/test_input_mapping.py +0 -0
  216. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/upstream/__init__.py +0 -0
  217. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/upstream/test_codex_client_params.py +0 -0
  218. {codex_a2a-0.6.2 → codex_a2a-0.7.1}/tests/upstream/test_interrupt_persistence.py +0 -0
  219. {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@v5
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@v5
47
+ uses: actions/checkout@v6
48
48
 
49
49
  - name: Setup Python
50
50
  uses: actions/setup-python@v6
@@ -16,7 +16,7 @@ jobs:
16
16
 
17
17
  steps:
18
18
  - name: Checkout
19
- uses: actions/checkout@v5
19
+ uses: actions/checkout@v6
20
20
 
21
21
  - name: Setup Python
22
22
  uses: actions/setup-python@v6
@@ -28,7 +28,7 @@ jobs:
28
28
 
29
29
  steps:
30
30
  - name: Checkout
31
- uses: actions/checkout@v5
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@v4
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@v5
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@v5
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@v5
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.6.2
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
25
+ Requires-Dist: a2a-sdk==0.3.26
26
26
  Requires-Dist: aiosqlite<1.0,>=0.20
27
- Requires-Dist: fastapi<0.122,>=0.121
27
+ Requires-Dist: fastapi<0.136,>=0.121
28
28
  Requires-Dist: httpx<0.29,>=0.28.1
29
- Requires-Dist: protobuf<7.0,>=6.33.5
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<3.0,>=2.1
36
- Requires-Dist: uvicorn<0.30,>=0.29
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.12,>=1.11; extra == "dev"
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.25",
27
+ "a2a-sdk==0.3.26",
28
28
  "aiosqlite>=0.20,<1.0",
29
- "fastapi>=0.121,<0.122",
29
+ "fastapi>=0.121,<0.136",
30
30
  "httpx>=0.28.1,<0.29",
31
- "protobuf>=6.33.5,<7.0",
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,<3.0",
38
- "uvicorn>=0.29,<0.30",
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.12",
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}"
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bash
2
+ # Run the default repository validation entrypoint.
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+
7
+ exec bash "${SCRIPT_DIR}/validate_baseline.sh" "$@"
@@ -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",