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.
Files changed (250) hide show
  1. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/workflows/security.yml +1 -1
  2. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/CLAUDE.md +1 -1
  3. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/PKG-INFO +1 -1
  4. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/how_to_pay.py +2 -2
  5. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/checkout.py +10 -4
  6. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/agentscore_content.py +3 -3
  7. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/llms_txt.py +9 -9
  8. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/openapi.py +2 -2
  9. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/skill_md.py +7 -7
  10. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/pyproject.toml +7 -5
  11. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_skill_md.py +6 -2
  12. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/uv.lock +363 -258
  13. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  14. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  15. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/dependabot.yml +0 -0
  17. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/workflows/ci.yml +0 -0
  18. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.github/workflows/publish.yml +0 -0
  19. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/.gitignore +0 -0
  20. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/CODE_OF_CONDUCT.md +0 -0
  21. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/CONTRIBUTING.md +0 -0
  22. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/LICENSE +0 -0
  23. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/README.md +0 -0
  24. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/SECURITY.md +0 -0
  25. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/__init__.py +0 -0
  26. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_headers.py +0 -0
  27. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_mppx_receipt.py +0 -0
  28. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_redis.py +0 -0
  29. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/_warnings.py +0 -0
  30. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/__init__.py +0 -0
  31. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/gate.py +0 -0
  32. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/http_signature.py +0 -0
  33. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/jwks.py +0 -0
  34. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/request.py +0 -0
  35. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/types.py +0 -0
  36. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/aip/verify.py +0 -0
  37. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/api/__init__.py +0 -0
  38. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/__init__.py +0 -0
  39. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/accepted_methods.py +0 -0
  40. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/agent_instructions.py +0 -0
  41. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/agent_memory.py +0 -0
  42. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/body.py +0 -0
  43. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/identity.py +0 -0
  44. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/pricing.py +0 -0
  45. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/receipt.py +0 -0
  46. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/respond_402.py +0 -0
  47. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/challenge/validation_error.py +0 -0
  48. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/checkout_compute_first.py +0 -0
  49. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/checkout_hooks.py +0 -0
  50. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/__init__.py +0 -0
  51. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/bazaar.py +0 -0
  52. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/probe.py +0 -0
  53. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/redemption_md.py +0 -0
  54. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/robots_tag.py +0 -0
  55. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/well_known.py +0 -0
  56. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/well_known_mpp.py +0 -0
  57. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/discovery/well_known_x402.py +0 -0
  58. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/errors.py +0 -0
  59. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/forwarded_proto.py +0 -0
  60. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/__init__.py +0 -0
  61. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/_denial.py +0 -0
  62. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/_response.py +0 -0
  63. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/a2a.py +0 -0
  64. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/address.py +0 -0
  65. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/aiohttp.py +0 -0
  66. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/cache.py +0 -0
  67. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/core.py +0 -0
  68. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/default_denied.py +0 -0
  69. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/django.py +0 -0
  70. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/fastapi.py +0 -0
  71. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/flask.py +0 -0
  72. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/middleware.py +0 -0
  73. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/policy.py +0 -0
  74. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/py.typed +0 -0
  75. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/sanic.py +0 -0
  76. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/sessions.py +0 -0
  77. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/signer.py +0 -0
  78. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/tokens.py +0 -0
  79. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/types.py +0 -0
  80. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/ucp.py +0 -0
  81. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/identity/ucp_jwks.py +0 -0
  82. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/__init__.py +0 -0
  83. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/_core.py +0 -0
  84. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/aiohttp.py +0 -0
  85. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/asgi.py +0 -0
  86. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/django.py +0 -0
  87. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/fastapi.py +0 -0
  88. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/flask.py +0 -0
  89. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/middleware/sanic.py +0 -0
  90. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/__init__.py +0 -0
  91. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/amounts.py +0 -0
  92. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/compose_rails.py +0 -0
  93. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/constants.py +0 -0
  94. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/default_rails.py +0 -0
  95. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/directive.py +0 -0
  96. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/dispatch.py +0 -0
  97. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/headers.py +0 -0
  98. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/idempotency.py +0 -0
  99. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/lazy.py +0 -0
  100. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/mppx_failures.py +0 -0
  101. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/mppx_server.py +0 -0
  102. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/network_kind.py +0 -0
  103. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/networks.py +0 -0
  104. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/payment_header.py +0 -0
  105. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/rail_spec.py +0 -0
  106. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/rails.py +0 -0
  107. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/settlement_override.py +0 -0
  108. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/signer.py +0 -0
  109. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/solana.py +0 -0
  110. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/usdc.py +0 -0
  111. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/wwwauthenticate.py +0 -0
  112. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402.py +0 -0
  113. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402_server.py +0 -0
  114. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402_settle.py +0 -0
  115. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/x402_validation.py +0 -0
  116. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/payment/zero_settle.py +0 -0
  117. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/py.typed +0 -0
  118. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/quote_cache.py +0 -0
  119. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/__init__.py +0 -0
  120. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/mppx_stripe.py +0 -0
  121. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/pay_to_address.py +0 -0
  122. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/payment_intent.py +0 -0
  123. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/pi_cache.py +0 -0
  124. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/simulate_deposit.py +0 -0
  125. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/agentscore_commerce/stripe_multichain/simulate_dispatch.py +0 -0
  126. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/README.md +0 -0
  127. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/api_provider.py +0 -0
  128. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/compliance_merchant.py +0 -0
  129. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/compute_first_merchant.py +0 -0
  130. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/identity_only.py +0 -0
  131. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/multi_rail_merchant.py +0 -0
  132. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/per_product_policy_merchant.py +0 -0
  133. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/signed_ucp_merchant.py +0 -0
  134. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/examples/stripe_multichain_merchant.py +0 -0
  135. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/lefthook.yml +0 -0
  136. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/osv-scanner.toml +0 -0
  137. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/ruff.toml +0 -0
  138. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/scripts/regenerate_cross_lang_fixtures.py +0 -0
  139. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/__init__.py +0 -0
  140. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/conftest.py +0 -0
  141. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-agentscore-gate-blocked.json +0 -0
  142. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-agentscore-gate-full.json +0 -0
  143. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-capability.json +0 -0
  144. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-emoji-keys.json +0 -0
  145. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-es256-rails.json +0 -0
  146. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-extras-int.json +0 -0
  147. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-int-boundary.json +0 -0
  148. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-minimal.json +0 -0
  149. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-multikey.json +0 -0
  150. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/node-unicode.json +0 -0
  151. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-agentscore-gate-blocked.json +0 -0
  152. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-agentscore-gate-full.json +0 -0
  153. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-capability.json +0 -0
  154. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-emoji-keys.json +0 -0
  155. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-es256-rails.json +0 -0
  156. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-extras-int.json +0 -0
  157. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-int-boundary.json +0 -0
  158. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-minimal.json +0 -0
  159. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-multikey.json +0 -0
  160. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/fixtures/cross-lang/py-unicode.json +0 -0
  161. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_a2a.py +0 -0
  162. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_a2a_jws_roundtrip.py +0 -0
  163. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_address.py +0 -0
  164. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_agent_memory_emitter.py +0 -0
  165. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aiohttp.py +0 -0
  166. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_adapters.py +0 -0
  167. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_agent_memory.py +0 -0
  168. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_checkout.py +0 -0
  169. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_gate.py +0 -0
  170. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_http_signature.py +0 -0
  171. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_jwks.py +0 -0
  172. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_presentation.py +0 -0
  173. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_request.py +0 -0
  174. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_types.py +0 -0
  175. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_aip_verify.py +0 -0
  176. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_amounts.py +0 -0
  177. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_api_reexport.py +0 -0
  178. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_cache.py +0 -0
  179. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_challenge.py +0 -0
  180. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout.py +0 -0
  181. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first.py +0 -0
  182. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first_adapters.py +0 -0
  183. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first_ofac.py +0 -0
  184. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_compute_first_settle.py +0 -0
  185. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_coverage_gaps.py +0 -0
  186. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_signer_match.py +0 -0
  187. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_checkout_wallet_ofac_default.py +0 -0
  188. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_classify_orchestration_error.py +0 -0
  189. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_compose_rails.py +0 -0
  190. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_core.py +0 -0
  191. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_coverage_fillers.py +0 -0
  192. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_credential_precheck.py +0 -0
  193. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_default_denied.py +0 -0
  194. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_default_rails.py +0 -0
  195. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_default_read_only_on_denied.py +0 -0
  196. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_denial.py +0 -0
  197. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_discovery.py +0 -0
  198. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_dispatch.py +0 -0
  199. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_django.py +0 -0
  200. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_extract_owner_scope.py +0 -0
  201. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_fastapi.py +0 -0
  202. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_flask.py +0 -0
  203. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_forwarded_proto.py +0 -0
  204. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_gate_quota_info.py +0 -0
  205. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_get_signer_verdict.py +0 -0
  206. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_idempotency_helper.py +0 -0
  207. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_integration.py +0 -0
  208. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_internal_helpers.py +0 -0
  209. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_lifted_helpers.py +0 -0
  210. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_load_ucp_signing_key_from_env.py +0 -0
  211. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_middleware.py +0 -0
  212. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_mppx_failures.py +0 -0
  213. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_mppx_receipt.py +0 -0
  214. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_network_kind.py +0 -0
  215. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_operator_handle.py +0 -0
  216. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_pay_to_address.py +0 -0
  217. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_directive.py +0 -0
  218. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_dispatch.py +0 -0
  219. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_handlers.py +0 -0
  220. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_header.py +0 -0
  221. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_headers.py +0 -0
  222. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_misc.py +0 -0
  223. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_servers.py +0 -0
  224. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_payment_signer.py +0 -0
  225. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_policy.py +0 -0
  226. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_pricing.py +0 -0
  227. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_public_surface.py +0 -0
  228. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_quote_cache.py +0 -0
  229. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_quote_cache_redis.py +0 -0
  230. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_rail_spec.py +0 -0
  231. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_rate_limit.py +0 -0
  232. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_redis_internal.py +0 -0
  233. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_response.py +0 -0
  234. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_robots_tag.py +0 -0
  235. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_sanic.py +0 -0
  236. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_seamless_helpers.py +0 -0
  237. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_sessions.py +0 -0
  238. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_signer_match.py +0 -0
  239. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_signer_verdict_request_scoped.py +0 -0
  240. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_simulate_dispatch.py +0 -0
  241. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_solana.py +0 -0
  242. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_solana_mpp_rail_spec_post_init.py +0 -0
  243. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_stripe_multichain.py +0 -0
  244. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_tokens.py +0 -0
  245. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_ucp.py +0 -0
  246. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_ucp_cross_lang.py +0 -0
  247. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_ucp_jwks.py +0 -0
  248. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_validation_error.py +0 -0
  249. {agentscore_commerce-2.7.0 → agentscore_commerce-2.7.2}/tests/test_x402_settle_extra.py +0 -0
  250. {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.4.0/osv-scanner_linux_arm64 -o osv-scanner
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.0
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
@@ -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 — both run the full MPP handshake."
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 — Stripe link-cli caps spend requests at $500.00 "
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 agent-commerce dance (emit 402 →
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 agent-commerce flow)::
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 agent-commerce orchestrator.
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 agent-commerce flow.
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` — {compatible_fragment}. "
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 — it walks `agentscore-pay init` "
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 — the "
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 = (
@@ -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** — present an Agent Identity Token (AIP) "
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 — one KYC, "
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** — works on signing rails (Tempo, x402, "
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_...`** — works on every rail, including Stripe SPT. "
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** — you get a 403 with `verify_url`. Complete the session flow once and "
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) — `agentscore-pay pay POST {app_url} --chain base "
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** — `agentscore-pay pay POST {app_url} --chain 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** — agent mints SPT (own Stripe account scoped to networkId, "
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
  )
@@ -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 — UNFIXABLE compliance only (sanctions/age/jurisdiction_restricted); "
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 — re-verification "
258
+ "Not present on wallet_not_trusted (UNFIXABLE compliance, so re-verification "
259
259
  "won't change the outcome)."
260
260
  ),
261
261
  },
@@ -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` — `agentscore-pay` emits the "
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 — must be lowercase alphanumeric and hyphens, '
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 — it satisfies identity in one round trip, "
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
- "— read the `action` field and follow it. See the identity-bootstrap skill for the "
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 agent-commerce merchant.
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.0"
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
- # fastapi 0.136.3 is a malicious release (MAL-2026-4750): it injects an
112
- # undocumented `fastar` typosquat dependency. Pin away from it until a clean
113
- # release supersedes it on PyPI.
114
- constraint-dependencies = ["fastapi!=0.136.3"]
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 test_renders_em_dash_when_clients_empty(self) -> None:
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.+\\| —", out)
264
+ assert re.search(r"x402 on Base.+\| none", out)
265
+ assert "—" not in out
262
266
 
263
267
 
264
268
  class TestIdentitySection: