codex-a2a 1.1.0__tar.gz → 1.1.2__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 (237) hide show
  1. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/.github/dependabot.yml +7 -0
  2. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/.github/workflows/publish.yml +5 -1
  3. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/AGENTS.md +2 -0
  4. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/PKG-INFO +9 -9
  5. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/README.md +6 -6
  6. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/pyproject.toml +2 -2
  7. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/dependency_health.sh +3 -2
  8. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/validate_baseline.sh +5 -1
  9. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/cli.py +15 -14
  10. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/exec_runtime.py +7 -4
  11. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/response_emitter.py +3 -6
  12. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/stream_processor.py +2 -2
  13. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/stream_state.py +0 -22
  14. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/streaming.py +0 -2
  15. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/interrupts.py +16 -11
  16. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/client.py +30 -6
  17. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/interrupt_bridge.py +10 -11
  18. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/interrupts.py +3 -2
  19. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/request_mapping.py +0 -32
  20. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a.egg-info/PKG-INFO +9 -9
  21. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a.egg-info/SOURCES.txt +3 -0
  22. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a.egg-info/requires.txt +2 -2
  23. codex_a2a-1.1.2/tests/client/test_cli.py +293 -0
  24. codex_a2a-1.1.2/tests/jsonrpc/test_interrupt_params.py +82 -0
  25. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_interrupt_protocol_handlers.py +126 -0
  26. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/package/test_release_distribution_contract.py +1 -0
  27. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/scripts/test_script_health_contract.py +8 -0
  28. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_cli.py +24 -12
  29. codex_a2a-1.1.2/tests/server/test_output_negotiation.py +98 -0
  30. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/upstream/test_codex_client_params.py +89 -0
  31. codex_a2a-1.1.2/tests/upstream/test_interrupt_bridge.py +316 -0
  32. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/upstream/test_request_mapping.py +0 -34
  33. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/uv.lock +338 -302
  34. codex_a2a-1.1.0/tests/client/test_cli.py +0 -144
  35. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/.github/workflows/ci.yml +0 -0
  36. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/.github/workflows/dependency-health.yml +0 -0
  37. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/.gitignore +0 -0
  38. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/.pre-commit-config.yaml +0 -0
  39. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/.secrets.baseline +0 -0
  40. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/CONTRIBUTING.md +0 -0
  41. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/LICENSE +0 -0
  42. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/SECURITY.md +0 -0
  43. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/a2a-extension-baseline.md +0 -0
  44. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/architecture.md +0 -0
  45. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/compatibility.md +0 -0
  46. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/conformance-triage.md +0 -0
  47. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/conformance.md +0 -0
  48. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/extension-specifications.md +0 -0
  49. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/guide.md +0 -0
  50. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/docs/maintainer-architecture.md +0 -0
  51. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/mypy.ini +0 -0
  52. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/README.md +0 -0
  53. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/audit_low_call_sites.py +0 -0
  54. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/check_dead_code.py +0 -0
  55. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/conformance.sh +0 -0
  56. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/health_common.sh +0 -0
  57. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/publish_github_release.sh +0 -0
  58. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/smoke_test_built_cli.sh +0 -0
  59. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/sync_codex_docs.sh +0 -0
  60. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/scripts/validate_runtime_matrix.sh +0 -0
  61. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/setup.cfg +0 -0
  62. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/__init__.py +0 -0
  63. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/a2a_proto.py +0 -0
  64. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/auth.py +0 -0
  65. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/__init__.py +0 -0
  66. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/agent_card.py +0 -0
  67. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/auth.py +0 -0
  68. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/client.py +0 -0
  69. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/config.py +0 -0
  70. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/errors.py +0 -0
  71. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/extension_negotiation.py +0 -0
  72. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/manager.py +0 -0
  73. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/payload_text.py +0 -0
  74. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/client/request_context.py +0 -0
  75. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/config.py +0 -0
  76. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/contracts/__init__.py +0 -0
  77. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/contracts/extension_registry.py +0 -0
  78. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/contracts/extension_specs.py +0 -0
  79. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/contracts/extensions.py +0 -0
  80. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/contracts/runtime_output.py +0 -0
  81. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/__init__.py +0 -0
  82. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/discovery_runtime.py +0 -0
  83. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/executor.py +0 -0
  84. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/output_mapping.py +0 -0
  85. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/request_metadata.py +0 -0
  86. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/request_overrides.py +0 -0
  87. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/review_runtime.py +0 -0
  88. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/session_runtime.py +0 -0
  89. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/stream_chunks.py +0 -0
  90. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/stream_interrupts.py +0 -0
  91. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/thread_lifecycle_runtime.py +0 -0
  92. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/tool_call_payloads.py +0 -0
  93. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/execution/watch_events.py +0 -0
  94. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/input_mapping.py +0 -0
  95. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/__init__.py +0 -0
  96. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/application.py +0 -0
  97. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/discovery_control.py +0 -0
  98. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/discovery_params.py +0 -0
  99. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/discovery_payload_mapping.py +0 -0
  100. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/discovery_query.py +0 -0
  101. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/dispatch.py +0 -0
  102. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/errors.py +0 -0
  103. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/exec_control.py +0 -0
  104. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/exec_control_params.py +0 -0
  105. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/hooks.py +0 -0
  106. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/interrupt_lifecycle.py +0 -0
  107. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/interrupt_params.py +0 -0
  108. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/interrupt_recovery.py +0 -0
  109. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/interrupt_recovery_params.py +0 -0
  110. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/owner_guard.py +0 -0
  111. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/params.py +0 -0
  112. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/params_common.py +0 -0
  113. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/payload_mapping.py +0 -0
  114. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/query_params.py +0 -0
  115. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/request_models.py +0 -0
  116. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/review_control.py +0 -0
  117. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/review_control_params.py +0 -0
  118. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/session_query.py +0 -0
  119. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/thread_lifecycle_control.py +0 -0
  120. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/thread_lifecycle_params.py +0 -0
  121. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/turn_control.py +0 -0
  122. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/jsonrpc/turn_control_params.py +0 -0
  123. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/logging_context.py +0 -0
  124. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/media_modes.py +0 -0
  125. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/metrics.py +0 -0
  126. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/parts/text.py +0 -0
  127. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/payload_helpers.py +0 -0
  128. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/profile/__init__.py +0 -0
  129. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/profile/runtime.py +0 -0
  130. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/protocol_versions.py +0 -0
  131. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/py.typed +0 -0
  132. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/__init__.py +0 -0
  133. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/agent_card.py +0 -0
  134. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/application.py +0 -0
  135. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/call_context.py +0 -0
  136. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/database.py +0 -0
  137. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/http_middlewares.py +0 -0
  138. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/migrations.py +0 -0
  139. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/openapi.py +0 -0
  140. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/openapi_contract_fragments.py +0 -0
  141. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/output_negotiation.py +0 -0
  142. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/push_config_store.py +0 -0
  143. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/request_handler.py +0 -0
  144. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/runtime_state.py +0 -0
  145. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/runtime_state_schema.py +0 -0
  146. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/server/task_store.py +0 -0
  147. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/__init__.py +0 -0
  148. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/conversation_facade.py +0 -0
  149. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/discovery_payloads.py +0 -0
  150. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/models.py +0 -0
  151. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/notification_mapping.py +0 -0
  152. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/startup.py +0 -0
  153. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/stream_bridge.py +0 -0
  154. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a/upstream/transport.py +0 -0
  155. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a.egg-info/dependency_links.txt +0 -0
  156. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a.egg-info/entry_points.txt +0 -0
  157. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/src/codex_a2a.egg-info/top_level.txt +0 -0
  158. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/__init__.py +0 -0
  159. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/__init__.py +0 -0
  160. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/test_agent_card.py +0 -0
  161. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/test_client_flow.py +0 -0
  162. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/test_client_manager.py +0 -0
  163. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/test_errors.py +0 -0
  164. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/test_lifecycle.py +0 -0
  165. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/test_payload_text.py +0 -0
  166. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/client/test_request_context.py +0 -0
  167. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/config/__init__.py +0 -0
  168. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/config/test_settings.py +0 -0
  169. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/contracts/__init__.py +0 -0
  170. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/contracts/test_extension_contract_consistency.py +0 -0
  171. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/contracts/test_extension_registry.py +0 -0
  172. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/__init__.py +0 -0
  173. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_agent_errors.py +0 -0
  174. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_cancellation.py +0 -0
  175. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_codex_agent_session_binding.py +0 -0
  176. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_directory_validation.py +0 -0
  177. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_discovery_exec_runtime.py +0 -0
  178. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_metrics.py +0 -0
  179. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_request_metadata.py +0 -0
  180. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_review_runtime.py +0 -0
  181. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_session_ownership.py +0 -0
  182. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_session_persistence.py +0 -0
  183. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_session_runtime.py +0 -0
  184. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_stream_chunks.py +0 -0
  185. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_stream_interrupts.py +0 -0
  186. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_streaming_output_contract.py +0 -0
  187. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_thread_lifecycle_runtime.py +0 -0
  188. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/execution/test_tool_call_payloads.py +0 -0
  189. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/fixtures/codex_app_server/command_execution_output_delta.json +0 -0
  190. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/fixtures/codex_app_server/file_change_output_delta.json +0 -0
  191. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/__init__.py +0 -0
  192. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_codex_discovery_extension.py +0 -0
  193. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_codex_exec_extension.py +0 -0
  194. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_codex_session_extension.py +0 -0
  195. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_codex_thread_lifecycle_extension.py +0 -0
  196. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_codex_turn_review_extension.py +0 -0
  197. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_dispatch.py +0 -0
  198. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_guard_hooks.py +0 -0
  199. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_interrupt_lifecycle.py +0 -0
  200. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_jsonrpc_models.py +0 -0
  201. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/jsonrpc/test_protocol_payload_mapping.py +0 -0
  202. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/package/__init__.py +0 -0
  203. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/package/test_logging.py +0 -0
  204. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/package/test_publish_github_release_script.py +0 -0
  205. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/package/test_typing_contract.py +0 -0
  206. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/package/test_version.py +0 -0
  207. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/parts/__init__.py +0 -0
  208. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/parts/test_text.py +0 -0
  209. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/profile/__init__.py +0 -0
  210. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/profile/test_profile.py +0 -0
  211. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/scripts/__init__.py +0 -0
  212. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/scripts/test_audit_low_call_sites.py +0 -0
  213. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/__init__.py +0 -0
  214. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_agent_card.py +0 -0
  215. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_auth.py +0 -0
  216. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_call_context_builder.py +0 -0
  217. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_database.py +0 -0
  218. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_database_app_persistence.py +0 -0
  219. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_migrations.py +0 -0
  220. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_push_config_store.py +0 -0
  221. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_request_handler.py +0 -0
  222. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_runtime_state.py +0 -0
  223. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_task_store.py +0 -0
  224. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/server/test_transport_contract.py +0 -0
  225. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/support/__init__.py +0 -0
  226. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/support/context.py +0 -0
  227. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/support/dummy_clients.py +0 -0
  228. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/support/fixtures.py +0 -0
  229. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/support/http_auth.py +0 -0
  230. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/support/jsonrpc_errors.py +0 -0
  231. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/support/settings.py +0 -0
  232. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/test_a2a_proto.py +0 -0
  233. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/test_input_mapping.py +0 -0
  234. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/test_protocol_versions.py +0 -0
  235. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/upstream/__init__.py +0 -0
  236. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/upstream/test_interrupt_persistence.py +0 -0
  237. {codex_a2a-1.1.0 → codex_a2a-1.1.2}/tests/upstream/test_modular_upstream_components.py +0 -0
@@ -30,3 +30,10 @@ updates:
30
30
  uv-all-updates:
31
31
  patterns:
32
32
  - "*"
33
+ exclude-patterns:
34
+ # Keep build-system dependencies out of the grouped uv PR. In practice the
35
+ # grouped updater can lose previous-version metadata for setuptools-scm[toml],
36
+ # which causes the whole grouped change set to be dropped.
37
+ - "setuptools"
38
+ - "setuptools-scm"
39
+ - "setuptools-scm*"
@@ -52,7 +52,11 @@ jobs:
52
52
  --output-file /tmp/runtime-requirements.txt >/dev/null
53
53
 
54
54
  - name: Run runtime dependency vulnerability audit
55
- run: uv run pip-audit --requirement /tmp/runtime-requirements.txt
55
+ run: |
56
+ audit_cache_dir="$(mktemp -d)"
57
+ trap 'rm -rf "${audit_cache_dir}"' EXIT
58
+ XDG_CACHE_HOME="${audit_cache_dir}" \
59
+ uv run pip-audit --requirement /tmp/runtime-requirements.txt
56
60
 
57
61
  - name: Resolve release tag
58
62
  id: release_tag
@@ -29,6 +29,8 @@
29
29
  ## 4. 工具与文本规范
30
30
 
31
31
  - 读写 Issue/PR 使用 `gh` CLI,不通过网页手工编辑。
32
+ - 务必不要使用 Codex GitHub 连接器(包括但不限于任何 GitHub MCP / connector / app 方式);任何时候只允许通过 `gh` CLI 操作 Issue、PR、评论与相关元数据。
33
+ - 若 `gh` CLI 遇到权限、认证、网络策略或仓库策略障碍,必须停止继续尝试,并向人类说明阻塞点,由人类提供帮助或代为执行;不得改用 Codex GitHub 连接器兜底。
32
34
  - Issue、PR 与评论使用简体中文;专业术语可保留英文。
33
35
  - 多行正文先写入临时文件,再用 `--body-file` 传入;不要在 `--body` 中拼接 `\\n`。
34
36
  - 同仓引用使用 `#123` 自动链接;跨仓引用使用完整 URL。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-a2a
3
- Version: 1.1.0
3
+ Version: 1.1.2
4
4
  Summary: Codex A2A runtime adapter
5
5
  Author: liujuanjuan1984@Intelligent-Internet
6
6
  License-Expression: Apache-2.0
@@ -22,7 +22,7 @@ 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==1.0.2
25
+ Requires-Dist: a2a-sdk==1.1.0
26
26
  Requires-Dist: aiosqlite<1.0,>=0.20
27
27
  Requires-Dist: fastapi<0.137,>=0.121
28
28
  Requires-Dist: httpx<0.29,>=0.28.1
@@ -43,18 +43,18 @@ Requires-Dist: pytest>=8.0; extra == "dev"
43
43
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
44
44
  Requires-Dist: pytest-cov<8.0,>=5.0; extra == "dev"
45
45
  Requires-Dist: ruff>=0.5; extra == "dev"
46
- Requires-Dist: mypy<1.21,>=1.11; extra == "dev"
46
+ Requires-Dist: mypy<2.2,>=1.11; extra == "dev"
47
47
  Dynamic: license-file
48
48
 
49
49
  # codex-a2a
50
50
 
51
51
  ```text
52
- _ ___
53
- | | |__ \
54
- ___ ___ __| | _____ __ __ _ ) |__ _
55
- / __/ _ \ / _` |/ _ \ \/ / / _` | / // _` |
56
- | (_| (_) | (_| | __/> < | (_| |/ /| (_| |
57
- \___\___/ \__,_|\___/_/\_\ \__,_|____\__,_|
52
+ ██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗ █████╗ ██████╗ █████╗
53
+ ██╔════╝██╔═══██╗██╔══██╗██╔════╝╚██╗██╔╝ ██╔══██╗╚════██╗██╔══██╗
54
+ ██║ ██║ ██║██║ ██║█████╗ ╚███╔╝█████╗███████║ █████╔╝███████║
55
+ ██║ ██║ ██║██║ ██║██╔══╝ ██╔██╗╚════╝██╔══██║██╔═══╝ ██╔══██║
56
+ ╚██████╗╚██████╔╝██████╔╝███████╗██╔╝ ██╗ ██║ ██║███████╗██║ ██║
57
+ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
58
58
  ```
59
59
 
60
60
  > Expose Codex through A2A.
@@ -1,12 +1,12 @@
1
1
  # codex-a2a
2
2
 
3
3
  ```text
4
- _ ___
5
- | | |__ \
6
- ___ ___ __| | _____ __ __ _ ) |__ _
7
- / __/ _ \ / _` |/ _ \ \/ / / _` | / // _` |
8
- | (_| (_) | (_| | __/> < | (_| |/ /| (_| |
9
- \___\___/ \__,_|\___/_/\_\ \__,_|____\__,_|
4
+ ██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗ █████╗ ██████╗ █████╗
5
+ ██╔════╝██╔═══██╗██╔══██╗██╔════╝╚██╗██╔╝ ██╔══██╗╚════██╗██╔══██╗
6
+ ██║ ██║ ██║██║ ██║█████╗ ╚███╔╝█████╗███████║ █████╔╝███████║
7
+ ██║ ██║ ██║██║ ██║██╔══╝ ██╔██╗╚════╝██╔══██║██╔═══╝ ██╔══██║
8
+ ╚██████╗╚██████╔╝██████╔╝███████╗██╔╝ ██╗ ██║ ██║███████╗██║ ██║
9
+ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
10
10
  ```
11
11
 
12
12
  > Expose Codex through A2A.
@@ -24,7 +24,7 @@ classifiers = [
24
24
  "Topic :: Internet :: WWW/HTTP",
25
25
  ]
26
26
  dependencies = [
27
- "a2a-sdk==1.0.2",
27
+ "a2a-sdk==1.1.0",
28
28
  "aiosqlite>=0.20,<1.0",
29
29
  "fastapi>=0.121,<0.137",
30
30
  "httpx>=0.28.1,<0.29",
@@ -48,7 +48,7 @@ dev = [
48
48
  "pytest-asyncio>=0.23",
49
49
  "pytest-cov>=5.0,<8.0",
50
50
  "ruff>=0.5",
51
- "mypy>=1.11,<1.21",
51
+ "mypy>=1.11,<2.2",
52
52
  ]
53
53
 
54
54
  [project.scripts]
@@ -11,7 +11,8 @@ echo "[dependency-health] list outdated packages"
11
11
  uv pip list --outdated
12
12
 
13
13
  dev_requirements="$(mktemp)"
14
- trap 'rm -f "${dev_requirements}"' EXIT
14
+ audit_cache_dir="$(mktemp -d)"
15
+ trap 'rm -f "${dev_requirements}"; rm -rf "${audit_cache_dir}"' EXIT
15
16
 
16
17
  echo "[dependency-health] export dev extra requirements"
17
18
  uv export \
@@ -23,4 +24,4 @@ uv export \
23
24
  --output-file "${dev_requirements}" >/dev/null
24
25
 
25
26
  echo "[dependency-health] run dev dependency vulnerability audit"
26
- uv run pip-audit --requirement "${dev_requirements}"
27
+ XDG_CACHE_HOME="${audit_cache_dir}" uv run pip-audit --requirement "${dev_requirements}"
@@ -12,12 +12,16 @@ run_pip_audit() {
12
12
  local attempt=1
13
13
  local max_attempts=3
14
14
  local status=0
15
+ local audit_cache_dir=""
15
16
 
16
17
  while true; do
17
- if uv run pip-audit --requirement "${requirement_file}"; then
18
+ audit_cache_dir="$(mktemp -d)"
19
+ if XDG_CACHE_HOME="${audit_cache_dir}" uv run pip-audit --requirement "${requirement_file}"; then
20
+ rm -rf "${audit_cache_dir}"
18
21
  return 0
19
22
  fi
20
23
  status=$?
24
+ rm -rf "${audit_cache_dir}"
21
25
  if [[ "${attempt}" -ge "${max_attempts}" ]]; then
22
26
  echo "pip-audit failed after ${attempt} attempts" >&2
23
27
  return "${status}"
@@ -16,18 +16,20 @@ from .client.request_context import build_default_headers
16
16
 
17
17
  CLI_REPOSITORY_URL = "https://github.com/liujuanjuan1984/codex-a2a"
18
18
  CLI_BRAND_BANNER = (
19
- " _ ___ \n"
20
- " | | |__ \\ \n"
21
- " ___ ___ __| | _____ __ __ _ ) |__ _ \n"
22
- " / __/ _ \\ / _` |/ _ \\ \\/ / / _` | / // _` |\n"
23
- "| (_| (_) | (_| | __/> < | (_| |/ /| (_| |\n"
24
- " \\___\\___/ \\__,_|\\___/_/\\_\\ \\__,_|____\\__,_|"
19
+ " ██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗ █████╗ ██████╗ █████╗ \n"
20
+ "██╔════╝██╔═══██╗██╔══██╗██╔════╝╚██╗██╔╝ ██╔══██╗╚════██╗██╔══██╗\n"
21
+ "██║ ██║ ██║██║ ██║█████╗ ╚███╔╝█████╗███████║ █████╔╝███████║\n"
22
+ "██║ ██║ ██║██║ ██║██╔══╝ ██╔██╗╚════╝██╔══██║██╔═══╝ ██╔══██║\n"
23
+ "╚██████╗╚██████╔╝██████╔╝███████╗██╔╝ ██╗ ██║ ██║███████╗██║ ██║\n"
24
+ " ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝\n"
25
+ " "
25
26
  )
26
27
  ROOT_DESCRIPTION = (
27
28
  "Codex A2A runtime for explicit service startup and peer calls. "
28
29
  "A2A Protocol 1.0 only.\n"
29
30
  " codex-a2a <command> [arguments] [options]"
30
31
  )
32
+ SERVE_DESCRIPTION = "Run the Codex A2A service.\n codex-a2a serve"
31
33
  CODEX_SETUP_HELP = (
32
34
  "Codex runtime quick start:\n"
33
35
  " codex --version\n"
@@ -89,7 +91,7 @@ CALL_HELP = (
89
91
  " Outbound peer credentials are read from environment variables only.\n"
90
92
  " Service base URLs also work, but card URLs are the preferred example form."
91
93
  )
92
- ROOT_HELP_EPILOG = f"{CODEX_SETUP_HELP}\n\n{SERVE_ENVIRONMENT_HELP}\n\n{CALL_HELP}"
94
+ ROOT_HELP_EPILOG = f"{CODEX_SETUP_HELP}\n\n{CALL_HELP}"
93
95
 
94
96
 
95
97
  class CliHelpFormatter(
@@ -167,12 +169,6 @@ async def run_call(
167
169
  return 0
168
170
 
169
171
 
170
- def _serve_main() -> None:
171
- from .server.application import main as serve_main
172
-
173
- serve_main()
174
-
175
-
176
172
  def build_parser() -> argparse.ArgumentParser:
177
173
  parser = TopLevelArgumentParser(
178
174
  prog="codex-a2a",
@@ -201,6 +197,9 @@ def build_parser() -> argparse.ArgumentParser:
201
197
  subparsers.add_parser(
202
198
  "serve",
203
199
  help="Run the A2A service.",
200
+ description=SERVE_DESCRIPTION,
201
+ epilog=SERVE_ENVIRONMENT_HELP,
202
+ formatter_class=CliHelpFormatter,
204
203
  )
205
204
  call_parser = subparsers.add_parser(
206
205
  "call",
@@ -221,7 +220,9 @@ def main(argv: Sequence[str] | None = None) -> int:
221
220
 
222
221
  namespace = parser.parse_args(args)
223
222
  if namespace.command == "serve":
224
- _serve_main()
223
+ from .server.application import main as serve_main
224
+
225
+ serve_main()
225
226
  return 0
226
227
 
227
228
  if namespace.command is None:
@@ -19,9 +19,12 @@ from a2a.types import (
19
19
  )
20
20
 
21
21
  from codex_a2a.a2a_proto import new_text_part
22
- from codex_a2a.contracts.runtime_output import build_status_stream_metadata
22
+ from codex_a2a.contracts.runtime_output import (
23
+ build_status_stream_metadata,
24
+ build_stream_artifact_metadata,
25
+ )
23
26
  from codex_a2a.execution.output_mapping import enqueue_artifact_update
24
- from codex_a2a.execution.stream_state import BlockType, build_stream_artifact_metadata
27
+ from codex_a2a.execution.stream_state import BlockType
25
28
  from codex_a2a.upstream.request_mapping import format_exec_result_text
26
29
 
27
30
  logger = logging.getLogger(__name__)
@@ -305,7 +308,7 @@ class CodexExecRuntime:
305
308
  append=append.get(stream, False),
306
309
  last_chunk=bool(props.get("cap_reached", False)),
307
310
  artifact_metadata=build_stream_artifact_metadata(
308
- block_type=BlockType.TEXT,
311
+ block_type=BlockType.TEXT.value,
309
312
  source="codex.exec.output_delta",
310
313
  message_id=f"{task_id}:exec:{stream}",
311
314
  sequence=sequence,
@@ -349,7 +352,7 @@ class CodexExecRuntime:
349
352
  append=False,
350
353
  last_chunk=True,
351
354
  artifact_metadata=build_stream_artifact_metadata(
352
- block_type=BlockType.TEXT,
355
+ block_type=BlockType.TEXT.value,
353
356
  source="codex.exec.result",
354
357
  message_id=f"{handle.task_id}:exec:result",
355
358
  sequence=None,
@@ -11,16 +11,13 @@ from codex_a2a.a2a_proto import new_text_part
11
11
  from codex_a2a.contracts.runtime_output import (
12
12
  build_output_metadata,
13
13
  build_status_stream_metadata,
14
+ build_stream_artifact_metadata,
14
15
  )
15
16
  from codex_a2a.execution.output_mapping import (
16
17
  build_history,
17
18
  enqueue_artifact_update,
18
19
  )
19
- from codex_a2a.execution.stream_state import (
20
- BlockType,
21
- StreamOutputState,
22
- build_stream_artifact_metadata,
23
- )
20
+ from codex_a2a.execution.stream_state import BlockType, StreamOutputState
24
21
 
25
22
 
26
23
  async def emit_initial_task(
@@ -61,7 +58,7 @@ async def emit_streaming_completion(
61
58
  append=stream_state.emitted_stream_chunk,
62
59
  last_chunk=True,
63
60
  artifact_metadata=build_stream_artifact_metadata(
64
- block_type=BlockType.TEXT,
61
+ block_type=BlockType.TEXT.value,
65
62
  source="final_snapshot",
66
63
  message_id=resolved_message_id,
67
64
  sequence=sequence,
@@ -14,6 +14,7 @@ from codex_a2a.contracts.runtime_output import (
14
14
  build_interrupt_metadata,
15
15
  build_output_metadata,
16
16
  build_status_stream_metadata,
17
+ build_stream_artifact_metadata,
17
18
  )
18
19
  from codex_a2a.execution.output_mapping import (
19
20
  enqueue_artifact_update,
@@ -43,7 +44,6 @@ from codex_a2a.execution.stream_state import (
43
44
  PendingDelta,
44
45
  StreamOutputState,
45
46
  StreamPartState,
46
- build_stream_artifact_metadata,
47
47
  flush_time_limit,
48
48
  )
49
49
  from codex_a2a.metrics import (
@@ -243,7 +243,7 @@ class StreamEventProcessor:
243
243
  append=effective_append,
244
244
  last_chunk=False,
245
245
  artifact_metadata=build_stream_artifact_metadata(
246
- block_type=chunk.block_type,
246
+ block_type=chunk.block_type.value,
247
247
  source=chunk.source,
248
248
  message_id=resolved_message_id,
249
249
  role=chunk.role,
@@ -7,9 +7,6 @@ from typing import Any
7
7
  from a2a.types import Part
8
8
 
9
9
  from codex_a2a.a2a_proto import is_text_part, new_text_part, part_text
10
- from codex_a2a.contracts.runtime_output import (
11
- build_stream_artifact_metadata as build_runtime_stream_metadata,
12
- )
13
10
  from codex_a2a.execution.output_mapping import merge_token_usage
14
11
 
15
12
  _STREAM_TEXT_FLUSH_CHARS = 120
@@ -212,22 +209,3 @@ class StreamOutputState:
212
209
  return False
213
210
  self.pending_interrupt_request_ids.discard(normalized)
214
211
  return True
215
-
216
-
217
- def build_stream_artifact_metadata(
218
- *,
219
- block_type: BlockType,
220
- source: str,
221
- message_id: str | None = None,
222
- role: str | None = None,
223
- sequence: int | None = None,
224
- event_id: str | None = None,
225
- ) -> dict[str, Any]:
226
- return build_runtime_stream_metadata(
227
- block_type=block_type.value,
228
- source=source,
229
- message_id=message_id,
230
- role=role,
231
- sequence=sequence,
232
- event_id=event_id,
233
- )
@@ -19,7 +19,6 @@ from codex_a2a.execution.stream_processor import StreamEventProcessor
19
19
  from codex_a2a.execution.stream_state import (
20
20
  BlockType,
21
21
  StreamOutputState,
22
- build_stream_artifact_metadata,
23
22
  )
24
23
  from codex_a2a.metrics import CODEX_STREAM_RETRIES_TOTAL, get_metrics_registry
25
24
  from codex_a2a.upstream.client import CodexClient
@@ -32,7 +31,6 @@ _STREAM_IDLE_DIAGNOSTIC_SECONDS = 60.0
32
31
  __all__ = [
33
32
  "BlockType",
34
33
  "StreamOutputState",
35
- "build_stream_artifact_metadata",
36
34
  "consume_codex_stream",
37
35
  "extract_event_session_id",
38
36
  "extract_interrupt_resolved_event",
@@ -41,6 +41,21 @@ if TYPE_CHECKING:
41
41
  logger = logging.getLogger(__name__)
42
42
 
43
43
 
44
+ def _interrupt_reply_model_type(
45
+ app: CodexSessionQueryJSONRPCApplication,
46
+ method: str,
47
+ ) -> type[_InterruptReplyParams]:
48
+ if method == app._method_reply_permission:
49
+ return PermissionReplyParams
50
+ if method == app._method_reply_question:
51
+ return QuestionReplyParams
52
+ if method == app._method_reject_question:
53
+ return QuestionRejectParams
54
+ if method == app._method_reply_permissions:
55
+ return PermissionsReplyParams
56
+ return ElicitationReplyParams
57
+
58
+
44
59
  async def handle_interrupt_callback_request(
45
60
  app: CodexSessionQueryJSONRPCApplication,
46
61
  base_request: JSONRPCRequest,
@@ -49,17 +64,7 @@ async def handle_interrupt_callback_request(
49
64
  request: Request,
50
65
  ) -> Response:
51
66
  parsed_params: _InterruptReplyParams
52
- model_type = (
53
- PermissionReplyParams
54
- if base_request.method == app._method_reply_permission
55
- else QuestionReplyParams
56
- if base_request.method == app._method_reply_question
57
- else QuestionRejectParams
58
- if base_request.method == app._method_reject_question
59
- else PermissionsReplyParams
60
- if base_request.method == app._method_reply_permissions
61
- else ElicitationReplyParams
62
- )
67
+ model_type = _interrupt_reply_model_type(app, base_request.method)
63
68
  try:
64
69
  parsed_params = validate_params_model(
65
70
  model_type,
@@ -24,9 +24,7 @@ from codex_a2a.upstream.models import (
24
24
  CodexStartupPrerequisiteError,
25
25
  )
26
26
  from codex_a2a.upstream.request_mapping import (
27
- build_discovery_apps_params,
28
- build_discovery_plugin_read_params,
29
- build_discovery_plugins_params,
27
+ _project_present_fields,
30
28
  build_discovery_skills_params,
31
29
  build_interactive_exec_params,
32
30
  )
@@ -291,19 +289,45 @@ class CodexClient:
291
289
  async def list_apps(self, *, params: dict[str, Any] | None = None) -> Any:
292
290
  return await self._rpc_request(
293
291
  "app/list",
294
- self._merge_params(build_discovery_apps_params(params)),
292
+ self._merge_params(
293
+ _project_present_fields(
294
+ params,
295
+ (
296
+ ("cursor", "cursor"),
297
+ ("limit", "limit"),
298
+ ("thread_id", "threadId"),
299
+ ("force_refetch", "forceRefetch"),
300
+ ),
301
+ )
302
+ ),
295
303
  )
296
304
 
297
305
  async def list_plugins(self, *, params: dict[str, Any] | None = None) -> Any:
298
306
  return await self._rpc_request(
299
307
  "plugin/list",
300
- self._merge_params(build_discovery_plugins_params(params)),
308
+ self._merge_params(
309
+ _project_present_fields(
310
+ params,
311
+ (
312
+ ("cwds", "cwds"),
313
+ ("force_remote_sync", "forceRemoteSync"),
314
+ ),
315
+ )
316
+ ),
301
317
  )
302
318
 
303
319
  async def read_plugin(self, *, params: dict[str, Any] | None = None) -> Any:
304
320
  return await self._rpc_request(
305
321
  "plugin/read",
306
- self._merge_params(build_discovery_plugin_read_params(params)),
322
+ self._merge_params(
323
+ _project_present_fields(
324
+ params,
325
+ (
326
+ ("marketplace_path", "marketplacePath"),
327
+ ("plugin_name", "pluginName"),
328
+ ),
329
+ )
330
+ ),
307
331
  )
308
332
 
309
333
  async def list_sessions(self, *, params: dict[str, Any] | None = None) -> Any:
@@ -203,15 +203,6 @@ class CodexInterruptBridge:
203
203
  }
204
204
  )
205
205
 
206
- def interrupt_request_status(
207
- self,
208
- binding: InterruptRequestBinding,
209
- ) -> str:
210
- return interrupt_request_status(
211
- binding,
212
- interrupt_request_ttl_seconds=self._interrupt_request_ttl_seconds,
213
- )
214
-
215
206
  async def resolve_interrupt_request(
216
207
  self, request_id: str
217
208
  ) -> tuple[str, InterruptRequestBinding | None]:
@@ -221,7 +212,11 @@ class CodexInterruptBridge:
221
212
  self._purge_expired_interrupt_tombstones()
222
213
  pending = self._pending_server_requests.get(request_key)
223
214
  if pending is not None:
224
- status = self.interrupt_request_status(pending.binding)
215
+ status = interrupt_request_status(
216
+ pending.binding,
217
+ interrupt_request_ttl_seconds=self._interrupt_request_ttl_seconds,
218
+ now=self._now,
219
+ )
225
220
  if status == "expired":
226
221
  self._remember_interrupt_tombstone(request_key)
227
222
  if self._interrupt_request_store is not None:
@@ -271,7 +266,11 @@ class CodexInterruptBridge:
271
266
 
272
267
  items: list[dict[str, Any]] = []
273
268
  for request_id, pending in list(self._pending_server_requests.items()):
274
- status = self.interrupt_request_status(pending.binding)
269
+ status = interrupt_request_status(
270
+ pending.binding,
271
+ interrupt_request_ttl_seconds=self._interrupt_request_ttl_seconds,
272
+ now=self._now,
273
+ )
275
274
  if status == "expired":
276
275
  self._remember_interrupt_tombstone(request_id)
277
276
  if self._interrupt_request_store is not None:
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import time
4
- from collections.abc import Mapping
4
+ from collections.abc import Callable, Mapping
5
5
  from dataclasses import dataclass
6
6
  from typing import Any
7
7
 
@@ -216,10 +216,11 @@ def interrupt_request_status(
216
216
  binding: InterruptRequestBinding,
217
217
  *,
218
218
  interrupt_request_ttl_seconds: int,
219
+ now: Callable[[], float] = time.time,
219
220
  ) -> str:
220
221
  expires_at = binding.expires_at
221
222
  if expires_at is None:
222
223
  expires_at = binding.created_at + float(interrupt_request_ttl_seconds)
223
- if expires_at <= time.time():
224
+ if expires_at <= float(now()):
224
225
  return "expired"
225
226
  return "active"
@@ -146,38 +146,6 @@ def build_discovery_skills_params(params: dict[str, Any] | None) -> dict[str, An
146
146
  return rpc_params
147
147
 
148
148
 
149
- def build_discovery_apps_params(params: dict[str, Any] | None) -> dict[str, Any]:
150
- return _project_present_fields(
151
- params,
152
- (
153
- ("cursor", "cursor"),
154
- ("limit", "limit"),
155
- ("thread_id", "threadId"),
156
- ("force_refetch", "forceRefetch"),
157
- ),
158
- )
159
-
160
-
161
- def build_discovery_plugins_params(params: dict[str, Any] | None) -> dict[str, Any]:
162
- return _project_present_fields(
163
- params,
164
- (
165
- ("cwds", "cwds"),
166
- ("force_remote_sync", "forceRemoteSync"),
167
- ),
168
- )
169
-
170
-
171
- def build_discovery_plugin_read_params(params: dict[str, Any] | None) -> dict[str, Any]:
172
- return _project_present_fields(
173
- params,
174
- (
175
- ("marketplace_path", "marketplacePath"),
176
- ("plugin_name", "pluginName"),
177
- ),
178
- )
179
-
180
-
181
149
  def build_thread_rpc_params(
182
150
  thread_id: str,
183
151
  params: dict[str, Any] | None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-a2a
3
- Version: 1.1.0
3
+ Version: 1.1.2
4
4
  Summary: Codex A2A runtime adapter
5
5
  Author: liujuanjuan1984@Intelligent-Internet
6
6
  License-Expression: Apache-2.0
@@ -22,7 +22,7 @@ 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==1.0.2
25
+ Requires-Dist: a2a-sdk==1.1.0
26
26
  Requires-Dist: aiosqlite<1.0,>=0.20
27
27
  Requires-Dist: fastapi<0.137,>=0.121
28
28
  Requires-Dist: httpx<0.29,>=0.28.1
@@ -43,18 +43,18 @@ Requires-Dist: pytest>=8.0; extra == "dev"
43
43
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
44
44
  Requires-Dist: pytest-cov<8.0,>=5.0; extra == "dev"
45
45
  Requires-Dist: ruff>=0.5; extra == "dev"
46
- Requires-Dist: mypy<1.21,>=1.11; extra == "dev"
46
+ Requires-Dist: mypy<2.2,>=1.11; extra == "dev"
47
47
  Dynamic: license-file
48
48
 
49
49
  # codex-a2a
50
50
 
51
51
  ```text
52
- _ ___
53
- | | |__ \
54
- ___ ___ __| | _____ __ __ _ ) |__ _
55
- / __/ _ \ / _` |/ _ \ \/ / / _` | / // _` |
56
- | (_| (_) | (_| | __/> < | (_| |/ /| (_| |
57
- \___\___/ \__,_|\___/_/\_\ \__,_|____\__,_|
52
+ ██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗ █████╗ ██████╗ █████╗
53
+ ██╔════╝██╔═══██╗██╔══██╗██╔════╝╚██╗██╔╝ ██╔══██╗╚════██╗██╔══██╗
54
+ ██║ ██║ ██║██║ ██║█████╗ ╚███╔╝█████╗███████║ █████╔╝███████║
55
+ ██║ ██║ ██║██║ ██║██╔══╝ ██╔██╗╚════╝██╔══██║██╔═══╝ ██╔══██║
56
+ ╚██████╗╚██████╔╝██████╔╝███████╗██╔╝ ██╗ ██║ ██║███████╗██║ ██║
57
+ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
58
58
  ```
59
59
 
60
60
  > Expose Codex through A2A.
@@ -188,6 +188,7 @@ tests/jsonrpc/test_codex_turn_review_extension.py
188
188
  tests/jsonrpc/test_dispatch.py
189
189
  tests/jsonrpc/test_guard_hooks.py
190
190
  tests/jsonrpc/test_interrupt_lifecycle.py
191
+ tests/jsonrpc/test_interrupt_params.py
191
192
  tests/jsonrpc/test_interrupt_protocol_handlers.py
192
193
  tests/jsonrpc/test_jsonrpc_models.py
193
194
  tests/jsonrpc/test_protocol_payload_mapping.py
@@ -212,6 +213,7 @@ tests/server/test_cli.py
212
213
  tests/server/test_database.py
213
214
  tests/server/test_database_app_persistence.py
214
215
  tests/server/test_migrations.py
216
+ tests/server/test_output_negotiation.py
215
217
  tests/server/test_push_config_store.py
216
218
  tests/server/test_request_handler.py
217
219
  tests/server/test_runtime_state.py
@@ -226,6 +228,7 @@ tests/support/jsonrpc_errors.py
226
228
  tests/support/settings.py
227
229
  tests/upstream/__init__.py
228
230
  tests/upstream/test_codex_client_params.py
231
+ tests/upstream/test_interrupt_bridge.py
229
232
  tests/upstream/test_interrupt_persistence.py
230
233
  tests/upstream/test_modular_upstream_components.py
231
234
  tests/upstream/test_request_mapping.py
@@ -1,4 +1,4 @@
1
- a2a-sdk==1.0.2
1
+ a2a-sdk==1.1.0
2
2
  aiosqlite<1.0,>=0.20
3
3
  fastapi<0.137,>=0.121
4
4
  httpx<0.29,>=0.28.1
@@ -20,4 +20,4 @@ pytest>=8.0
20
20
  pytest-asyncio>=0.23
21
21
  pytest-cov<8.0,>=5.0
22
22
  ruff>=0.5
23
- mypy<1.21,>=1.11
23
+ mypy<2.2,>=1.11