opencode-a2a 0.8.1__tar.gz → 1.0.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.
Files changed (222) hide show
  1. opencode_a2a-1.0.0/MANIFEST.in +1 -0
  2. {opencode_a2a-0.8.1/src/opencode_a2a.egg-info → opencode_a2a-1.0.0}/PKG-INFO +22 -13
  3. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/README.md +19 -11
  4. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/docs/compatibility.md +15 -15
  5. opencode_a2a-1.0.0/docs/conformance-triage.md +32 -0
  6. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/docs/conformance.md +2 -2
  7. opencode_a2a-1.0.0/docs/extension-specifications.md +161 -0
  8. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/docs/guide.md +113 -97
  9. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/pyproject.toml +10 -2
  10. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/README.md +1 -0
  11. opencode_a2a-1.0.0/scripts/find_thin_wrappers.py +367 -0
  12. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/smoke_test_built_cli.sh +24 -10
  13. opencode_a2a-1.0.0/src/opencode_a2a/a2a_protocol.py +9 -0
  14. opencode_a2a-1.0.0/src/opencode_a2a/a2a_utils.py +96 -0
  15. opencode_a2a-1.0.0/src/opencode_a2a/cli.py +307 -0
  16. opencode_a2a-1.0.0/src/opencode_a2a/client/agent_card.py +43 -0
  17. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/client/client.py +149 -158
  18. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/client/config.py +0 -26
  19. opencode_a2a-1.0.0/src/opencode_a2a/client/error_mapping.py +261 -0
  20. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/client/errors.py +0 -13
  21. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/client/payload_text.py +34 -27
  22. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/client/polling.py +3 -6
  23. opencode_a2a-1.0.0/src/opencode_a2a/client/request_context.py +94 -0
  24. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/config.py +1 -48
  25. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/__init__.py +60 -0
  26. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/capabilities.py +142 -0
  27. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/catalog.py +664 -0
  28. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/compatibility.py +421 -0
  29. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/contract_docs.py +79 -0
  30. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/identifiers.py +94 -0
  31. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/private_params.py +251 -0
  32. opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/public_params.py +279 -0
  33. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/coordinator.py +88 -68
  34. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/executor.py +95 -132
  35. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/session_manager.py +7 -5
  36. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/stream_events.py +7 -42
  37. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/stream_runtime.py +121 -75
  38. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/stream_state.py +39 -29
  39. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/tool_error_mapping.py +5 -9
  40. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/tool_orchestration.py +12 -20
  41. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/upstream_error_translator.py +21 -31
  42. opencode_a2a-1.0.0/src/opencode_a2a/extension_negotiation.py +118 -0
  43. opencode_a2a-1.0.0/src/opencode_a2a/jsonrpc/application.py +405 -0
  44. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/dispatch.py +19 -4
  45. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/error_responses.py +23 -47
  46. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/common.py +2 -32
  47. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/interrupt_callbacks.py +16 -16
  48. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/interrupt_queries.py +1 -1
  49. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/provider_discovery.py +8 -6
  50. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/session_control.py +14 -16
  51. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/session_lifecycle.py +40 -61
  52. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/session_queries.py +25 -22
  53. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/workspace_control.py +1 -1
  54. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/methods.py +9 -9
  55. opencode_a2a-1.0.0/src/opencode_a2a/jsonrpc/models.py +32 -0
  56. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/params.py +21 -34
  57. opencode_a2a-1.0.0/src/opencode_a2a/metadata_access.py +58 -0
  58. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/opencode_upstream_client.py +6 -9
  59. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/output_modes.py +167 -82
  60. opencode_a2a-1.0.0/src/opencode_a2a/parts/mapping.py +133 -0
  61. opencode_a2a-1.0.0/src/opencode_a2a/protocol_versions.py +48 -0
  62. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/agent_card.py +82 -173
  63. opencode_a2a-1.0.0/src/opencode_a2a/server/application.py +1069 -0
  64. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/client_manager.py +0 -3
  65. opencode_a2a-1.0.0/src/opencode_a2a/server/context_helpers.py +97 -0
  66. opencode_a2a-1.0.0/src/opencode_a2a/server/database.py +44 -0
  67. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/lifespan.py +19 -14
  68. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/middleware.py +70 -122
  69. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/migrations.py +17 -1
  70. opencode_a2a-1.0.0/src/opencode_a2a/server/openapi.py +359 -0
  71. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/request_parsing.py +0 -43
  72. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/rest_tasks.py +117 -86
  73. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/state_store.py +55 -36
  74. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/task_store.py +101 -170
  75. opencode_a2a-1.0.0/src/opencode_a2a/server/task_store_sdk_compat.py +272 -0
  76. opencode_a2a-1.0.0/src/opencode_a2a/task_states.py +12 -0
  77. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/upstream_taxonomy.py +8 -15
  78. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0/src/opencode_a2a.egg-info}/PKG-INFO +22 -13
  79. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/SOURCES.txt +21 -3
  80. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/requires.txt +2 -1
  81. opencode_a2a-1.0.0/tests/client/test_agent_card.py +42 -0
  82. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/client/test_client_config.py +0 -8
  83. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/client/test_client_facade.py +184 -122
  84. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/client/test_error_mapping.py +17 -13
  85. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/client/test_payload_text.py +6 -11
  86. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/client/test_polling.py +4 -4
  87. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/client/test_request_context.py +55 -11
  88. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/config/test_settings.py +6 -25
  89. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/contracts/test_extension_contract_consistency.py +211 -109
  90. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_agent_errors.py +98 -58
  91. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_agent_helpers.py +32 -28
  92. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_cancellation.py +6 -4
  93. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_directory_validation.py +2 -1
  94. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_metrics.py +33 -8
  95. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_multipart_input.py +16 -20
  96. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_opencode_agent_session_binding.py +52 -97
  97. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_session_ownership.py +6 -4
  98. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_blocks.py +10 -5
  99. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_core.py +236 -61
  100. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_interrupts.py +55 -19
  101. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_logging.py +44 -0
  102. opencode_a2a-1.0.0/tests/jsonrpc/test_application_dispatch.py +389 -0
  103. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_dispatch_registry.py +87 -62
  104. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_error_responses.py +21 -28
  105. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_jsonrpc_methods.py +1 -1
  106. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_jsonrpc_unsupported_method.py +28 -26
  107. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_commands.py +89 -47
  108. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_interrupts.py +70 -38
  109. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_lifecycle.py +33 -18
  110. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_prompt_async.py +74 -44
  111. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_queries.py +81 -68
  112. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_workspace_control_extension.py +27 -18
  113. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/package/test_typing_contract.py +8 -0
  114. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/profile/test_profile_runtime.py +5 -4
  115. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/scripts/test_script_health_contract.py +17 -0
  116. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_a2a_client_manager.py +0 -8
  117. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_agent_card.py +96 -98
  118. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_app_behaviors.py +713 -136
  119. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_call_context_builder.py +6 -0
  120. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_cancel_contract.py +92 -55
  121. opencode_a2a-1.0.0/tests/server/test_cli.py +134 -0
  122. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_database_app_persistence.py +5 -4
  123. opencode_a2a-1.0.0/tests/server/test_output_negotiation.py +451 -0
  124. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_state_store.py +114 -1
  125. opencode_a2a-1.0.0/tests/server/test_task_store_factory.py +843 -0
  126. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_transport_contract.py +543 -127
  127. opencode_a2a-1.0.0/tests/support/async_iterators.py +17 -0
  128. opencode_a2a-1.0.0/tests/support/fake_client_errors.py +21 -0
  129. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/support/helpers.py +55 -13
  130. opencode_a2a-1.0.0/tests/support/jsonrpc_error_assertions.py +84 -0
  131. opencode_a2a-1.0.0/tests/support/session_extensions.py +46 -0
  132. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/support/streaming_output.py +9 -6
  133. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/upstream/test_opencode_upstream_client_params.py +16 -5
  134. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/uv.lock +304 -172
  135. opencode_a2a-0.8.1/docs/conformance-triage.md +0 -89
  136. opencode_a2a-0.8.1/docs/extension-specifications.md +0 -105
  137. opencode_a2a-0.8.1/src/opencode_a2a/cli.py +0 -97
  138. opencode_a2a-0.8.1/src/opencode_a2a/client/agent_card.py +0 -86
  139. opencode_a2a-0.8.1/src/opencode_a2a/client/error_mapping.py +0 -148
  140. opencode_a2a-0.8.1/src/opencode_a2a/client/request_context.py +0 -80
  141. opencode_a2a-0.8.1/src/opencode_a2a/contracts/extensions.py +0 -1752
  142. opencode_a2a-0.8.1/src/opencode_a2a/execution/request_context.py +0 -88
  143. opencode_a2a-0.8.1/src/opencode_a2a/invocation.py +0 -30
  144. opencode_a2a-0.8.1/src/opencode_a2a/jsonrpc/application.py +0 -269
  145. opencode_a2a-0.8.1/src/opencode_a2a/metadata_access.py +0 -39
  146. opencode_a2a-0.8.1/src/opencode_a2a/parts/mapping.py +0 -151
  147. opencode_a2a-0.8.1/src/opencode_a2a/protocol_versions.py +0 -103
  148. opencode_a2a-0.8.1/src/opencode_a2a/server/application.py +0 -736
  149. opencode_a2a-0.8.1/src/opencode_a2a/server/openapi.py +0 -713
  150. opencode_a2a-0.8.1/src/opencode_a2a/task_states.py +0 -12
  151. opencode_a2a-0.8.1/tests/client/test_agent_card.py +0 -82
  152. opencode_a2a-0.8.1/tests/server/test_cli.py +0 -67
  153. opencode_a2a-0.8.1/tests/server/test_output_negotiation.py +0 -217
  154. opencode_a2a-0.8.1/tests/server/test_task_store_factory.py +0 -453
  155. opencode_a2a-0.8.1/tests/support/session_extensions.py +0 -19
  156. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/.github/dependabot.yml +0 -0
  157. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/.github/workflows/dependency-review.yml +0 -0
  158. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/.github/workflows/publish.yml +0 -0
  159. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/.github/workflows/validate.yml +0 -0
  160. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/.gitignore +0 -0
  161. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/.pre-commit-config.yaml +0 -0
  162. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/.secrets.baseline +0 -0
  163. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/AGENTS.md +0 -0
  164. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/CODE_OF_CONDUCT.md +0 -0
  165. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/CONTRIBUTING.md +0 -0
  166. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/LICENSE +0 -0
  167. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/SECURITY.md +0 -0
  168. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/SUPPORT.md +0 -0
  169. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/docs/architecture.md +0 -0
  170. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/docs/maintainer-architecture.md +0 -0
  171. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/check_coverage.py +0 -0
  172. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/conformance.sh +0 -0
  173. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/dependency_health.sh +0 -0
  174. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/doctor.sh +0 -0
  175. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/health_common.sh +0 -0
  176. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/scripts/lint.sh +0 -0
  177. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/setup.cfg +0 -0
  178. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/__init__.py +0 -0
  179. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/auth.py +0 -0
  180. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/client/__init__.py +0 -0
  181. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/client/auth.py +0 -0
  182. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/contracts/__init__.py +0 -0
  183. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/__init__.py +0 -0
  184. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/event_helpers.py +0 -0
  185. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/metrics.py +0 -0
  186. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/__init__.py +0 -0
  187. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/__init__.py +0 -0
  188. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/parsing.py +0 -0
  189. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/parts/__init__.py +0 -0
  190. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/parts/text.py +0 -0
  191. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/profile/__init__.py +0 -0
  192. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/profile/runtime.py +0 -0
  193. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/py.typed +0 -0
  194. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/runtime_state.py +0 -0
  195. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/sandbox_policy.py +0 -0
  196. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/server/__init__.py +0 -0
  197. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a/trace_context.py +0 -0
  198. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/dependency_links.txt +0 -0
  199. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/entry_points.txt +0 -0
  200. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/top_level.txt +0 -0
  201. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/__init__.py +0 -0
  202. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/client/__init__.py +0 -0
  203. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/config/__init__.py +0 -0
  204. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/conftest.py +0 -0
  205. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/contracts/__init__.py +0 -0
  206. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/__init__.py +0 -0
  207. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/execution/test_session_lock_lifecycle.py +0 -0
  208. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/__init__.py +0 -0
  209. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/jsonrpc/test_jsonrpc_params.py +0 -0
  210. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/package/__init__.py +0 -0
  211. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/package/test_logging.py +0 -0
  212. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/package/test_version.py +0 -0
  213. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/parts/__init__.py +0 -0
  214. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/parts/test_parts_text.py +0 -0
  215. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/profile/__init__.py +0 -0
  216. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/scripts/__init__.py +0 -0
  217. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/__init__.py +0 -0
  218. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/server/test_auth.py +0 -0
  219. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/support/__init__.py +0 -0
  220. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/test_metadata_access.py +0 -0
  221. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/test_trace_context.py +0 -0
  222. {opencode_a2a-0.8.1 → opencode_a2a-1.0.0}/tests/upstream/__init__.py +0 -0
@@ -0,0 +1 @@
1
+ recursive-include docs *.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencode-a2a
3
- Version: 0.8.1
3
+ Version: 1.0.0
4
4
  Summary: OpenCode A2A runtime
5
5
  Author: liujuanjuan1984@Intelligent-Internet
6
6
  License-Expression: Apache-2.0
@@ -19,12 +19,13 @@ Classifier: Topic :: Internet :: WWW/HTTP
19
19
  Requires-Python: >=3.11
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
- Requires-Dist: a2a-sdk==0.3.26
22
+ Requires-Dist: a2a-sdk==1.0.2
23
23
  Requires-Dist: aiosqlite<1.0,>=0.20
24
24
  Requires-Dist: fastapi<1.0,>=0.110
25
25
  Requires-Dist: httpx<1.0,>=0.27
26
26
  Requires-Dist: pydantic<3.0,>=2.6
27
27
  Requires-Dist: pydantic-settings<3.0,>=2.2
28
+ Requires-Dist: protobuf<7.0,>=6.33.5
28
29
  Requires-Dist: sqlalchemy<3.0,>=2.0
29
30
  Requires-Dist: sse-starlette<4.0,>=2.1
30
31
  Requires-Dist: uvicorn<1.0,>=0.29
@@ -41,6 +42,15 @@ Dynamic: license-file
41
42
 
42
43
  # opencode-a2a
43
44
 
45
+ ```text
46
+ ___ ____ _ _ ____ _
47
+ / _ \ _ __ ___ _ __ / ___|___ __| | ___ / \ |___ \ / \
48
+ | | | | '_ \ / _ \ '_ \| | / _ \ / _` |/ _ \_____ / _ \ __) | / _ \
49
+ | |_| | |_) | __/ | | | |__| (_) | (_| | __/_____/ ___ \ / __/ / ___ \
50
+ \___/| .__/ \___|_| |_|\____\___/ \__,_|\___| /_/ \_\_____/_/ \_\
51
+ |_|
52
+ ```
53
+
44
54
  > Expose OpenCode through A2A.
45
55
 
46
56
  `opencode-a2a` adds an A2A runtime layer to `opencode serve`, with auth, streaming, session continuity, interrupt handling, and a clear deployment boundary.
@@ -68,11 +78,11 @@ flowchart TD
68
78
  PeerA2A --> PeerRuntime
69
79
  end
70
80
 
71
- External -->|message/send,\nmessage:stream| Ingress
81
+ External -->|SendMessage,\nSendStreamingMessage| Ingress
72
82
  Ingress -->|tool call| OpenCode
73
83
  OpenCode -->|model/tool result events| Ingress
74
84
  Ingress -->|a2a_call| Outbound
75
- Outbound -->|message/send,\nmessage:stream| PeerA2A
85
+ Outbound -->|SendMessage,\nSendStreamingMessage| PeerA2A
76
86
  PeerA2A -->|tool result| Outbound
77
87
  PeerRuntime -->|task session\nexecution| PeerA2A
78
88
  ```
@@ -112,7 +122,7 @@ A2A_HOST=127.0.0.1 \
112
122
  A2A_PORT=8000 \
113
123
  A2A_PUBLIC_URL=http://127.0.0.1:8000 \
114
124
  OPENCODE_WORKSPACE_ROOT=/abs/path/to/workspace \
115
- opencode-a2a
125
+ opencode-a2a serve
116
126
  ```
117
127
 
118
128
  Verify that the service is up:
@@ -125,7 +135,7 @@ curl http://127.0.0.1:8000/.well-known/agent-card.json
125
135
 
126
136
  - A2A HTTP+JSON endpoints such as `/v1/message:send` and `/v1/message:stream`
127
137
  - A2A JSON-RPC support on `POST /`
128
- - SDK-owned A2A task surfaces such as `GET /v1/tasks`, task push notification config routes, and JSON-RPC `agent/getAuthenticatedExtendedCard`
138
+ - SDK-owned A2A task surfaces such as `GET /v1/tasks`, task push notification config routes, JSON-RPC `GetExtendedAgentCard`, and HTTP `GET /extendedAgentCard`
129
139
  - Peering capabilities: can act as a client via `opencode-a2a call`
130
140
  - Autonomous tool execution: supports `a2a_call` tool for outbound agent-to-agent communication
131
141
  - SSE streaming with normalized `text`, `reasoning`, and `tool_call` blocks
@@ -135,11 +145,10 @@ curl http://127.0.0.1:8000/.well-known/agent-card.json
135
145
 
136
146
  ## A2A Protocol Support
137
147
 
138
- - Default protocol line: `0.3`
139
- - Declared supported protocol lines: `0.3`, `1.0`
140
- - `0.3` is the stable interoperability baseline for the current runtime surface.
141
- - `1.0` currently covers version negotiation plus protocol-aware JSON-RPC and REST error shaping, while transport payloads, enums, pagination, signatures, and interface-level protocol declarations still follow the shipped SDK baseline.
142
- - The detailed compatibility matrix and machine-readable support boundary are documented in [`docs/guide.md`](docs/guide.md) and [`docs/compatibility.md`](docs/compatibility.md).
148
+ - Supported A2A protocol line: `1.0`
149
+ - The runtime is now v1-only across HTTP+JSON, JSON-RPC, Agent Card discovery, and protocol-aware error contracts.
150
+ - Legacy `0.3` method aliases and payload shapes are rejected instead of being normalized at runtime.
151
+ - The detailed runtime contract and machine-readable support boundary are documented in [`docs/guide.md`](docs/guide.md) and [`docs/compatibility.md`](docs/compatibility.md).
143
152
 
144
153
  ## Peering Node / Outbound Access
145
154
 
@@ -151,12 +160,12 @@ Interact with other A2A agents directly from the command line:
151
160
  ```bash
152
161
  # Using the target peer agent's Bearer token via environment injection
153
162
  A2A_CLIENT_BEARER_TOKEN=your-outbound-token \
154
- opencode-a2a call http://other-agent:8000 "How are you?"
163
+ opencode-a2a call http://other-agent:8000/.well-known/agent-card.json "How are you?"
155
164
 
156
165
  # Using the target peer agent's Basic auth via environment injection
157
166
  # Accepts raw user:pass or its base64-encoded value
158
167
  A2A_CLIENT_BASIC_AUTH="user:pass" \
159
- opencode-a2a call http://other-agent:8000 "How are you?"
168
+ opencode-a2a call http://other-agent:8000/.well-known/agent-card.json "How are you?"
160
169
  ```
161
170
 
162
171
  ### Outbound Agent Calls (Tools)
@@ -1,5 +1,14 @@
1
1
  # opencode-a2a
2
2
 
3
+ ```text
4
+ ___ ____ _ _ ____ _
5
+ / _ \ _ __ ___ _ __ / ___|___ __| | ___ / \ |___ \ / \
6
+ | | | | '_ \ / _ \ '_ \| | / _ \ / _` |/ _ \_____ / _ \ __) | / _ \
7
+ | |_| | |_) | __/ | | | |__| (_) | (_| | __/_____/ ___ \ / __/ / ___ \
8
+ \___/| .__/ \___|_| |_|\____\___/ \__,_|\___| /_/ \_\_____/_/ \_\
9
+ |_|
10
+ ```
11
+
3
12
  > Expose OpenCode through A2A.
4
13
 
5
14
  `opencode-a2a` adds an A2A runtime layer to `opencode serve`, with auth, streaming, session continuity, interrupt handling, and a clear deployment boundary.
@@ -27,11 +36,11 @@ flowchart TD
27
36
  PeerA2A --> PeerRuntime
28
37
  end
29
38
 
30
- External -->|message/send,\nmessage:stream| Ingress
39
+ External -->|SendMessage,\nSendStreamingMessage| Ingress
31
40
  Ingress -->|tool call| OpenCode
32
41
  OpenCode -->|model/tool result events| Ingress
33
42
  Ingress -->|a2a_call| Outbound
34
- Outbound -->|message/send,\nmessage:stream| PeerA2A
43
+ Outbound -->|SendMessage,\nSendStreamingMessage| PeerA2A
35
44
  PeerA2A -->|tool result| Outbound
36
45
  PeerRuntime -->|task session\nexecution| PeerA2A
37
46
  ```
@@ -71,7 +80,7 @@ A2A_HOST=127.0.0.1 \
71
80
  A2A_PORT=8000 \
72
81
  A2A_PUBLIC_URL=http://127.0.0.1:8000 \
73
82
  OPENCODE_WORKSPACE_ROOT=/abs/path/to/workspace \
74
- opencode-a2a
83
+ opencode-a2a serve
75
84
  ```
76
85
 
77
86
  Verify that the service is up:
@@ -84,7 +93,7 @@ curl http://127.0.0.1:8000/.well-known/agent-card.json
84
93
 
85
94
  - A2A HTTP+JSON endpoints such as `/v1/message:send` and `/v1/message:stream`
86
95
  - A2A JSON-RPC support on `POST /`
87
- - SDK-owned A2A task surfaces such as `GET /v1/tasks`, task push notification config routes, and JSON-RPC `agent/getAuthenticatedExtendedCard`
96
+ - SDK-owned A2A task surfaces such as `GET /v1/tasks`, task push notification config routes, JSON-RPC `GetExtendedAgentCard`, and HTTP `GET /extendedAgentCard`
88
97
  - Peering capabilities: can act as a client via `opencode-a2a call`
89
98
  - Autonomous tool execution: supports `a2a_call` tool for outbound agent-to-agent communication
90
99
  - SSE streaming with normalized `text`, `reasoning`, and `tool_call` blocks
@@ -94,11 +103,10 @@ curl http://127.0.0.1:8000/.well-known/agent-card.json
94
103
 
95
104
  ## A2A Protocol Support
96
105
 
97
- - Default protocol line: `0.3`
98
- - Declared supported protocol lines: `0.3`, `1.0`
99
- - `0.3` is the stable interoperability baseline for the current runtime surface.
100
- - `1.0` currently covers version negotiation plus protocol-aware JSON-RPC and REST error shaping, while transport payloads, enums, pagination, signatures, and interface-level protocol declarations still follow the shipped SDK baseline.
101
- - The detailed compatibility matrix and machine-readable support boundary are documented in [`docs/guide.md`](docs/guide.md) and [`docs/compatibility.md`](docs/compatibility.md).
106
+ - Supported A2A protocol line: `1.0`
107
+ - The runtime is now v1-only across HTTP+JSON, JSON-RPC, Agent Card discovery, and protocol-aware error contracts.
108
+ - Legacy `0.3` method aliases and payload shapes are rejected instead of being normalized at runtime.
109
+ - The detailed runtime contract and machine-readable support boundary are documented in [`docs/guide.md`](docs/guide.md) and [`docs/compatibility.md`](docs/compatibility.md).
102
110
 
103
111
  ## Peering Node / Outbound Access
104
112
 
@@ -110,12 +118,12 @@ Interact with other A2A agents directly from the command line:
110
118
  ```bash
111
119
  # Using the target peer agent's Bearer token via environment injection
112
120
  A2A_CLIENT_BEARER_TOKEN=your-outbound-token \
113
- opencode-a2a call http://other-agent:8000 "How are you?"
121
+ opencode-a2a call http://other-agent:8000/.well-known/agent-card.json "How are you?"
114
122
 
115
123
  # Using the target peer agent's Basic auth via environment injection
116
124
  # Accepts raw user:pass or its base64-encoded value
117
125
  A2A_CLIENT_BASIC_AUTH="user:pass" \
118
- opencode-a2a call http://other-agent:8000 "How are you?"
126
+ opencode-a2a call http://other-agent:8000/.well-known/agent-card.json "How are you?"
119
127
  ```
120
128
 
121
129
  ### Outbound Agent Calls (Tools)
@@ -1,15 +1,14 @@
1
1
  # Compatibility Guide
2
2
 
3
- This document explains the compatibility promises `opencode-a2a` currently tries to uphold for A2A consumers, operators, and maintainers.
3
+ This document defines the compatibility promises `opencode-a2a` currently upholds for A2A consumers, operators, and maintainers.
4
4
 
5
5
  ## Runtime Support
6
6
 
7
7
  - Python versions: 3.11, 3.12, 3.13
8
- - A2A SDK line: `0.3.x`
9
- - Default advertised protocol line: `0.3`
10
- - Declared supported protocol lines: `0.3`, `1.0`
8
+ - A2A SDK line: `1.x.y`
9
+ - Supported A2A protocol line: `1.0`
11
10
 
12
- The repository pins the SDK version in `pyproject.toml`. Upgrade the SDK deliberately rather than relying on floating dependency resolution.
11
+ The repository currently pins one concrete SDK release in `pyproject.toml` within that v1 line. Upgrade the SDK deliberately rather than relying on floating dependency resolution.
13
12
 
14
13
  ## Contract Honesty
15
14
 
@@ -21,12 +20,12 @@ Machine-readable discovery surfaces must reflect actual runtime behavior:
21
20
  - JSON-RPC wire contract
22
21
  - compatibility profile
23
22
 
24
- If runtime support is not actually implemented, do not publish it as a supported machine-readable capability.
23
+ If runtime support is not implemented, do not publish it as a supported machine-readable capability.
25
24
 
26
25
  Consumer guidance:
27
26
 
28
- - Treat the core A2A send / stream / task methods as the portable baseline.
29
- - Treat `urn:a2a:*` entries in this repository as shared repo-family conventions, not as a claim that they are part of the A2A core baseline.
27
+ - Treat the v1 core A2A methods (`SendMessage`, `SendStreamingMessage`, `GetTask`, `CancelTask`, `SubscribeToTask`) as the portable baseline.
28
+ - Treat `urn:opencode-a2a:extension:...` entries in this repository as repository-governed extension identifiers, not as a claim that they are part of the A2A core baseline.
30
29
  - Treat `opencode.*` methods and `metadata.opencode.*` fields as provider-private OpenCode control and discovery surfaces layered on top of the portable A2A baseline.
31
30
  - Treat [extension-specifications.md](./extension-specifications.md) as the stable URI/spec index, not as the main usage guide.
32
31
 
@@ -45,7 +44,8 @@ External TCK runs and local conformance experiments are investigation inputs. Th
45
44
  This repository still ships as an alpha project. Within that alpha line, these declared surfaces should not drift silently:
46
45
 
47
46
  - core A2A send / stream / task methods
48
- - version negotiation and protocol-aware error shaping
47
+ - v1-only request/response payloads and enum values
48
+ - v1 protocol-aware JSON-RPC and REST error shaping
49
49
  - shared session-binding metadata
50
50
  - shared model-selection metadata
51
51
  - shared streaming metadata
@@ -56,9 +56,9 @@ Changes to those surfaces should be treated as compatibility-sensitive and shoul
56
56
 
57
57
  Service-level behavior layered on top of those core methods should also be declared explicitly when interoperability depends on it. Current examples:
58
58
 
59
- - `tasks/resubscribe` replay-once behavior for terminal updates
59
+ - `SubscribeToTask` replay-once behavior for terminal updates
60
60
  - first-terminal-state-wins task persistence policy
61
- - task-scoped `acceptedOutputModes` negotiation persistence across send / stream / get / resubscribe
61
+ - task-scoped `acceptedOutputModes` negotiation persistence across send / stream / get / subscribe
62
62
  - request-body rejection behavior for oversized transport payloads
63
63
 
64
64
  ## Deployment Profile
@@ -92,13 +92,13 @@ The default SQLite-first profile is intended for local or controlled single-inst
92
92
  ## Extension Stability
93
93
 
94
94
  - Shared metadata and extension contracts should stay synchronized across Agent Card, OpenAPI, and runtime behavior.
95
- - Public Agent Card should stay intentionally minimal. Detailed extension params belong in the authenticated extended card and OpenAPI, not back in the anonymous discovery surface.
95
+ - Public Agent Card should stay intentionally minimal. Detailed extension params belong in the authenticated extended card, while anonymous OpenAPI should mirror only the shared public disclosure subset.
96
96
  - Deployment-conditional methods must be declared as conditional rather than silently disappearing.
97
97
  - `opencode.sessions.prompt_async` input-part passthrough is compatibility-sensitive. Changes to supported part types, passthrough field semantics, or rejection behavior should be treated as wire-level changes.
98
98
  - `opencode.sessions.shell` is compatibility-sensitive as a deployment-conditional shell snapshot surface. It should not silently widen into a general interactive shell API.
99
99
  - `opencode.workspaces.*` and `opencode.worktrees.*` are boundary-sensitive and should remain explicitly provider-private, operator-scoped, and deployment-conditional where applicable.
100
100
  - Interrupt callback and recovery methods are compatibility-sensitive because clients may depend on request ID lifecycle, expiry semantics, and identity scoping.
101
- - Agent Card media modes and `acceptedOutputModes` handling are compatibility-sensitive. Changes to declared chat modes, to task-scoped negotiation persistence, or to `DataPart` -> `TextPart` downgrade behavior should be treated as wire-level changes.
101
+ - Agent Card media modes and `acceptedOutputModes` handling are compatibility-sensitive. Changes to declared chat modes, to task-scoped negotiation persistence, or to output filtering of structured tool payloads should be treated as wire-level changes.
102
102
  - Agent Card and OpenAPI publication of `protocol_compatibility`, `service_behaviors`, and runtime feature toggles is compatibility-sensitive discoverability surface.
103
103
 
104
104
  ## Extension Boundary Governance
@@ -132,7 +132,7 @@ This repository distinguishes between three layers:
132
132
 
133
133
  Important note:
134
134
 
135
- - `urn:a2a:*` extension URIs used here should be read as shared conventions in this repository family.
135
+ - `urn:opencode-a2a:extension:...` extension URIs used here are repository-governed, versioned permanent identifiers.
136
136
  - They are not a claim that those extensions are part of the A2A core baseline.
137
137
  - `opencode.*` methods are intentionally product-specific. They improve OpenCode-aware workflows but should not be assumed to transfer unchanged to unrelated A2A agents.
138
138
 
@@ -142,6 +142,6 @@ This repository does not currently promise:
142
142
 
143
143
  - hard multi-tenant isolation inside one instance
144
144
  - generic provider-auth orchestration on behalf of OpenCode
145
- - a claim that all declared `1.0` protocol surfaces are fully implemented beyond the documented compatibility matrix
145
+ - compatibility with legacy A2A `0.3` method aliases or payload shapes
146
146
 
147
147
  Those areas may evolve later, but they should not be implied by current machine-readable discovery output.
@@ -0,0 +1,32 @@
1
+ # External Conformance Triage
2
+
3
+ This document summarizes the current interpretation rules for external TCK runs after the repository's A2A v1 migration.
4
+
5
+ ## Current Runtime Baseline
6
+
7
+ - `opencode-a2a` now targets the `a2a-sdk 1.x.y` line
8
+ - the runtime is v1-only
9
+ - canonical JSON-RPC core methods are `SendMessage`, `SendStreamingMessage`, `GetTask`, `CancelTask`, and `SubscribeToTask`
10
+ - legacy `0.3` aliases and payload shapes are intentionally rejected rather than normalized
11
+
12
+ ## How To Read TCK Failures
13
+
14
+ When a TCK run fails, classify the result before changing the runtime:
15
+
16
+ - `Runtime gap`
17
+ - the failure reproduces against the current v1-only runtime and contradicts the repository's declared machine-readable contract
18
+ - `TCK assumption mismatch`
19
+ - the failure depends on method names, payload shapes, or schema expectations that do not match the current A2A v1 SDK/runtime contract
20
+ - `Local experiment artifact`
21
+ - the failure depends on dummy-backed local behavior, environment heuristics, or unrelated tooling/setup issues
22
+
23
+ ## Current Guidance
24
+
25
+ - Re-run conformance against the current runtime before using any historical triage note.
26
+ - Treat Agent Card, authenticated extended card, OpenAPI, and runtime tests as the repository's declared source of truth.
27
+ - Do not reopen removed `0.3` compatibility behavior just to satisfy an outdated TCK assumption.
28
+ - If a TCK gap is real, document it against the current v1 contract with the exact request/response payloads that failed.
29
+
30
+ ## Historical Note
31
+
32
+ Earlier repository-local triage notes were written before the v1 migration and described a mixed `0.3` / partial `1.0` state. Those notes are no longer normative and were removed to avoid stale guidance.
@@ -59,8 +59,8 @@ Each run keeps the following artifacts in the selected output directory:
59
59
  When a TCK run fails, inspect the raw report before changing the runtime:
60
60
 
61
61
  - Some failures may point to real runtime gaps.
62
- - Some failures may come from TCK assumptions that do not match `a2a-sdk==0.3.25`.
63
- - Some failures may come from A2A v0.3 versus v1.0 naming or schema drift.
62
+ - Some failures may come from TCK assumptions that do not match the current `a2a-sdk 1.x.y` contract.
63
+ - Some failures may come from local dummy-backed experiment behavior rather than a wire-level runtime defect.
64
64
 
65
65
  The experiment is useful only if those categories stay separate during triage.
66
66
 
@@ -0,0 +1,161 @@
1
+ # Extension Specifications
2
+
3
+ This document is the stable specification index for the shared and provider-private extension URIs published by `opencode-a2a`. It is intentionally a compact URI/spec map, not the main consumer guide. For runtime behavior, request examples, and operational setup, see [`guide.md`](./guide.md). For compatibility promises and stability expectations, see [`compatibility.md`](./compatibility.md).
4
+
5
+ ## Discovery Surface Note
6
+
7
+ `opencode-a2a` splits extension discovery into three layers:
8
+
9
+ - Public Agent Card: minimal anonymous discovery for core interfaces and low-sensitivity shared extensions
10
+ - Authenticated extended Agent Card: the canonical machine-readable source for deployment-specific provider-private contracts
11
+ - OpenAPI metadata: minimal anonymous shared-contract disclosure only; provider-private method matrices are intentionally not expanded there
12
+
13
+ Provider-private contract note:
14
+
15
+ - `opencode.*` methods in this repository are deployment-specific provider extensions, not portable A2A baseline capabilities.
16
+ - Shared `metadata.shared.*` contracts are intended to remain low-risk and transportable.
17
+ - Compatibility and wire-contract URIs are descriptive metadata contracts, not activatable runtime capabilities.
18
+
19
+ ## SDK and Discovery Compatibility
20
+
21
+ - A2A v1.0 Agent Cards expose extended-card availability via `AgentCard.capabilities.extendedAgentCard`.
22
+ - `opencode-a2a` emits `capabilities.extendedAgentCard` in both public and authenticated extended cards; it does not emit the removed top-level `supportsAuthenticatedExtendedCard` field.
23
+ - The canonical authenticated extended Agent Card HTTP endpoint is `GET /extendedAgentCard`.
24
+
25
+ ## URI Index
26
+
27
+ | Extension | Scope | Disclosure | URI | Section |
28
+ | --- | --- | --- | --- | --- |
29
+ | Shared Session Binding v1 | Shared request metadata | Public + extended | `urn:opencode-a2a:extension:shared:session-binding:v1` | [Shared Session Binding v1](#shared-session-binding-v1) |
30
+ | Shared Model Selection v1 | Shared request metadata | Public + extended | `urn:opencode-a2a:extension:shared:model-selection:v1` | [Shared Model Selection v1](#shared-model-selection-v1) |
31
+ | Shared Stream Hints v1 | Shared response/stream metadata | Public + extended | `urn:opencode-a2a:extension:shared:stream-hints:v1` | [Shared Stream Hints v1](#shared-stream-hints-v1) |
32
+ | Shared Interactive Interrupt v1 | Shared JSON-RPC callback methods | Public + extended | `urn:opencode-a2a:extension:shared:interactive-interrupt:v1` | [Shared Interactive Interrupt v1](#shared-interactive-interrupt-v1) |
33
+ | OpenCode Session Management v1 | Provider-private JSON-RPC methods | Extended only | `urn:opencode-a2a:extension:private:session-management:v1` | [OpenCode Session Management v1](#opencode-session-management-v1) |
34
+ | OpenCode Provider Discovery v1 | Provider-private JSON-RPC methods | Extended only | `urn:opencode-a2a:extension:private:provider-discovery:v1` | [OpenCode Provider Discovery v1](#opencode-provider-discovery-v1) |
35
+ | OpenCode Workspace Control v1 | Provider-private JSON-RPC methods | Extended only | `urn:opencode-a2a:extension:private:workspace-control:v1` | [OpenCode Workspace Control v1](#opencode-workspace-control-v1) |
36
+ | OpenCode Interrupt Recovery v1 | Provider-private JSON-RPC methods | Extended only | `urn:opencode-a2a:extension:private:interrupt-recovery:v1` | [OpenCode Interrupt Recovery v1](#opencode-interrupt-recovery-v1) |
37
+ | A2A Compatibility Profile v1 | Authenticated discovery metadata | Extended only | `urn:opencode-a2a:extension:private:compatibility-profile:v1` | [A2A Compatibility Profile v1](#a2a-compatibility-profile-v1) |
38
+ | A2A Wire Contract v1 | Authenticated discovery metadata | Extended only | `urn:opencode-a2a:extension:private:wire-contract:v1` | [A2A Wire Contract v1](#a2a-wire-contract-v1) |
39
+
40
+ ## Shared Session Binding v1
41
+
42
+ Extension URI: `urn:opencode-a2a:extension:shared:session-binding:v1`
43
+
44
+ - Scope: shared A2A request metadata for rebinding to an existing upstream OpenCode session, plus negotiated response/task session metadata
45
+ - Disclosure: public Agent Card and authenticated extended Agent Card
46
+ - Activation: client requests the URI via `A2A-Extensions` and sends `metadata.shared.session.id`
47
+ - Runtime fields: `metadata.shared.session.id`, `metadata.shared.session`, optional provider-private companions `metadata.opencode.directory` and `metadata.opencode.workspace.id`
48
+ - Dependencies: none declared by this version
49
+ - Security boundary: shared session identity is portable; provider-private routing metadata remains deployment-scoped
50
+ - Versioning: breaking changes require a new versioned URI
51
+
52
+ ## Shared Model Selection v1
53
+
54
+ Extension URI: `urn:opencode-a2a:extension:shared:model-selection:v1`
55
+
56
+ - Scope: shared request-scoped model override for the main chat path
57
+ - Disclosure: public Agent Card and authenticated extended Agent Card
58
+ - Activation: client requests the URI via `A2A-Extensions` and sends `metadata.shared.model`
59
+ - Runtime fields: `metadata.shared.model.providerID`, `metadata.shared.model.modelID`
60
+ - Applies to methods: `SendMessage`, `SendStreamingMessage`
61
+ - Dependencies: none declared by this version
62
+ - Security boundary: request-scoped model preference is shared; provider defaults and auth remain OpenCode deployment concerns
63
+ - Versioning: breaking changes require a new versioned URI
64
+
65
+ ## Shared Stream Hints v1
66
+
67
+ Extension URI: `urn:opencode-a2a:extension:shared:stream-hints:v1`
68
+
69
+ - Scope: shared response/task/stream metadata for block identity, progress, and usage hints
70
+ - Disclosure: public Agent Card and authenticated extended Agent Card
71
+ - Activation: client requests the URI via `A2A-Extensions`; runtime emits shared metadata on streamed events and final task payloads
72
+ - Runtime fields: `metadata.shared.stream`, `metadata.shared.progress`, `metadata.shared.usage`
73
+ - Detailed-only correlation fields: `metadata.shared.stream.message_id` and `metadata.shared.stream.event_id` may be emitted for timeline stitching and diagnostics, but are not part of the minimum public consumer contract
74
+ - Dependencies: none declared by this version
75
+ - Security boundary: this extension is observational metadata only; callback methods are defined by the separate shared interactive interrupt extension
76
+ - Versioning: breaking changes require a new versioned URI
77
+
78
+ ## Shared Interactive Interrupt v1
79
+
80
+ Extension URI: `urn:opencode-a2a:extension:shared:interactive-interrupt:v1`
81
+
82
+ - Scope: shared JSON-RPC callback methods used to answer interactive permission and question interrupts
83
+ - Disclosure: public Agent Card and authenticated extended Agent Card
84
+ - Activation: client requests the URI via `A2A-Extensions` before calling `a2a.interrupt.*` methods
85
+ - Methods: `a2a.interrupt.permission.reply`, `a2a.interrupt.question.reply`, `a2a.interrupt.question.reject`
86
+ - Runtime fields: `metadata.shared.interrupt`, including `metadata.shared.interrupt.request_id` as the callback correlation key
87
+ - Dependencies: none declared by this version
88
+ - Security boundary: the methods are shared, but request IDs remain scoped to authenticated caller identity and local interrupt state
89
+ - Versioning: breaking changes require a new versioned URI
90
+
91
+ ## OpenCode Session Management v1
92
+
93
+ Extension URI: `urn:opencode-a2a:extension:private:session-management:v1`
94
+
95
+ - Scope: OpenCode session read, mutation, and control methods exposed as A2A JSON-RPC extension methods
96
+ - Disclosure: authenticated extended Agent Card only
97
+ - Activation: authenticated client requests the URI via `A2A-Extensions` before calling `opencode.sessions.*`
98
+ - Methods: `opencode.sessions.status`, `list`, `get`, `children`, `todo`, `diff`, `messages.get`, `messages.list`, `prompt_async`, `command`, `fork`, `share`, `unshare`, `summarize`, `revert`, `unrevert`, and deployment-conditional `shell`
99
+ - Dependencies: none declared by this version
100
+ - Security boundary: this extension is provider-private and deployment-scoped; consumers must not treat it as portable A2A baseline behavior
101
+ - Versioning: breaking changes require a new versioned URI
102
+
103
+ ## OpenCode Provider Discovery v1
104
+
105
+ Extension URI: `urn:opencode-a2a:extension:private:provider-discovery:v1`
106
+
107
+ - Scope: OpenCode provider and model discovery methods exposed as A2A JSON-RPC extension methods
108
+ - Disclosure: authenticated extended Agent Card only
109
+ - Activation: authenticated client requests the URI via `A2A-Extensions` before calling `opencode.providers.list` or `opencode.models.list`
110
+ - Methods: `opencode.providers.list`, `opencode.models.list`
111
+ - Dependencies: none declared by this version
112
+ - Security boundary: provider/model catalogs remain OpenCode-specific operational surfaces
113
+ - Versioning: breaking changes require a new versioned URI
114
+
115
+ ## OpenCode Workspace Control v1
116
+
117
+ Extension URI: `urn:opencode-a2a:extension:private:workspace-control:v1`
118
+
119
+ - Scope: OpenCode project, workspace, and worktree discovery/control methods exposed as A2A JSON-RPC extension methods
120
+ - Disclosure: authenticated extended Agent Card only
121
+ - Activation: authenticated client requests the URI via `A2A-Extensions` before calling `opencode.projects.*`, `opencode.workspaces.*`, or `opencode.worktrees.*`
122
+ - Methods: stable project discovery plus experimental workspace/worktree discovery and deployment-conditional mutation methods
123
+ - Dependencies: none declared by this version
124
+ - Security boundary: this extension is provider-private, operator-scoped, and partly deployment-conditional
125
+ - Versioning: breaking changes require a new versioned URI
126
+
127
+ ## OpenCode Interrupt Recovery v1
128
+
129
+ Extension URI: `urn:opencode-a2a:extension:private:interrupt-recovery:v1`
130
+
131
+ - Scope: local interrupt recovery methods exposed as A2A JSON-RPC extension methods
132
+ - Disclosure: authenticated extended Agent Card only
133
+ - Activation: authenticated client requests the URI via `A2A-Extensions` before calling `opencode.permissions.list` or `opencode.questions.list`
134
+ - Methods: `opencode.permissions.list`, `opencode.questions.list`
135
+ - Dependencies: none declared by this version
136
+ - Security boundary: recovery state is adapter-local and scoped to the current authenticated caller
137
+ - Versioning: breaking changes require a new versioned URI
138
+
139
+ ## A2A Compatibility Profile v1
140
+
141
+ Extension URI: `urn:opencode-a2a:extension:private:compatibility-profile:v1`
142
+
143
+ - Scope: authenticated discovery metadata describing protocol support, extension retention, and stable service behaviors
144
+ - Disclosure: authenticated extended Agent Card only
145
+ - Activation: authenticated extended Agent Card discovery
146
+ - Data surface: `protocol_compatibility`, method-retention metadata, deployment profile summary, and declared service behaviors
147
+ - Dependencies: none declared by this version
148
+ - Security boundary: this is deployment-specific contract metadata, not a portable core A2A guarantee
149
+ - Versioning: breaking changes require a new versioned URI
150
+
151
+ ## A2A Wire Contract v1
152
+
153
+ Extension URI: `urn:opencode-a2a:extension:private:wire-contract:v1`
154
+
155
+ - Scope: authenticated discovery metadata describing supported methods, HTTP endpoints, extension URIs, and unified error semantics
156
+ - Disclosure: authenticated extended Agent Card only
157
+ - Activation: authenticated extended Agent Card discovery
158
+ - Data surface: core JSON-RPC methods, core HTTP endpoints, extension JSON-RPC methods, conditional availability, and protocol compatibility summary
159
+ - Dependencies: none declared by this version
160
+ - Security boundary: this is deployment-specific discovery metadata, not an invitation to assume portability of `opencode.*` surfaces
161
+ - Versioning: breaking changes require a new versioned URI