agirails 2.3.2__tar.gz → 3.0.1__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 (336) hide show
  1. agirails-3.0.1/.github/workflows/release-pypi.yml +178 -0
  2. {agirails-2.3.2 → agirails-3.0.1}/.github/workflows/test.yml +127 -3
  3. {agirails-2.3.2 → agirails-3.0.1}/.gitignore +5 -0
  4. agirails-3.0.1/CHANGELOG.md +519 -0
  5. agirails-3.0.1/PKG-INFO +229 -0
  6. agirails-3.0.1/README.md +169 -0
  7. {agirails-2.3.2 → agirails-3.0.1}/pyproject.toml +59 -8
  8. agirails-3.0.1/scripts/generate_parity_vectors.js +167 -0
  9. agirails-3.0.1/scripts/generate_python_parity_vectors.py +181 -0
  10. agirails-3.0.1/scripts/test_installed_wheel.sh +158 -0
  11. agirails-3.0.1/scripts/verify_python_vectors.js +203 -0
  12. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/__init__.py +70 -0
  13. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/actp_kernel.json +186 -49
  14. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/base.py +31 -0
  15. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/basic.py +44 -0
  16. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/standard.py +43 -1
  17. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/api/agirails_app.py +60 -0
  18. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/builders/__init__.py +28 -0
  19. agirails-3.0.1/src/agirails/builders/counter_accept.py +346 -0
  20. agirails-3.0.1/src/agirails/builders/counter_offer.py +533 -0
  21. agirails-3.0.1/src/agirails/cli/commands/claim_code.py +215 -0
  22. agirails-3.0.1/src/agirails/cli/commands/repair.py +273 -0
  23. agirails-3.0.1/src/agirails/cli/commands/request.py +228 -0
  24. agirails-3.0.1/src/agirails/cli/commands/serve.py +145 -0
  25. agirails-3.0.1/src/agirails/cli/commands/verify.py +394 -0
  26. agirails-3.0.1/src/agirails/cli/lib/run_request.py +367 -0
  27. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/main.py +20 -0
  28. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/client.py +314 -13
  29. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/networks.py +46 -9
  30. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/provider.py +41 -4
  31. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/agent.py +41 -4
  32. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/agent_registry.py +21 -2
  33. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/kernel.py +34 -6
  34. agirails-3.0.1/src/agirails/receipts/__init__.py +25 -0
  35. agirails-3.0.1/src/agirails/receipts/web_receipt.py +364 -0
  36. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/blockchain_runtime.py +60 -5
  37. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/mock_runtime.py +32 -3
  38. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/types.py +49 -1
  39. agirails-3.0.1/src/agirails/server/__init__.py +72 -0
  40. agirails-3.0.1/src/agirails/server/app.py +132 -0
  41. agirails-3.0.1/src/agirails/server/policy.py +168 -0
  42. agirails-3.0.1/src/agirails/server/policy_engine.py +156 -0
  43. agirails-3.0.1/src/agirails/server/quote_channel.py +309 -0
  44. agirails-3.0.1/src/agirails/settle/__init__.py +5 -0
  45. agirails-3.0.1/src/agirails/settle/settle_on_interact.py +91 -0
  46. agirails-3.0.1/src/agirails/version.py +4 -0
  47. agirails-3.0.1/src/agirails/wallet/smart_wallet_router.py +413 -0
  48. agirails-3.0.1/tests/fixtures/cross_sdk/counter_accept_basic.json +20 -0
  49. agirails-3.0.1/tests/fixtures/cross_sdk/counter_accept_mainnet.json +20 -0
  50. agirails-3.0.1/tests/fixtures/cross_sdk/counter_offer_basic.json +25 -0
  51. agirails-3.0.1/tests/fixtures/cross_sdk/counter_offer_with_justification.json +32 -0
  52. agirails-3.0.1/tests/fixtures/cross_sdk/manifest.json +13 -0
  53. agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_accept_basic.json +20 -0
  54. agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_accept_mainnet.json +20 -0
  55. agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_offer_basic.json +25 -0
  56. agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_offer_with_justification.json +32 -0
  57. agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_manifest.json +13 -0
  58. agirails-3.0.1/tests/integration_sepolia/conftest.py +107 -0
  59. agirails-3.0.1/tests/integration_sepolia/test_eoa_runtime_lifecycle.py +181 -0
  60. agirails-3.0.1/tests/integration_sepolia/test_full_lifecycle.py +153 -0
  61. agirails-3.0.1/tests/integration_sepolia/test_kernel_state_after_timelock.py +54 -0
  62. agirails-3.0.1/tests/integration_sepolia/test_smart_wallet_lifecycle.py +255 -0
  63. agirails-3.0.1/tests/integration_sepolia/test_web_receipts_live.py +171 -0
  64. agirails-3.0.1/tests/test_builders/test_counter_offer.py +307 -0
  65. agirails-3.0.1/tests/test_builders/test_counter_schema_branches.py +291 -0
  66. agirails-3.0.1/tests/test_cli/test_claim_code.py +175 -0
  67. agirails-3.0.1/tests/test_cli/test_repair.py +191 -0
  68. agirails-3.0.1/tests/test_cli/test_request.py +358 -0
  69. agirails-3.0.1/tests/test_cli/test_verify.py +248 -0
  70. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli_deploy/test_deploy.py +8 -1
  71. {agirails-2.3.2 → agirails-3.0.1}/tests/test_client.py +191 -0
  72. agirails-3.0.1/tests/test_client_paths.py +116 -0
  73. agirails-3.0.1/tests/test_cross_sdk/test_aip21_parity.py +248 -0
  74. agirails-3.0.1/tests/test_cross_sdk/test_python_signed_determinism.py +203 -0
  75. agirails-3.0.1/tests/test_golden/__init__.py +0 -0
  76. agirails-3.0.1/tests/test_golden/test_canonical_hashes.py +166 -0
  77. agirails-3.0.1/tests/test_level1/test_agent_hash_routing.py +145 -0
  78. agirails-3.0.1/tests/test_negotiation/__init__.py +0 -0
  79. agirails-3.0.1/tests/test_properties/test_canonical_json_properties.py +107 -0
  80. agirails-3.0.1/tests/test_properties/test_signing_properties.py +145 -0
  81. agirails-3.0.1/tests/test_properties/test_stateful_lifecycle.py +251 -0
  82. agirails-3.0.1/tests/test_properties/test_usdc_and_state_properties.py +157 -0
  83. {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_networks.py +8 -4
  84. agirails-3.0.1/tests/test_receipts/__init__.py +0 -0
  85. agirails-3.0.1/tests/test_receipts/test_web_receipt.py +303 -0
  86. agirails-3.0.1/tests/test_runtime/__init__.py +0 -0
  87. agirails-3.0.1/tests/test_runtime/test_blockchain_scan_window.py +146 -0
  88. agirails-3.0.1/tests/test_server/__init__.py +0 -0
  89. agirails-3.0.1/tests/test_server/conftest.py +24 -0
  90. agirails-3.0.1/tests/test_server/test_actp_serve.py +400 -0
  91. agirails-3.0.1/tests/test_server/test_serve_e2e.py +239 -0
  92. agirails-3.0.1/tests/test_settle/__init__.py +0 -0
  93. agirails-3.0.1/tests/test_settle/test_settle_on_interact.py +168 -0
  94. {agirails-2.3.2 → agirails-3.0.1}/tests/test_types/test_message.py +1 -22
  95. agirails-3.0.1/tests/test_utils/__init__.py +0 -0
  96. {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_auto_wallet_provider.py +3 -3
  97. agirails-3.0.1/tests/test_wallet/test_smart_wallet_router.py +258 -0
  98. agirails-3.0.1/tests/test_wallet/test_smart_wallet_router_edges.py +227 -0
  99. {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_transaction_batcher.py +3 -3
  100. agirails-2.3.2/CHANGELOG.md +0 -113
  101. agirails-2.3.2/PKG-INFO +0 -226
  102. agirails-2.3.2/README.md +0 -170
  103. agirails-2.3.2/src/agirails/abis/eas.json +0 -110
  104. agirails-2.3.2/src/agirails/config/abis/AgentRegistry.json +0 -782
  105. agirails-2.3.2/src/agirails/version.py +0 -4
  106. {agirails-2.3.2 → agirails-3.0.1}/.env.example +0 -0
  107. {agirails-2.3.2 → agirails-3.0.1}/LICENSE +0 -0
  108. {agirails-2.3.2 → agirails-3.0.1}/MIGRATION.md +0 -0
  109. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/agent_registry.json +0 -0
  110. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/escrow_vault.json +0 -0
  111. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/usdc.json +0 -0
  112. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/__init__.py +0 -0
  113. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/adapter_registry.py +0 -0
  114. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/adapter_router.py +0 -0
  115. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/i_adapter.py +0 -0
  116. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/types.py +0 -0
  117. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/x402_adapter.py +0 -0
  118. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/api/__init__.py +0 -0
  119. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/api/discover.py +0 -0
  120. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/builders/delivery_proof.py +0 -0
  121. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/builders/quote.py +0 -0
  122. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/__init__.py +0 -0
  123. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/__init__.py +0 -0
  124. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/autopublish.py +0 -0
  125. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/balance.py +0 -0
  126. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/batch.py +0 -0
  127. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/claim.py +0 -0
  128. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/config.py +0 -0
  129. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/deploy_check.py +0 -0
  130. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/deploy_env.py +0 -0
  131. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/diff.py +0 -0
  132. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/find.py +0 -0
  133. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/health.py +0 -0
  134. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/init.py +0 -0
  135. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/mint.py +0 -0
  136. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/negotiate.py +0 -0
  137. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/pay.py +0 -0
  138. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/publish.py +0 -0
  139. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/pull.py +0 -0
  140. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/receipt.py +0 -0
  141. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/register.py +0 -0
  142. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/simulate.py +0 -0
  143. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/test.py +0 -0
  144. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/time.py +0 -0
  145. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/tx.py +0 -0
  146. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/watch.py +0 -0
  147. {agirails-2.3.2/tests → agirails-3.0.1/src/agirails/cli/lib}/__init__.py +0 -0
  148. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/__init__.py +0 -0
  149. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/client.py +0 -0
  150. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/output.py +0 -0
  151. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/validation.py +0 -0
  152. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/__init__.py +0 -0
  153. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/agirailsmd.py +0 -0
  154. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/on_chain_state.py +0 -0
  155. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/pending_publish.py +0 -0
  156. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/publish_pipeline.py +0 -0
  157. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/sync_operations.py +0 -0
  158. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/erc8004/__init__.py +0 -0
  159. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/erc8004/bridge.py +0 -0
  160. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/erc8004/reputation_reporter.py +0 -0
  161. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/__init__.py +0 -0
  162. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/agent.py +0 -0
  163. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/base.py +0 -0
  164. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/mock.py +0 -0
  165. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/network.py +0 -0
  166. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/storage.py +0 -0
  167. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/transaction.py +0 -0
  168. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/validation.py +0 -0
  169. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/__init__.py +0 -0
  170. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/directory.py +0 -0
  171. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/provide.py +0 -0
  172. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/request.py +0 -0
  173. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/__init__.py +0 -0
  174. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/config.py +0 -0
  175. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/job.py +0 -0
  176. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/pricing.py +0 -0
  177. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/__init__.py +0 -0
  178. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/buyer_orchestrator.py +0 -0
  179. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/decision_engine.py +0 -0
  180. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/policy_engine.py +0 -0
  181. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/session_store.py +0 -0
  182. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/__init__.py +0 -0
  183. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/base.py +0 -0
  184. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/did.py +0 -0
  185. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/eas.py +0 -0
  186. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/escrow.py +0 -0
  187. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/events.py +0 -0
  188. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/messages.py +0 -0
  189. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/nonce.py +0 -0
  190. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/proofs.py +0 -0
  191. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/py.typed +0 -0
  192. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/__init__.py +0 -0
  193. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/base.py +0 -0
  194. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/mock_state_manager.py +0 -0
  195. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/__init__.py +0 -0
  196. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/archive_bundle_builder.py +0 -0
  197. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/arweave_client.py +0 -0
  198. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/filebase_client.py +0 -0
  199. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/types.py +0 -0
  200. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/__init__.py +0 -0
  201. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/did.py +0 -0
  202. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/erc8004.py +0 -0
  203. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/message.py +0 -0
  204. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/transaction.py +0 -0
  205. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/x402.py +0 -0
  206. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/__init__.py +0 -0
  207. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/canonical_json.py +0 -0
  208. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/circuit_breaker.py +0 -0
  209. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/helpers.py +0 -0
  210. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/logger.py +0 -0
  211. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/logging.py +0 -0
  212. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/nonce_tracker.py +0 -0
  213. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/received_nonce_tracker.py +0 -0
  214. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/retry.py +0 -0
  215. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/secure_nonce.py +0 -0
  216. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/security.py +0 -0
  217. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/semaphore.py +0 -0
  218. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/used_attestation_tracker.py +0 -0
  219. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/validation.py +0 -0
  220. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/__init__.py +0 -0
  221. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/__init__.py +0 -0
  222. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/bundler_client.py +0 -0
  223. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/constants.py +0 -0
  224. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/dual_nonce_manager.py +0 -0
  225. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/paymaster_client.py +0 -0
  226. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/transaction_batcher.py +0 -0
  227. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/user_op_builder.py +0 -0
  228. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/auto_wallet_provider.py +0 -0
  229. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/eoa_wallet_provider.py +0 -0
  230. {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/keystore.py +0 -0
  231. {agirails-2.3.2/tests/integration → agirails-3.0.1/tests}/__init__.py +0 -0
  232. {agirails-2.3.2 → agirails-3.0.1}/tests/benchmarks/__init__.py +0 -0
  233. {agirails-2.3.2 → agirails-3.0.1}/tests/benchmarks/test_performance.py +0 -0
  234. {agirails-2.3.2 → agirails-3.0.1}/tests/conftest.py +0 -0
  235. {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/canonical_json.json +0 -0
  236. {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/delivery_proof.json +0 -0
  237. {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/eip712.json +0 -0
  238. {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/service_hash.json +0 -0
  239. {agirails-2.3.2/tests/test_adapters → agirails-3.0.1/tests/integration}/__init__.py +0 -0
  240. {agirails-2.3.2 → agirails-3.0.1}/tests/integration/test_blockchain_runtime.py +0 -0
  241. {agirails-2.3.2 → agirails-3.0.1}/tests/integration/test_e2e_sepolia.py +0 -0
  242. {agirails-2.3.2 → agirails-3.0.1}/tests/integration/test_eas.py +0 -0
  243. {agirails-2.3.2/tests/test_api → agirails-3.0.1/tests/integration_sepolia}/__init__.py +0 -0
  244. {agirails-2.3.2/tests/test_cli → agirails-3.0.1/tests/test_adapters}/__init__.py +0 -0
  245. {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_adapter_router.py +0 -0
  246. {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_basic.py +0 -0
  247. {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_standard.py +0 -0
  248. {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_x402_adapter.py +0 -0
  249. {agirails-2.3.2/tests/test_config → agirails-3.0.1/tests/test_api}/__init__.py +0 -0
  250. {agirails-2.3.2 → agirails-3.0.1}/tests/test_api/test_agirails_app.py +0 -0
  251. {agirails-2.3.2 → agirails-3.0.1}/tests/test_builders/__init__.py +0 -0
  252. {agirails-2.3.2 → agirails-3.0.1}/tests/test_builders/test_delivery_proof.py +0 -0
  253. {agirails-2.3.2 → agirails-3.0.1}/tests/test_builders/test_quote.py +0 -0
  254. {agirails-2.3.2/tests/test_negotiation → agirails-3.0.1/tests/test_cli}/__init__.py +0 -0
  255. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_autopublish.py +0 -0
  256. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_claim.py +0 -0
  257. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_cli_original.py +0 -0
  258. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_e2e_publish_claim_discover.py +0 -0
  259. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_find.py +0 -0
  260. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_health.py +0 -0
  261. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_publish.py +0 -0
  262. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_publish_parity.py +0 -0
  263. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_receipt.py +0 -0
  264. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_register.py +0 -0
  265. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_test.py +0 -0
  266. {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli_deploy/__init__.py +0 -0
  267. {agirails-2.3.2/tests/test_runtime → agirails-3.0.1/tests/test_config}/__init__.py +0 -0
  268. {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_agirailsmd.py +0 -0
  269. {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_networks_aa.py +0 -0
  270. {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_on_chain_state.py +0 -0
  271. {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_pending_publish.py +0 -0
  272. {agirails-2.3.2/tests/test_utils → agirails-3.0.1/tests/test_cross_sdk}/__init__.py +0 -0
  273. {agirails-2.3.2 → agirails-3.0.1}/tests/test_erc8004/__init__.py +0 -0
  274. {agirails-2.3.2 → agirails-3.0.1}/tests/test_erc8004/test_bridge.py +0 -0
  275. {agirails-2.3.2 → agirails-3.0.1}/tests/test_erc8004/test_reputation_reporter.py +0 -0
  276. {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/__init__.py +0 -0
  277. {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_agent.py +0 -0
  278. {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_base.py +0 -0
  279. {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_network.py +0 -0
  280. {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_transaction.py +0 -0
  281. {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_transient_rpc.py +0 -0
  282. {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_validation.py +0 -0
  283. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/__init__.py +0 -0
  284. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/test_directory.py +0 -0
  285. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/test_provider.py +0 -0
  286. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/test_request.py +0 -0
  287. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/__init__.py +0 -0
  288. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/test_agent_lifecycle.py +0 -0
  289. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/test_config.py +0 -0
  290. {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/test_pricing.py +0 -0
  291. {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_buyer_orchestrator.py +0 -0
  292. {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_decision_engine.py +0 -0
  293. {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_policy_engine.py +0 -0
  294. {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_session_store.py +0 -0
  295. {agirails-2.3.2 → agirails-3.0.1}/tests/test_packaging/__init__.py +0 -0
  296. {agirails-2.3.2 → agirails-3.0.1}/tests/test_packaging/test_smoke.py +0 -0
  297. {agirails-2.3.2 → agirails-3.0.1}/tests/test_parity.py +0 -0
  298. {agirails-2.3.2 → agirails-3.0.1}/tests/test_properties/__init__.py +0 -0
  299. {agirails-2.3.2 → agirails-3.0.1}/tests/test_properties/test_state_machine.py +0 -0
  300. {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/__init__.py +0 -0
  301. {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_contract_base.py +0 -0
  302. {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_did.py +0 -0
  303. {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_eas_verification.py +0 -0
  304. {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_proofs.py +0 -0
  305. {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_accept_quote.py +0 -0
  306. {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_concurrent_file_locking.py +0 -0
  307. {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_mock_runtime.py +0 -0
  308. {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_mock_state_manager.py +0 -0
  309. {agirails-2.3.2 → agirails-3.0.1}/tests/test_security/__init__.py +0 -0
  310. {agirails-2.3.2 → agirails-3.0.1}/tests/test_security/test_security_audit.py +0 -0
  311. {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/__init__.py +0 -0
  312. {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/conftest.py +0 -0
  313. {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_archive_bundle_builder.py +0 -0
  314. {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_arweave_client.py +0 -0
  315. {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_filebase_client.py +0 -0
  316. {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_types.py +0 -0
  317. {agirails-2.3.2 → agirails-3.0.1}/tests/test_types/__init__.py +0 -0
  318. {agirails-2.3.2 → agirails-3.0.1}/tests/test_types/test_transaction.py +0 -0
  319. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_attestation_replay.py +0 -0
  320. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_circuit_breaker.py +0 -0
  321. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_helpers.py +0 -0
  322. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_helpers_extended.py +0 -0
  323. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_nonce_tracker.py +0 -0
  324. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_nonce_tracker_extended.py +0 -0
  325. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_received_nonce_tracker_extended.py +0 -0
  326. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_retry.py +0 -0
  327. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_secure_nonce_concurrency.py +0 -0
  328. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_security.py +0 -0
  329. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_security_extended.py +0 -0
  330. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_validation.py +0 -0
  331. {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_validation_extended.py +0 -0
  332. {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/__init__.py +0 -0
  333. {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_bundler_client.py +0 -0
  334. {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_dual_nonce_manager.py +0 -0
  335. {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_keystore.py +0 -0
  336. {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_user_op_builder.py +0 -0
@@ -0,0 +1,178 @@
1
+ name: Publish to PyPI
2
+
3
+ # OIDC trusted-publisher workflow (PEP 740 + PyPI Trusted Publishers).
4
+ # No long-lived API tokens stored in repo secrets — GitHub mints a
5
+ # short-lived OIDC token at runtime, the pypa/gh-action-pypi-publish
6
+ # action exchanges it with PyPI's Trusted Publisher endpoint for a
7
+ # one-time upload privilege scoped to this exact workflow run.
8
+ #
9
+ # ──────────────────────────────────────────────────────────────────────────────
10
+ # PyPI side — ONE-TIME SETUP per publisher
11
+ #
12
+ # TestPyPI (https://test.pypi.org/manage/account/publishing/):
13
+ # - "Add a new pending publisher"
14
+ # - PyPI project name: agirails
15
+ # - Owner: agirails
16
+ # - Repository name: sdk-python
17
+ # - Workflow filename: release-pypi.yml
18
+ # - Environment name: testpypi
19
+ #
20
+ # PyPI (https://pypi.org/manage/project/agirails/settings/publishing/):
21
+ # - "Add a new trusted publisher" (project already exists from 2.0.0+)
22
+ # - Owner: agirails
23
+ # - Repository name: sdk-python
24
+ # - Workflow filename: release-pypi.yml
25
+ # - Environment name: pypi
26
+ #
27
+ # GitHub side — ONE-TIME SETUP
28
+ # Settings → Environments:
29
+ # - Create "testpypi" (no protections needed)
30
+ # - Create "pypi" (recommend: required reviewers = repo admin)
31
+ #
32
+ # ──────────────────────────────────────────────────────────────────────────────
33
+ # How to release
34
+ #
35
+ # Beta (b1, b2, …, rcN):
36
+ # git tag v3.0.0b1
37
+ # git push origin v3.0.0b1
38
+ # → Workflow auto-publishes to TestPyPI only.
39
+ #
40
+ # Stable:
41
+ # git tag v3.0.0
42
+ # git push origin v3.0.0
43
+ # → Workflow publishes to TestPyPI automatically.
44
+ # → For PyPI: open Actions tab → "Publish to PyPI" → "Run workflow"
45
+ # → target=pypi → click Run. Environment gate requires reviewer
46
+ # approval before the upload step actually runs.
47
+ #
48
+ # Emergency (manual trigger for either target):
49
+ # Actions tab → workflow_dispatch with target=testpypi or pypi
50
+ #
51
+ # Pre-release detection: a version is considered pre-release if it
52
+ # contains "a", "b", or "rc" per PEP 440 (e.g. 3.0.0b1, 3.0.0rc2).
53
+
54
+ on:
55
+ push:
56
+ tags:
57
+ - 'v*'
58
+ workflow_dispatch:
59
+ inputs:
60
+ target:
61
+ description: 'Publish target'
62
+ required: true
63
+ type: choice
64
+ default: testpypi
65
+ options:
66
+ - testpypi
67
+ - pypi
68
+
69
+ permissions:
70
+ contents: read
71
+
72
+ jobs:
73
+ build:
74
+ name: Build wheel + sdist
75
+ runs-on: ubuntu-latest
76
+ outputs:
77
+ version: ${{ steps.version.outputs.version }}
78
+ is_prerelease: ${{ steps.version.outputs.is_prerelease }}
79
+ steps:
80
+ - uses: actions/checkout@v4
81
+
82
+ - name: Set up Python
83
+ uses: actions/setup-python@v5
84
+ with:
85
+ python-version: '3.11'
86
+
87
+ - name: Install build
88
+ run: python -m pip install --upgrade build
89
+
90
+ - name: Build distribution
91
+ run: python -m build
92
+
93
+ - name: Extract version
94
+ id: version
95
+ run: |
96
+ VERSION=$(python -c "import tomllib; print(tomllib.loads(open('pyproject.toml','rb').read().decode())['project']['version'])")
97
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
98
+ # PEP 440 pre-release markers.
99
+ if [[ "$VERSION" =~ (a|b|rc)[0-9]+ ]]; then
100
+ echo "is_prerelease=true" >> "$GITHUB_OUTPUT"
101
+ else
102
+ echo "is_prerelease=false" >> "$GITHUB_OUTPUT"
103
+ fi
104
+ echo "Built version: $VERSION"
105
+
106
+ - name: Verify tag matches version
107
+ if: github.event_name == 'push'
108
+ run: |
109
+ TAG="${GITHUB_REF#refs/tags/v}"
110
+ VERSION="${{ steps.version.outputs.version }}"
111
+ if [[ "$TAG" != "$VERSION" ]]; then
112
+ echo "::error::Tag v$TAG does not match pyproject.toml version $VERSION"
113
+ exit 1
114
+ fi
115
+
116
+ - name: Upload artifacts
117
+ uses: actions/upload-artifact@v4
118
+ with:
119
+ name: dist
120
+ path: dist/
121
+ if-no-files-found: error
122
+
123
+ testpypi:
124
+ name: Publish to TestPyPI
125
+ needs: build
126
+ runs-on: ubuntu-latest
127
+ # Runs on every tag push AND on every workflow_dispatch (both
128
+ # testpypi and pypi targets). A pypi run gets a TestPyPI smoke
129
+ # publish first — the pypi job depends on this succeeding.
130
+ if: |
131
+ github.event_name == 'push' ||
132
+ github.event_name == 'workflow_dispatch'
133
+ environment:
134
+ name: testpypi
135
+ url: https://test.pypi.org/project/agirails/${{ needs.build.outputs.version }}/
136
+ permissions:
137
+ id-token: write # OIDC token issuance
138
+ steps:
139
+ - name: Download artifacts
140
+ uses: actions/download-artifact@v4
141
+ with:
142
+ name: dist
143
+ path: dist/
144
+
145
+ - name: Publish to TestPyPI
146
+ uses: pypa/gh-action-pypi-publish@release/v1
147
+ with:
148
+ repository-url: https://test.pypi.org/legacy/
149
+ # Skip if a duplicate upload would error — useful when re-running
150
+ # a failed workflow that already uploaded.
151
+ skip-existing: true
152
+
153
+ pypi:
154
+ name: Publish to PyPI
155
+ # Gate on a green TestPyPI publish — stable upload cannot bypass
156
+ # the TestPyPI smoke step (defence-in-depth).
157
+ needs: [build, testpypi]
158
+ runs-on: ubuntu-latest
159
+ # Live PyPI: workflow_dispatch with target=pypi (forces manual gate even
160
+ # for stable tags). Beta versions can NOT be auto-promoted by accident.
161
+ if: |
162
+ github.event_name == 'workflow_dispatch' && github.event.inputs.target == 'pypi'
163
+ environment:
164
+ name: pypi
165
+ url: https://pypi.org/project/agirails/${{ needs.build.outputs.version }}/
166
+ permissions:
167
+ id-token: write
168
+ steps:
169
+ - name: Download artifacts
170
+ uses: actions/download-artifact@v4
171
+ with:
172
+ name: dist
173
+ path: dist/
174
+
175
+ - name: Publish to PyPI
176
+ uses: pypa/gh-action-pypi-publish@release/v1
177
+ with:
178
+ skip-existing: true
@@ -16,6 +16,11 @@ on:
16
16
  - 'pyproject.toml'
17
17
  - '.github/workflows/test.yml'
18
18
  workflow_dispatch: # Allow manual trigger
19
+ schedule:
20
+ # Weekly mutation testing — Mondays at 03:00 UTC. The mutmut job is
21
+ # the only consumer of this trigger; other jobs ignore it via the
22
+ # `if: github.event_name == ...` guards on each job.
23
+ - cron: '0 3 * * 1'
19
24
 
20
25
  env:
21
26
  PYTHON_VERSION: '3.11'
@@ -50,8 +55,12 @@ jobs:
50
55
 
51
56
  - name: Run unit tests
52
57
  run: |
58
+ # integration_sepolia is also marker-gated in pyproject.toml,
59
+ # but ignore the dir explicitly so the runner doesn't even
60
+ # collect them (saves seconds + clearer "X deselected" output).
53
61
  pytest tests/ \
54
62
  --ignore=tests/integration/ \
63
+ --ignore=tests/integration_sepolia/ \
55
64
  --ignore=tests/benchmarks/ \
56
65
  -v \
57
66
  --tb=short \
@@ -217,13 +226,26 @@ jobs:
217
226
  python -m pip install --upgrade pip
218
227
  pip install -e ".[dev]"
219
228
 
220
- - name: Run parity tests
229
+ - name: Run parity tests (Python-only fixtures)
221
230
  run: |
222
231
  pytest tests/test_parity.py -v --tb=short
223
232
 
224
- - name: Run fixture-based parity tests
233
+ - name: Run cross-SDK parity tests (TS-signed → Python verify)
234
+ # tests/test_cross_sdk/ uses pre-generated JSON fixtures in
235
+ # tests/fixtures/cross_sdk/ that are produced by the TypeScript
236
+ # SDK's CounterOfferBuilder/CounterAcceptBuilder. Fixtures are
237
+ # committed to the repo; no Node setup needed at CI time.
238
+ # To regenerate (after any wire-format change), run locally:
239
+ # NODE_PATH=../sdk-js/node_modules node scripts/generate_parity_vectors.js
225
240
  run: |
226
- pytest tests/fixtures/ -v --tb=short || true
241
+ pytest tests/test_cross_sdk/ -v --tb=short
242
+
243
+ - name: Run golden hash snapshots
244
+ # Pinned bytes32 outputs for canonical-JSON + builder.compute_hash.
245
+ # If anyone silently changes serialization, this fails before
246
+ # integrators see broken transactions.
247
+ run: |
248
+ pytest tests/test_golden/ -v --tb=short
227
249
 
228
250
  # =============================================================================
229
251
  # Integration Tests (Requires Anvil - Push only)
@@ -386,3 +408,105 @@ jobs:
386
408
  needs.test-security.result == 'failure' ||
387
409
  needs.lint.result == 'failure'
388
410
  run: exit 1
411
+
412
+ # =============================================================================
413
+ # Live Base sepolia — manual gate only.
414
+ #
415
+ # Runs the gated `integration_sepolia` test suite against the real
416
+ # Base sepolia kernel (0x9d25…0021b). Costs 1-5 sepolia txes per
417
+ # full run, signed by the wallet whose keystore + password are
418
+ # supplied as repo secrets.
419
+ #
420
+ # Required secrets:
421
+ # ACTP_KEY_PASSWORD — keystore decryption password
422
+ # ACTP_KEYSTORE_BASE64 — base64-encoded keystore JSON (committed
423
+ # keystore-file path doesn't exist in CI)
424
+ # =============================================================================
425
+ live-sepolia:
426
+ name: Live Base sepolia integration
427
+ runs-on: ubuntu-latest
428
+ timeout-minutes: 20
429
+ if: github.event_name == 'workflow_dispatch'
430
+ needs: test-fast
431
+
432
+ steps:
433
+ - uses: actions/checkout@v4
434
+
435
+ - name: Set up Python
436
+ uses: actions/setup-python@v5
437
+ with:
438
+ python-version: ${{ env.PYTHON_VERSION }}
439
+ cache: 'pip'
440
+
441
+ - name: Install dependencies
442
+ run: |
443
+ python -m pip install --upgrade pip
444
+ pip install -e ".[dev]"
445
+
446
+ - name: Materialize keystore from secret
447
+ env:
448
+ ACTP_KEYSTORE_BASE64: ${{ secrets.ACTP_KEYSTORE_BASE64 }}
449
+ run: |
450
+ if [ -z "$ACTP_KEYSTORE_BASE64" ]; then
451
+ echo "::error::ACTP_KEYSTORE_BASE64 secret not configured; skipping live tests"
452
+ exit 78 # neutral skip
453
+ fi
454
+ mkdir -p ~/.actp/mainnet-deployer
455
+ echo "$ACTP_KEYSTORE_BASE64" | base64 -d > ~/.actp/mainnet-deployer/deployer
456
+ chmod 600 ~/.actp/mainnet-deployer/deployer
457
+
458
+ - name: Run live sepolia integration
459
+ env:
460
+ ACTP_KEY_PASSWORD: ${{ secrets.ACTP_KEY_PASSWORD }}
461
+ run: |
462
+ pytest tests/integration_sepolia/ \
463
+ -m integration_sepolia \
464
+ -v --tb=short
465
+
466
+ # =============================================================================
467
+ # Mutation testing — weekly schedule + manual.
468
+ #
469
+ # mutmut introduces small code mutations (negate condition, swap
470
+ # operator, etc.) and re-runs the test suite. Each "survived"
471
+ # mutation means our tests didn't catch a behaviour change — points
472
+ # at gaps in test coverage that line coverage alone can't see.
473
+ # Configured in pyproject.toml [tool.mutmut].
474
+ # =============================================================================
475
+ mutation-test:
476
+ name: Mutation testing
477
+ runs-on: ubuntu-latest
478
+ timeout-minutes: 360 # 6h cap
479
+ if: github.event_name == 'workflow_dispatch' || github.event_name == 'schedule'
480
+
481
+ steps:
482
+ - uses: actions/checkout@v4
483
+
484
+ - name: Set up Python
485
+ uses: actions/setup-python@v5
486
+ with:
487
+ python-version: ${{ env.PYTHON_VERSION }}
488
+ cache: 'pip'
489
+
490
+ - name: Install dependencies
491
+ run: |
492
+ python -m pip install --upgrade pip
493
+ pip install -e ".[dev,mutation]"
494
+
495
+ - name: Run mutmut
496
+ run: |
497
+ mutmut run --paths-to-mutate src/agirails/utils/security.py,src/agirails/runtime/mock_runtime.py,src/agirails/protocol/proofs.py || true
498
+ mutmut results > mutmut_results.txt
499
+ mutmut junitxml > mutmut_results.xml || true
500
+ echo "## Mutation Results" >> $GITHUB_STEP_SUMMARY
501
+ echo '```' >> $GITHUB_STEP_SUMMARY
502
+ tail -40 mutmut_results.txt >> $GITHUB_STEP_SUMMARY
503
+ echo '```' >> $GITHUB_STEP_SUMMARY
504
+
505
+ - name: Upload mutation report
506
+ uses: actions/upload-artifact@v4
507
+ if: always()
508
+ with:
509
+ name: mutmut-results
510
+ path: |
511
+ mutmut_results.txt
512
+ mutmut_results.xml
@@ -16,6 +16,10 @@ eggs/
16
16
  .eggs/
17
17
  lib/
18
18
  lib64/
19
+ # Keep the SDK's own cli/lib helper module (run_request etc.) — the
20
+ # generic `lib/` rule above is meant for build/venv directories.
21
+ !src/agirails/cli/lib/
22
+ !src/agirails/cli/lib/**
19
23
  parts/
20
24
  sdist/
21
25
  var/
@@ -41,6 +45,7 @@ htmlcov/
41
45
  .cache
42
46
  nosetests.xml
43
47
  coverage.xml
48
+ coverage.json
44
49
  *.cover
45
50
  *.py,cover
46
51
  .hypothesis/