agentscore-commerce 2.7.0__tar.gz → 2.7.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.
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/workflows/security.yml +1 -1
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/CLAUDE.md +1 -1
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/PKG-INFO +1 -1
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/how_to_pay.py +2 -2
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/checkout.py +10 -4
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/agentscore_content.py +3 -3
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/llms_txt.py +9 -9
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/openapi.py +2 -2
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/skill_md.py +7 -7
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/pyproject.toml +7 -5
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_skill_md.py +6 -2
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/uv.lock +363 -258
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/dependabot.yml +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/workflows/ci.yml +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/workflows/publish.yml +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.gitignore +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/CODE_OF_CONDUCT.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/CONTRIBUTING.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/LICENSE +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/README.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/SECURITY.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_headers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_mppx_receipt.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_redis.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_warnings.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/gate.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/http_signature.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/jwks.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/request.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/types.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/verify.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/api/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/accepted_methods.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/agent_instructions.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/agent_memory.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/body.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/identity.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/pricing.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/receipt.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/respond_402.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/validation_error.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/checkout_compute_first.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/checkout_hooks.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/bazaar.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/probe.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/redemption_md.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/robots_tag.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/well_known.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/well_known_mpp.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/well_known_x402.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/errors.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/forwarded_proto.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/_denial.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/_response.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/a2a.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/address.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/aiohttp.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/cache.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/core.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/default_denied.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/django.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/fastapi.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/flask.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/middleware.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/policy.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/py.typed +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/sanic.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/sessions.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/signer.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/tokens.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/types.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/ucp.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/ucp_jwks.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/_core.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/aiohttp.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/asgi.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/django.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/fastapi.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/flask.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/sanic.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/amounts.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/compose_rails.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/constants.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/default_rails.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/directive.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/dispatch.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/headers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/idempotency.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/lazy.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/mppx_failures.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/mppx_server.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/network_kind.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/networks.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/payment_header.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/rail_spec.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/rails.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/settlement_override.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/signer.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/solana.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/usdc.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/wwwauthenticate.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402_server.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402_settle.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402_validation.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/zero_settle.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/py.typed +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/quote_cache.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/mppx_stripe.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/pay_to_address.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/payment_intent.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/pi_cache.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/simulate_deposit.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/simulate_dispatch.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/README.md +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/api_provider.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/compliance_merchant.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/compute_first_merchant.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/identity_only.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/multi_rail_merchant.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/per_product_policy_merchant.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/signed_ucp_merchant.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/stripe_multichain_merchant.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/lefthook.yml +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/osv-scanner.toml +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/ruff.toml +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/scripts/regenerate_cross_lang_fixtures.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/__init__.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/conftest.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-agentscore-gate-blocked.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-agentscore-gate-full.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-capability.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-emoji-keys.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-es256-rails.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-extras-int.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-int-boundary.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-minimal.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-multikey.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-unicode.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-agentscore-gate-blocked.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-agentscore-gate-full.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-capability.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-emoji-keys.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-es256-rails.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-extras-int.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-int-boundary.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-minimal.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-multikey.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-unicode.json +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_a2a.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_a2a_jws_roundtrip.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_address.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_agent_memory_emitter.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aiohttp.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_adapters.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_agent_memory.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_checkout.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_gate.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_http_signature.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_jwks.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_presentation.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_request.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_types.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_verify.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_amounts.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_api_reexport.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_cache.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_challenge.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first_adapters.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first_ofac.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first_settle.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_coverage_gaps.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_signer_match.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_wallet_ofac_default.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_classify_orchestration_error.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_compose_rails.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_core.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_coverage_fillers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_credential_precheck.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_default_denied.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_default_rails.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_default_read_only_on_denied.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_denial.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_discovery.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_dispatch.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_django.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_extract_owner_scope.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_fastapi.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_flask.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_forwarded_proto.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_gate_quota_info.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_get_signer_verdict.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_idempotency_helper.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_integration.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_internal_helpers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_lifted_helpers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_load_ucp_signing_key_from_env.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_middleware.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_mppx_failures.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_mppx_receipt.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_network_kind.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_operator_handle.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_pay_to_address.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_directive.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_dispatch.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_handlers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_header.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_headers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_misc.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_servers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_signer.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_policy.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_pricing.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_public_surface.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_quote_cache.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_quote_cache_redis.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_rail_spec.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_rate_limit.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_redis_internal.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_response.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_robots_tag.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_sanic.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_seamless_helpers.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_sessions.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_signer_match.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_signer_verdict_request_scoped.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_simulate_dispatch.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_solana.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_solana_mpp_rail_spec_post_init.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_stripe_multichain.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_tokens.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_ucp.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_ucp_cross_lang.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_ucp_jwks.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_validation_error.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_x402_settle_extra.py +0 -0
- {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_zero_settle.py +0 -0
|
@@ -24,7 +24,7 @@ jobs:
|
|
|
24
24
|
|
|
25
25
|
- name: Install osv-scanner
|
|
26
26
|
run: |
|
|
27
|
-
curl -fsSL https://github.com/google/osv-scanner/releases/download/v2.
|
|
27
|
+
curl -fsSL https://github.com/google/osv-scanner/releases/download/v2.5.1/osv-scanner_linux_arm64 -o osv-scanner
|
|
28
28
|
chmod +x osv-scanner
|
|
29
29
|
|
|
30
30
|
- name: Scan dependencies
|
|
@@ -89,7 +89,7 @@ Two identity types: wallet (`X-Wallet-Address`) and operator-token (`X-Operator-
|
|
|
89
89
|
|
|
90
90
|
### Operator handle: what durable merchant state keys on
|
|
91
91
|
|
|
92
|
-
`get_operator_handle(request)` (per-adapter; Flask takes no argument and reads `g`; `ctx.operator_handle` inside `Checkout` hooks) returns the stable pairwise `oph_...` handle for the ACCOUNT behind the request's operator token.
|
|
92
|
+
`get_operator_handle(request)` (per-adapter; Flask takes no argument and reads `g`; `ctx.operator_handle` inside `Checkout` hooks, readable from `compute_pricing` onward; the gate that populates it runs AFTER `pre_validate`, so a `pre_validate` read is always `None` and zero-settles whatever keys on it) returns the stable pairwise `oph_...` handle for the ACCOUNT behind the request's operator token.
|
|
93
93
|
|
|
94
94
|
**Key state on this, never on the token.** An `opc_` lives 24h and rotates silently off a 90-day refresh, so anything keyed on the token instance is stranded daily, and revoking a leaked token would forfeit a prepaid balance. The handle derives from the account, so rotation, expiry and revocation are all free. It is pairwise per consuming merchant, so the same buyer presents an unrelated handle at every store and handles never correlate across them.
|
|
95
95
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agentscore-commerce
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.2
|
|
4
4
|
Summary: Agentic commerce SDK for Python: identity middleware (FastAPI, Flask, Django, AIOHTTP, Sanic, ASGI) + payment helpers + 402 builders + discovery + Stripe multichain. The full merchant-side toolkit for AgentScore-powered agentic commerce.
|
|
5
5
|
Project-URL: Homepage, https://www.agentscore.com
|
|
6
6
|
Project-URL: Repository, https://github.com/agentscore/python-commerce
|
{agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/how_to_pay.py
RENAMED
|
@@ -104,7 +104,7 @@ async def build_how_to_pay(
|
|
|
104
104
|
"what_it_does": (
|
|
105
105
|
f"Hits this endpoint, receives this same 402, signs the MPP challenge on {network_name}, and "
|
|
106
106
|
"submits the credential back via Authorization: Payment. Either client (tempo request or "
|
|
107
|
-
"agentscore-pay pay --chain tempo) works
|
|
107
|
+
"agentscore-pay pay --chain tempo) works; both run the full MPP handshake."
|
|
108
108
|
),
|
|
109
109
|
}
|
|
110
110
|
if recommend == "both":
|
|
@@ -203,7 +203,7 @@ async def build_how_to_pay(
|
|
|
203
203
|
)
|
|
204
204
|
elif link_cli_blocked:
|
|
205
205
|
stripe_block["note"] = (
|
|
206
|
-
"link-cli SPT path not available for this purchase
|
|
206
|
+
"link-cli SPT path not available for this purchase: Stripe link-cli caps spend requests at $500.00 "
|
|
207
207
|
f"($50000 cents); your total is ${total_num}. Use your own Stripe account with the SharedPaymentToken "
|
|
208
208
|
"API instead."
|
|
209
209
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""High-level Checkout orchestrator; composes 402-emit + verify+settle.
|
|
2
2
|
|
|
3
|
-
The Checkout primitive collapses the
|
|
3
|
+
The Checkout primitive collapses the agentic-commerce dance (emit 402 →
|
|
4
4
|
verify+settle on retry → respond) into a single ``await
|
|
5
5
|
checkout.handle(request)`` call. It services every merchant shape:
|
|
6
6
|
|
|
@@ -30,7 +30,7 @@ Domain-neutral by design: every per-request value is keyed by
|
|
|
30
30
|
``reference_id`` (a UUID minted on first contact). Goods merchants persist
|
|
31
31
|
this as their order id; API merchants treat it as a per-call request id.
|
|
32
32
|
|
|
33
|
-
Usage (goods seller, full
|
|
33
|
+
Usage (goods seller, full agentic-commerce flow)::
|
|
34
34
|
|
|
35
35
|
checkout = Checkout(
|
|
36
36
|
rails={
|
|
@@ -349,6 +349,12 @@ class CheckoutContext:
|
|
|
349
349
|
survives the token rotating, expiring or being revoked, whereas state keyed on the token
|
|
350
350
|
instance is stranded every time one rotates. ``None`` when no gate is configured, on
|
|
351
351
|
wallet or AIT paths, on anonymous discovery legs, or when the API has no handle salt.
|
|
352
|
+
|
|
353
|
+
ORDERING: populated by the gate, which runs AFTER ``pre_validate``, so it is readable
|
|
354
|
+
from ``compute_pricing`` onward (``mint_recipients``, ``compose_mppx``, ``on_settled``
|
|
355
|
+
included) and ALWAYS ``None`` inside ``pre_validate``. A ``pre_validate`` read passes
|
|
356
|
+
every keyless-dev test and zero-settles every production request whose flow keys on it
|
|
357
|
+
(a live store shipped exactly that).
|
|
352
358
|
"""
|
|
353
359
|
capture_wallet: Callable[..., Any] | None = None
|
|
354
360
|
"""Capture the signer wallet under the operator credential the gate resolved
|
|
@@ -805,7 +811,7 @@ def _strip_payment_headers_from_raw(raw: Any) -> Any:
|
|
|
805
811
|
|
|
806
812
|
|
|
807
813
|
class Checkout:
|
|
808
|
-
"""High-level
|
|
814
|
+
"""High-level agentic-commerce orchestrator.
|
|
809
815
|
|
|
810
816
|
Composes :func:`build_accepted_methods`, :func:`build_how_to_pay`,
|
|
811
817
|
:func:`respond_402`, :func:`verify_x402_request`, and
|
|
@@ -1110,7 +1116,7 @@ class Checkout:
|
|
|
1110
1116
|
return None
|
|
1111
1117
|
|
|
1112
1118
|
async def handle(self, request: CheckoutRequest) -> CheckoutResult:
|
|
1113
|
-
"""One-call
|
|
1119
|
+
"""One-call agentic-commerce flow.
|
|
1114
1120
|
|
|
1115
1121
|
* x402 ``X-Payment`` header present → verify, settle via ``x402_server``,
|
|
1116
1122
|
run ``on_settled`` hook, return 200 with the hook's body (or
|
|
@@ -101,7 +101,7 @@ def build_agentscore_onboarding_steps(
|
|
|
101
101
|
compatible_fragment = ", ".join(hint for rail, hint in compatible_hints if rail in accepted_rails)
|
|
102
102
|
|
|
103
103
|
compatible_clients_clause = (
|
|
104
|
-
f"the rails table also lists per-rail `compatible_clients
|
|
104
|
+
f"the rails table also lists per-rail `compatible_clients`: {compatible_fragment}. "
|
|
105
105
|
if compatible_fragment
|
|
106
106
|
else ""
|
|
107
107
|
)
|
|
@@ -114,7 +114,7 @@ def build_agentscore_onboarding_steps(
|
|
|
114
114
|
)
|
|
115
115
|
bootstrap_step = (
|
|
116
116
|
"First-run only: bootstrap wallet + Passport. Run `agentscore-pay agent-guide --json` "
|
|
117
|
-
"for the canonical cold-start path
|
|
117
|
+
"for the canonical cold-start path; it walks `agentscore-pay init` "
|
|
118
118
|
"(creates keystore + per-chain wallet), `agentscore-pay passport login` "
|
|
119
119
|
f"(one-time KYC{'; required for this merchant' if requires_kyc else ''}; "
|
|
120
120
|
"the human completes a verify URL once and pay caches the operator_token), "
|
|
@@ -123,7 +123,7 @@ def build_agentscore_onboarding_steps(
|
|
|
123
123
|
)
|
|
124
124
|
stripe_fallback_step = (
|
|
125
125
|
"If your only payment method is a Stripe / Link card (no crypto), install `@stripe/link-cli` "
|
|
126
|
-
"instead of agentscore-pay and use it on the SPT rail. Identity gating still applies
|
|
126
|
+
"instead of agentscore-pay and use it on the SPT rail. Identity gating still applies: the "
|
|
127
127
|
"merchant's 403 with `verify_url` lets you bootstrap a Passport even with no crypto wallet involved."
|
|
128
128
|
)
|
|
129
129
|
returning_user_step = (
|
{agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/llms_txt.py
RENAMED
|
@@ -28,7 +28,7 @@ def llms_txt_identity_section(
|
|
|
28
28
|
aip_bullet = ""
|
|
29
29
|
if aip:
|
|
30
30
|
aip_bullet = (
|
|
31
|
-
"\n- **`Agent-Identity: <JWT>` + RFC 9421 signature
|
|
31
|
+
"\n- **`Agent-Identity: <JWT>` + RFC 9421 signature**: present an Agent Identity Token (AIP) "
|
|
32
32
|
"from a trusted issuer (AgentScore is always trusted). Short-lived and bound to your key; sign "
|
|
33
33
|
"the request (`Signature-Input` + `Signature` over `@method @authority @path agent-identity`, "
|
|
34
34
|
"tag `agent-identity`) to prove possession. No long-lived token on the wire. Mint one with "
|
|
@@ -50,13 +50,13 @@ def llms_txt_identity_section(
|
|
|
50
50
|
compliance_note = f"\n\nCompliance: {', '.join(parts)}."
|
|
51
51
|
return (
|
|
52
52
|
"## Identity\n\n"
|
|
53
|
-
"AgentScore identity is reusable across every AgentScore-gated merchant
|
|
53
|
+
"AgentScore identity is reusable across every AgentScore-gated merchant: one KYC, "
|
|
54
54
|
"no re-verification per site. Pick a header:\n\n"
|
|
55
|
-
"- **`X-Wallet-Address: 0x...` or base58
|
|
55
|
+
"- **`X-Wallet-Address: 0x...` or base58**: works on signing rails (Tempo, x402, "
|
|
56
56
|
"Solana MPP). The wallet you claim must sign the payment.\n"
|
|
57
|
-
"- **`X-Operator-Token: opc_
|
|
57
|
+
"- **`X-Operator-Token: opc_...`**: works on every rail, including Stripe SPT. "
|
|
58
58
|
f"Reusable across AgentScore merchants until expiry.{aip_bullet}\n"
|
|
59
|
-
"- **Neither
|
|
59
|
+
"- **Neither**: you get a 403 with `verify_url`. Complete the session flow once and "
|
|
60
60
|
f"reuse the resulting `opc_...` everywhere.{compliance_note}"
|
|
61
61
|
)
|
|
62
62
|
|
|
@@ -103,22 +103,22 @@ def _llms_txt_payment_section_compact(*, rails: list[str], app_url: str) -> str:
|
|
|
103
103
|
rails_list = list(rails)
|
|
104
104
|
if _has_rail_family(rails_list, "tempo-"):
|
|
105
105
|
lines.append(
|
|
106
|
-
"- **Tempo USDC via MPP
|
|
106
|
+
"- **Tempo USDC via MPP**: "
|
|
107
107
|
f"`tempo request -X POST -H \"X-Operator-Token: opc_...\" --json '{{...}}' --max-spend N {app_url}`"
|
|
108
108
|
)
|
|
109
109
|
if _has_rail_family(rails_list, "x402-base-"):
|
|
110
110
|
lines.append(
|
|
111
|
-
f"- **x402 USDC on Base** (EIP-3009)
|
|
111
|
+
f"- **x402 USDC on Base** (EIP-3009): `agentscore-pay pay POST {app_url} --chain base "
|
|
112
112
|
"-H \"X-Operator-Token: opc_...\" -d '{...}'`"
|
|
113
113
|
)
|
|
114
114
|
if _has_rail_family(rails_list, "mpp-solana-"):
|
|
115
115
|
lines.append(
|
|
116
|
-
f"- **USDC on Solana
|
|
116
|
+
f"- **USDC on Solana**: `agentscore-pay pay POST {app_url} --chain solana "
|
|
117
117
|
"-H \"X-Operator-Token: opc_...\" -d '{...}'`"
|
|
118
118
|
)
|
|
119
119
|
if "stripe-spt" in rails_list:
|
|
120
120
|
lines.append(
|
|
121
|
-
"- **Stripe Shared Payment Token
|
|
121
|
+
"- **Stripe Shared Payment Token**: agent mints SPT (own Stripe account scoped to networkId, "
|
|
122
122
|
"OR `link-cli spend-request create --credential-type shared_payment_token --network-id "
|
|
123
123
|
"<profileId> ...`)"
|
|
124
124
|
)
|
{agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/openapi.py
RENAMED
|
@@ -233,7 +233,7 @@ def agentscore_denial_schemas() -> dict[str, Any]:
|
|
|
233
233
|
"token_expired → deliver_verify_url_and_poll, invalid_credential → "
|
|
234
234
|
"switch_token_or_restart_session, wallet_signer_mismatch → resign_or_switch_to_operator_token, "
|
|
235
235
|
"wallet_auth_requires_wallet_signing → switch_to_operator_token, wallet_not_trusted → "
|
|
236
|
-
"contact_support
|
|
236
|
+
"contact_support, for UNFIXABLE compliance only (sanctions/age/jurisdiction_restricted); "
|
|
237
237
|
"fixable reasons re-route to identity_verification_required, payment_required → contact_merchant)."
|
|
238
238
|
),
|
|
239
239
|
},
|
|
@@ -255,7 +255,7 @@ def agentscore_denial_schemas() -> dict[str, Any]:
|
|
|
255
255
|
"description": (
|
|
256
256
|
"Present for missing_identity / identity_verification_required / token_expired "
|
|
257
257
|
"denials. Agent shares this with the user to complete KYC or claim a wallet. "
|
|
258
|
-
"Not present on wallet_not_trusted (UNFIXABLE compliance
|
|
258
|
+
"Not present on wallet_not_trusted (UNFIXABLE compliance, so re-verification "
|
|
259
259
|
"won't change the outcome)."
|
|
260
260
|
),
|
|
261
261
|
},
|
{agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/skill_md.py
RENAMED
|
@@ -124,7 +124,7 @@ _RAIL_NOTES: dict[str, str] = {
|
|
|
124
124
|
"USDC (SPL). Use `agentscore-pay pay --chain solana`; MPP credential goes in `Authorization: Payment`."
|
|
125
125
|
),
|
|
126
126
|
"stripe": (
|
|
127
|
-
"Card via Link wallet. Use `@stripe/link-cli
|
|
127
|
+
"Card via Link wallet. Use `@stripe/link-cli`; `agentscore-pay` emits the "
|
|
128
128
|
"handoff hint when this rail is picked."
|
|
129
129
|
),
|
|
130
130
|
}
|
|
@@ -141,7 +141,7 @@ def _validate(input: _SkillCtx) -> None:
|
|
|
141
141
|
raise ValueError(f"build_skill_md: name must be 1-{_NAME_MAX} characters (got {len(n) if n else 0})")
|
|
142
142
|
if not _NAME_RE.match(n):
|
|
143
143
|
raise ValueError(
|
|
144
|
-
f'build_skill_md: name "{n}" is invalid
|
|
144
|
+
f'build_skill_md: name "{n}" is invalid: must be lowercase alphanumeric and hyphens, '
|
|
145
145
|
"no leading/trailing/consecutive hyphens (agentskills.io spec)"
|
|
146
146
|
)
|
|
147
147
|
if not input.description:
|
|
@@ -232,7 +232,7 @@ def _payment_section(input: _SkillCtx) -> str:
|
|
|
232
232
|
clients[r] = defaults.get(r, [])
|
|
233
233
|
rows = ["| Rail | Notes | Compatible clients |", "|---|---|---|"]
|
|
234
234
|
for r in input.accepted_rails:
|
|
235
|
-
client_list = ", ".join(clients.get(r, [])) or "
|
|
235
|
+
client_list = ", ".join(clients.get(r, [])) or "none"
|
|
236
236
|
rows.append(f"| **{_RAIL_LABELS[r]}** | {_RAIL_NOTES[r]} | {client_list} |")
|
|
237
237
|
intro = (
|
|
238
238
|
"Each gated route returns a 402 with `WWW-Authenticate` + `PAYMENT-REQUIRED` "
|
|
@@ -276,12 +276,12 @@ def _identity_section(input: _SkillCtx) -> str:
|
|
|
276
276
|
"\n\nThis merchant accepts AIP Agent Identity Tokens. If you hold an AIT from a trusted issuer "
|
|
277
277
|
"(AgentScore is always trusted), present the JWT in an `Agent-Identity` header plus an RFC 9421 "
|
|
278
278
|
"HTTP Message Signature (`Signature-Input` + `Signature` over `@method @authority @path agent-identity`, "
|
|
279
|
-
"tag `agent-identity`) signed with the token-bound cnf key
|
|
279
|
+
"tag `agent-identity`) signed with the token-bound cnf key, satisfying identity in one round trip, "
|
|
280
280
|
"no separate AgentScore credential needed. `agentscore-pay pay --identity aip` does this automatically."
|
|
281
281
|
)
|
|
282
282
|
denial_note = (
|
|
283
|
-
"Denial bodies carry an `agent_instructions` block describing the recovery action "
|
|
284
|
-
"
|
|
283
|
+
"Denial bodies carry an `agent_instructions` block describing the recovery action. "
|
|
284
|
+
"Read the `action` field and follow it. See the identity-bootstrap skill for the "
|
|
285
285
|
"canonical denial-code → action table."
|
|
286
286
|
)
|
|
287
287
|
return "\n".join(
|
|
@@ -375,7 +375,7 @@ def build_skill_md(
|
|
|
375
375
|
support_links: list[SkillMdLink] | None = None,
|
|
376
376
|
refresh_footer: bool = True,
|
|
377
377
|
) -> str:
|
|
378
|
-
"""Render an agentskills.io-compatible ``skill.md`` for an
|
|
378
|
+
"""Render an agentskills.io-compatible ``skill.md`` for an agentic-commerce merchant.
|
|
379
379
|
|
|
380
380
|
Output is YAML frontmatter (``name`` / ``description`` / optional ``license`` /
|
|
381
381
|
``compatibility`` / ``allowed-tools`` / ``metadata``) followed by markdown sections
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "agentscore-commerce"
|
|
7
|
-
version = "2.7.
|
|
7
|
+
version = "2.7.2"
|
|
8
8
|
description = "Agentic commerce SDK for Python: identity middleware (FastAPI, Flask, Django, AIOHTTP, Sanic, ASGI) + payment helpers + 402 builders + discovery + Stripe multichain. The full merchant-side toolkit for AgentScore-powered agentic commerce."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -108,7 +108,9 @@ filterwarnings = [
|
|
|
108
108
|
|
|
109
109
|
[tool.uv]
|
|
110
110
|
required-version = ">=0.11.0"
|
|
111
|
-
#
|
|
112
|
-
#
|
|
113
|
-
#
|
|
114
|
-
|
|
111
|
+
# cdp-sdk, pytempo and x402 all require `web3` with no upper bound, so a bare
|
|
112
|
+
# `uv lock --upgrade` walks onto whatever is newest, including a prerelease.
|
|
113
|
+
# It did: web3 8.0.0b3 landed in this lock, and a published SDK must not ship a
|
|
114
|
+
# beta to every consumer. Disallow prereleases outright rather than pinning one
|
|
115
|
+
# package, since the same unbounded shape exists on several transitives.
|
|
116
|
+
prerelease = "disallow"
|
|
@@ -253,12 +253,16 @@ class TestPaymentSection:
|
|
|
253
253
|
assert "rogue-cli" not in out
|
|
254
254
|
assert "Stripe Shared Payment Token" not in out
|
|
255
255
|
|
|
256
|
-
def
|
|
256
|
+
def test_renders_none_when_clients_empty(self) -> None:
|
|
257
|
+
# "none" rather than an em-dash: this table is served on every store's
|
|
258
|
+
# skill.md, and the org rule bars em-dashes on external surfaces. Kept
|
|
259
|
+
# identical to the Node SDK, which renders the same table.
|
|
257
260
|
cfg = _base()
|
|
258
261
|
cfg["accepted_rails"] = ["x402_base"]
|
|
259
262
|
cfg["compatible_clients"] = {"x402_base": []}
|
|
260
263
|
out = build_skill_md(**cfg)
|
|
261
|
-
assert re.search("x402 on Base
|
|
264
|
+
assert re.search(r"x402 on Base.+\| none", out)
|
|
265
|
+
assert "—" not in out
|
|
262
266
|
|
|
263
267
|
|
|
264
268
|
class TestIdentitySection:
|