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