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.
- agirails-3.0.1/.github/workflows/release-pypi.yml +178 -0
- {agirails-2.3.2 → agirails-3.0.1}/.github/workflows/test.yml +127 -3
- {agirails-2.3.2 → agirails-3.0.1}/.gitignore +5 -0
- agirails-3.0.1/CHANGELOG.md +519 -0
- agirails-3.0.1/PKG-INFO +229 -0
- agirails-3.0.1/README.md +169 -0
- {agirails-2.3.2 → agirails-3.0.1}/pyproject.toml +59 -8
- agirails-3.0.1/scripts/generate_parity_vectors.js +167 -0
- agirails-3.0.1/scripts/generate_python_parity_vectors.py +181 -0
- agirails-3.0.1/scripts/test_installed_wheel.sh +158 -0
- agirails-3.0.1/scripts/verify_python_vectors.js +203 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/__init__.py +70 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/actp_kernel.json +186 -49
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/base.py +31 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/basic.py +44 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/standard.py +43 -1
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/api/agirails_app.py +60 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/builders/__init__.py +28 -0
- agirails-3.0.1/src/agirails/builders/counter_accept.py +346 -0
- agirails-3.0.1/src/agirails/builders/counter_offer.py +533 -0
- agirails-3.0.1/src/agirails/cli/commands/claim_code.py +215 -0
- agirails-3.0.1/src/agirails/cli/commands/repair.py +273 -0
- agirails-3.0.1/src/agirails/cli/commands/request.py +228 -0
- agirails-3.0.1/src/agirails/cli/commands/serve.py +145 -0
- agirails-3.0.1/src/agirails/cli/commands/verify.py +394 -0
- agirails-3.0.1/src/agirails/cli/lib/run_request.py +367 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/main.py +20 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/client.py +314 -13
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/networks.py +46 -9
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/provider.py +41 -4
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/agent.py +41 -4
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/agent_registry.py +21 -2
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/kernel.py +34 -6
- agirails-3.0.1/src/agirails/receipts/__init__.py +25 -0
- agirails-3.0.1/src/agirails/receipts/web_receipt.py +364 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/blockchain_runtime.py +60 -5
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/mock_runtime.py +32 -3
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/types.py +49 -1
- agirails-3.0.1/src/agirails/server/__init__.py +72 -0
- agirails-3.0.1/src/agirails/server/app.py +132 -0
- agirails-3.0.1/src/agirails/server/policy.py +168 -0
- agirails-3.0.1/src/agirails/server/policy_engine.py +156 -0
- agirails-3.0.1/src/agirails/server/quote_channel.py +309 -0
- agirails-3.0.1/src/agirails/settle/__init__.py +5 -0
- agirails-3.0.1/src/agirails/settle/settle_on_interact.py +91 -0
- agirails-3.0.1/src/agirails/version.py +4 -0
- agirails-3.0.1/src/agirails/wallet/smart_wallet_router.py +413 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/counter_accept_basic.json +20 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/counter_accept_mainnet.json +20 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/counter_offer_basic.json +25 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/counter_offer_with_justification.json +32 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/manifest.json +13 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_accept_basic.json +20 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_accept_mainnet.json +20 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_offer_basic.json +25 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_counter_offer_with_justification.json +32 -0
- agirails-3.0.1/tests/fixtures/cross_sdk/python_signed_manifest.json +13 -0
- agirails-3.0.1/tests/integration_sepolia/conftest.py +107 -0
- agirails-3.0.1/tests/integration_sepolia/test_eoa_runtime_lifecycle.py +181 -0
- agirails-3.0.1/tests/integration_sepolia/test_full_lifecycle.py +153 -0
- agirails-3.0.1/tests/integration_sepolia/test_kernel_state_after_timelock.py +54 -0
- agirails-3.0.1/tests/integration_sepolia/test_smart_wallet_lifecycle.py +255 -0
- agirails-3.0.1/tests/integration_sepolia/test_web_receipts_live.py +171 -0
- agirails-3.0.1/tests/test_builders/test_counter_offer.py +307 -0
- agirails-3.0.1/tests/test_builders/test_counter_schema_branches.py +291 -0
- agirails-3.0.1/tests/test_cli/test_claim_code.py +175 -0
- agirails-3.0.1/tests/test_cli/test_repair.py +191 -0
- agirails-3.0.1/tests/test_cli/test_request.py +358 -0
- agirails-3.0.1/tests/test_cli/test_verify.py +248 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli_deploy/test_deploy.py +8 -1
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_client.py +191 -0
- agirails-3.0.1/tests/test_client_paths.py +116 -0
- agirails-3.0.1/tests/test_cross_sdk/test_aip21_parity.py +248 -0
- agirails-3.0.1/tests/test_cross_sdk/test_python_signed_determinism.py +203 -0
- agirails-3.0.1/tests/test_golden/__init__.py +0 -0
- agirails-3.0.1/tests/test_golden/test_canonical_hashes.py +166 -0
- agirails-3.0.1/tests/test_level1/test_agent_hash_routing.py +145 -0
- agirails-3.0.1/tests/test_negotiation/__init__.py +0 -0
- agirails-3.0.1/tests/test_properties/test_canonical_json_properties.py +107 -0
- agirails-3.0.1/tests/test_properties/test_signing_properties.py +145 -0
- agirails-3.0.1/tests/test_properties/test_stateful_lifecycle.py +251 -0
- agirails-3.0.1/tests/test_properties/test_usdc_and_state_properties.py +157 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_networks.py +8 -4
- agirails-3.0.1/tests/test_receipts/__init__.py +0 -0
- agirails-3.0.1/tests/test_receipts/test_web_receipt.py +303 -0
- agirails-3.0.1/tests/test_runtime/__init__.py +0 -0
- agirails-3.0.1/tests/test_runtime/test_blockchain_scan_window.py +146 -0
- agirails-3.0.1/tests/test_server/__init__.py +0 -0
- agirails-3.0.1/tests/test_server/conftest.py +24 -0
- agirails-3.0.1/tests/test_server/test_actp_serve.py +400 -0
- agirails-3.0.1/tests/test_server/test_serve_e2e.py +239 -0
- agirails-3.0.1/tests/test_settle/__init__.py +0 -0
- agirails-3.0.1/tests/test_settle/test_settle_on_interact.py +168 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_types/test_message.py +1 -22
- agirails-3.0.1/tests/test_utils/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_auto_wallet_provider.py +3 -3
- agirails-3.0.1/tests/test_wallet/test_smart_wallet_router.py +258 -0
- agirails-3.0.1/tests/test_wallet/test_smart_wallet_router_edges.py +227 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_transaction_batcher.py +3 -3
- agirails-2.3.2/CHANGELOG.md +0 -113
- agirails-2.3.2/PKG-INFO +0 -226
- agirails-2.3.2/README.md +0 -170
- agirails-2.3.2/src/agirails/abis/eas.json +0 -110
- agirails-2.3.2/src/agirails/config/abis/AgentRegistry.json +0 -782
- agirails-2.3.2/src/agirails/version.py +0 -4
- {agirails-2.3.2 → agirails-3.0.1}/.env.example +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/LICENSE +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/MIGRATION.md +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/agent_registry.json +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/escrow_vault.json +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/abis/usdc.json +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/adapter_registry.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/adapter_router.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/i_adapter.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/types.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/adapters/x402_adapter.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/api/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/api/discover.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/builders/delivery_proof.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/builders/quote.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/autopublish.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/balance.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/batch.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/claim.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/config.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/deploy_check.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/deploy_env.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/diff.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/find.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/health.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/init.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/mint.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/negotiate.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/pay.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/publish.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/pull.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/receipt.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/register.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/simulate.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/test.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/time.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/tx.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/commands/watch.py +0 -0
- {agirails-2.3.2/tests → agirails-3.0.1/src/agirails/cli/lib}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/output.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/cli/utils/validation.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/agirailsmd.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/on_chain_state.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/pending_publish.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/publish_pipeline.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/config/sync_operations.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/erc8004/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/erc8004/bridge.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/erc8004/reputation_reporter.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/agent.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/base.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/mock.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/network.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/storage.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/transaction.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/errors/validation.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/directory.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/provide.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level0/request.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/config.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/job.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/level1/pricing.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/buyer_orchestrator.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/decision_engine.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/policy_engine.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/negotiation/session_store.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/base.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/did.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/eas.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/escrow.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/events.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/messages.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/nonce.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/protocol/proofs.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/py.typed +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/base.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/runtime/mock_state_manager.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/archive_bundle_builder.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/arweave_client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/filebase_client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/storage/types.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/did.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/erc8004.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/message.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/transaction.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/types/x402.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/canonical_json.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/circuit_breaker.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/helpers.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/logger.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/logging.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/nonce_tracker.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/received_nonce_tracker.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/retry.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/secure_nonce.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/security.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/semaphore.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/used_attestation_tracker.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/utils/validation.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/bundler_client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/constants.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/dual_nonce_manager.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/paymaster_client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/transaction_batcher.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/aa/user_op_builder.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/auto_wallet_provider.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/eoa_wallet_provider.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/src/agirails/wallet/keystore.py +0 -0
- {agirails-2.3.2/tests/integration → agirails-3.0.1/tests}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/benchmarks/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/benchmarks/test_performance.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/conftest.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/canonical_json.json +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/delivery_proof.json +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/eip712.json +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/fixtures/parity/service_hash.json +0 -0
- {agirails-2.3.2/tests/test_adapters → agirails-3.0.1/tests/integration}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/integration/test_blockchain_runtime.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/integration/test_e2e_sepolia.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/integration/test_eas.py +0 -0
- {agirails-2.3.2/tests/test_api → agirails-3.0.1/tests/integration_sepolia}/__init__.py +0 -0
- {agirails-2.3.2/tests/test_cli → agirails-3.0.1/tests/test_adapters}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_adapter_router.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_basic.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_standard.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_adapters/test_x402_adapter.py +0 -0
- {agirails-2.3.2/tests/test_config → agirails-3.0.1/tests/test_api}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_api/test_agirails_app.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_builders/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_builders/test_delivery_proof.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_builders/test_quote.py +0 -0
- {agirails-2.3.2/tests/test_negotiation → agirails-3.0.1/tests/test_cli}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_autopublish.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_claim.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_cli_original.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_e2e_publish_claim_discover.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_find.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_health.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_publish.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_publish_parity.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_receipt.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_register.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli/test_test.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_cli_deploy/__init__.py +0 -0
- {agirails-2.3.2/tests/test_runtime → agirails-3.0.1/tests/test_config}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_agirailsmd.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_networks_aa.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_on_chain_state.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_config/test_pending_publish.py +0 -0
- {agirails-2.3.2/tests/test_utils → agirails-3.0.1/tests/test_cross_sdk}/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_erc8004/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_erc8004/test_bridge.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_erc8004/test_reputation_reporter.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_agent.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_base.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_network.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_transaction.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_transient_rpc.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_errors/test_validation.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/test_directory.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/test_provider.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level0/test_request.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/test_agent_lifecycle.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/test_config.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_level1/test_pricing.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_buyer_orchestrator.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_decision_engine.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_policy_engine.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_negotiation/test_session_store.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_packaging/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_packaging/test_smoke.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_parity.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_properties/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_properties/test_state_machine.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_contract_base.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_did.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_eas_verification.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_protocol/test_proofs.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_accept_quote.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_concurrent_file_locking.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_mock_runtime.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_runtime/test_mock_state_manager.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_security/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_security/test_security_audit.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/conftest.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_archive_bundle_builder.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_arweave_client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_filebase_client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_storage/test_types.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_types/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_types/test_transaction.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_attestation_replay.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_circuit_breaker.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_helpers.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_helpers_extended.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_nonce_tracker.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_nonce_tracker_extended.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_received_nonce_tracker_extended.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_retry.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_secure_nonce_concurrency.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_security.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_security_extended.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_validation.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_utils/test_validation_extended.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/__init__.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_bundler_client.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_dual_nonce_manager.py +0 -0
- {agirails-2.3.2 → agirails-3.0.1}/tests/test_wallet/test_keystore.py +0 -0
- {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
|
|
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/
|
|
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/
|