opencode-a2a 0.8.2__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.
- opencode_a2a-1.0.0/MANIFEST.in +1 -0
- {opencode_a2a-0.8.2/src/opencode_a2a.egg-info → opencode_a2a-1.0.0}/PKG-INFO +22 -13
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/README.md +19 -11
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/docs/compatibility.md +15 -15
- opencode_a2a-1.0.0/docs/conformance-triage.md +32 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/docs/conformance.md +2 -2
- opencode_a2a-1.0.0/docs/extension-specifications.md +161 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/docs/guide.md +113 -98
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/pyproject.toml +10 -2
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/README.md +1 -0
- opencode_a2a-1.0.0/scripts/find_thin_wrappers.py +367 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/smoke_test_built_cli.sh +24 -10
- opencode_a2a-1.0.0/src/opencode_a2a/a2a_protocol.py +9 -0
- opencode_a2a-1.0.0/src/opencode_a2a/a2a_utils.py +96 -0
- opencode_a2a-1.0.0/src/opencode_a2a/cli.py +307 -0
- opencode_a2a-1.0.0/src/opencode_a2a/client/agent_card.py +43 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/client/client.py +149 -158
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/client/config.py +0 -26
- opencode_a2a-1.0.0/src/opencode_a2a/client/error_mapping.py +261 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/client/errors.py +0 -13
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/client/payload_text.py +34 -27
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/client/polling.py +3 -6
- opencode_a2a-1.0.0/src/opencode_a2a/client/request_context.py +94 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/config.py +1 -48
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/__init__.py +60 -0
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/capabilities.py +142 -0
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/catalog.py +664 -0
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/compatibility.py +421 -0
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/contract_docs.py +79 -0
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/identifiers.py +94 -0
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/private_params.py +251 -0
- opencode_a2a-1.0.0/src/opencode_a2a/contracts/extensions/public_params.py +279 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/coordinator.py +75 -63
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/executor.py +93 -130
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/session_manager.py +7 -5
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/stream_events.py +7 -42
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/stream_runtime.py +117 -71
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/stream_state.py +39 -29
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/tool_error_mapping.py +5 -9
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/tool_orchestration.py +12 -20
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/upstream_error_translator.py +21 -31
- opencode_a2a-1.0.0/src/opencode_a2a/extension_negotiation.py +118 -0
- opencode_a2a-1.0.0/src/opencode_a2a/jsonrpc/application.py +405 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/dispatch.py +19 -4
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/error_responses.py +23 -47
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/common.py +2 -32
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/interrupt_callbacks.py +16 -16
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/interrupt_queries.py +1 -1
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/provider_discovery.py +8 -6
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/session_control.py +14 -16
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/session_lifecycle.py +40 -61
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/session_queries.py +25 -22
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/workspace_control.py +1 -1
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/methods.py +9 -9
- opencode_a2a-1.0.0/src/opencode_a2a/jsonrpc/models.py +32 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/params.py +21 -34
- opencode_a2a-1.0.0/src/opencode_a2a/metadata_access.py +58 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/opencode_upstream_client.py +5 -8
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/output_modes.py +167 -82
- opencode_a2a-1.0.0/src/opencode_a2a/parts/mapping.py +133 -0
- opencode_a2a-1.0.0/src/opencode_a2a/protocol_versions.py +48 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/agent_card.py +82 -173
- opencode_a2a-1.0.0/src/opencode_a2a/server/application.py +1069 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/client_manager.py +0 -3
- opencode_a2a-1.0.0/src/opencode_a2a/server/context_helpers.py +97 -0
- opencode_a2a-1.0.0/src/opencode_a2a/server/database.py +44 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/lifespan.py +19 -14
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/middleware.py +70 -122
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/migrations.py +17 -1
- opencode_a2a-1.0.0/src/opencode_a2a/server/openapi.py +359 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/request_parsing.py +0 -43
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/rest_tasks.py +117 -86
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/state_store.py +55 -36
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/task_store.py +101 -170
- opencode_a2a-1.0.0/src/opencode_a2a/server/task_store_sdk_compat.py +272 -0
- opencode_a2a-1.0.0/src/opencode_a2a/task_states.py +12 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/upstream_taxonomy.py +8 -15
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0/src/opencode_a2a.egg-info}/PKG-INFO +22 -13
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/SOURCES.txt +21 -3
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/requires.txt +2 -1
- opencode_a2a-1.0.0/tests/client/test_agent_card.py +42 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/client/test_client_config.py +0 -8
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/client/test_client_facade.py +184 -122
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/client/test_error_mapping.py +17 -13
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/client/test_payload_text.py +6 -11
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/client/test_polling.py +4 -4
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/client/test_request_context.py +55 -11
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/config/test_settings.py +6 -25
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/contracts/test_extension_contract_consistency.py +211 -109
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_agent_errors.py +74 -54
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_agent_helpers.py +32 -28
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_cancellation.py +6 -4
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_directory_validation.py +2 -1
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_metrics.py +26 -8
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_multipart_input.py +16 -20
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_opencode_agent_session_binding.py +52 -97
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_session_ownership.py +6 -4
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_blocks.py +10 -5
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_core.py +236 -61
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_interrupts.py +55 -19
- opencode_a2a-1.0.0/tests/jsonrpc/test_application_dispatch.py +389 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_dispatch_registry.py +87 -62
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_error_responses.py +21 -28
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_jsonrpc_methods.py +1 -1
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_jsonrpc_unsupported_method.py +28 -26
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_commands.py +89 -47
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_interrupts.py +70 -38
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_lifecycle.py +33 -18
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_prompt_async.py +74 -44
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_session_extension_queries.py +81 -68
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_opencode_workspace_control_extension.py +27 -18
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/package/test_typing_contract.py +8 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/profile/test_profile_runtime.py +5 -4
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/scripts/test_script_health_contract.py +17 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_a2a_client_manager.py +0 -8
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_agent_card.py +96 -98
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_app_behaviors.py +713 -136
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_call_context_builder.py +6 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_cancel_contract.py +92 -55
- opencode_a2a-1.0.0/tests/server/test_cli.py +134 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_database_app_persistence.py +5 -4
- opencode_a2a-1.0.0/tests/server/test_output_negotiation.py +451 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_state_store.py +114 -1
- opencode_a2a-1.0.0/tests/server/test_task_store_factory.py +843 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_transport_contract.py +543 -127
- opencode_a2a-1.0.0/tests/support/async_iterators.py +17 -0
- opencode_a2a-1.0.0/tests/support/fake_client_errors.py +21 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/support/helpers.py +55 -13
- opencode_a2a-1.0.0/tests/support/jsonrpc_error_assertions.py +84 -0
- opencode_a2a-1.0.0/tests/support/session_extensions.py +46 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/support/streaming_output.py +9 -6
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/uv.lock +304 -172
- opencode_a2a-0.8.2/docs/conformance-triage.md +0 -89
- opencode_a2a-0.8.2/docs/extension-specifications.md +0 -105
- opencode_a2a-0.8.2/src/opencode_a2a/cli.py +0 -97
- opencode_a2a-0.8.2/src/opencode_a2a/client/agent_card.py +0 -86
- opencode_a2a-0.8.2/src/opencode_a2a/client/error_mapping.py +0 -148
- opencode_a2a-0.8.2/src/opencode_a2a/client/request_context.py +0 -80
- opencode_a2a-0.8.2/src/opencode_a2a/contracts/extensions.py +0 -1752
- opencode_a2a-0.8.2/src/opencode_a2a/execution/request_context.py +0 -88
- opencode_a2a-0.8.2/src/opencode_a2a/invocation.py +0 -30
- opencode_a2a-0.8.2/src/opencode_a2a/jsonrpc/application.py +0 -269
- opencode_a2a-0.8.2/src/opencode_a2a/metadata_access.py +0 -39
- opencode_a2a-0.8.2/src/opencode_a2a/parts/mapping.py +0 -151
- opencode_a2a-0.8.2/src/opencode_a2a/protocol_versions.py +0 -103
- opencode_a2a-0.8.2/src/opencode_a2a/server/application.py +0 -736
- opencode_a2a-0.8.2/src/opencode_a2a/server/openapi.py +0 -713
- opencode_a2a-0.8.2/src/opencode_a2a/task_states.py +0 -12
- opencode_a2a-0.8.2/tests/client/test_agent_card.py +0 -82
- opencode_a2a-0.8.2/tests/server/test_cli.py +0 -67
- opencode_a2a-0.8.2/tests/server/test_output_negotiation.py +0 -217
- opencode_a2a-0.8.2/tests/server/test_task_store_factory.py +0 -453
- opencode_a2a-0.8.2/tests/support/session_extensions.py +0 -19
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/.github/dependabot.yml +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/.github/workflows/dependency-review.yml +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/.github/workflows/publish.yml +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/.github/workflows/validate.yml +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/.gitignore +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/.pre-commit-config.yaml +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/.secrets.baseline +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/AGENTS.md +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/CODE_OF_CONDUCT.md +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/CONTRIBUTING.md +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/LICENSE +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/SECURITY.md +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/SUPPORT.md +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/docs/architecture.md +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/docs/maintainer-architecture.md +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/check_coverage.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/conformance.sh +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/dependency_health.sh +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/doctor.sh +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/health_common.sh +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/scripts/lint.sh +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/setup.cfg +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/auth.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/client/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/client/auth.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/contracts/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/event_helpers.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/execution/metrics.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/jsonrpc/handlers/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/parsing.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/parts/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/parts/text.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/profile/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/profile/runtime.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/py.typed +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/runtime_state.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/sandbox_policy.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/server/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a/trace_context.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/dependency_links.txt +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/entry_points.txt +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/src/opencode_a2a.egg-info/top_level.txt +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/client/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/config/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/conftest.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/contracts/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_session_lock_lifecycle.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/execution/test_streaming_output_contract_logging.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/jsonrpc/test_jsonrpc_params.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/package/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/package/test_logging.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/package/test_version.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/parts/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/parts/test_parts_text.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/profile/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/scripts/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/server/test_auth.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/support/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/test_metadata_access.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/test_trace_context.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/upstream/__init__.py +0 -0
- {opencode_a2a-0.8.2 → opencode_a2a-1.0.0}/tests/upstream/test_opencode_upstream_client_params.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.
|
|
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.
|
|
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 -->|
|
|
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 -->|
|
|
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,
|
|
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
|
-
-
|
|
139
|
-
-
|
|
140
|
-
- `0.3`
|
|
141
|
-
-
|
|
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 -->|
|
|
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 -->|
|
|
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,
|
|
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
|
-
-
|
|
98
|
-
-
|
|
99
|
-
- `0.3`
|
|
100
|
-
-
|
|
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
|
|
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: `
|
|
9
|
-
-
|
|
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
|
|
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
|
|
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
|
|
29
|
-
- Treat `urn:a2a
|
|
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
|
-
-
|
|
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
|
-
- `
|
|
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 /
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
63
|
-
- Some failures may come from
|
|
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
|