agentnode-sdk 0.24.0__tar.gz → 0.24.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 (277) hide show
  1. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/CHANGELOG.md +56 -0
  2. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/PKG-INFO +1 -1
  3. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/__init__.py +1 -1
  4. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/sandbox_commands.py +33 -6
  5. agentnode_sdk-0.24.1/agentnode_sdk/conformance/__init__.py +47 -0
  6. agentnode_sdk-0.24.1/agentnode_sdk/conformance/checks.py +690 -0
  7. agentnode_sdk-0.24.1/agentnode_sdk/conformance/doubles.py +194 -0
  8. agentnode_sdk-0.24.1/agentnode_sdk/conformance/probe.py +318 -0
  9. agentnode_sdk-0.24.1/agentnode_sdk/conformance/report.py +217 -0
  10. agentnode_sdk-0.24.1/agentnode_sdk/conformance/runner.py +518 -0
  11. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/container_backend.py +265 -19
  12. agentnode_sdk-0.24.1/agentnode_sdk/sandbox/refusal.py +318 -0
  13. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/types.py +20 -0
  14. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/pyproject.toml +1 -1
  15. agentnode_sdk-0.24.1/tests/test_conformance_checks.py +666 -0
  16. agentnode_sdk-0.24.1/tests/test_conformance_report.py +123 -0
  17. agentnode_sdk-0.24.1/tests/test_r1_both_revisions.py +106 -0
  18. agentnode_sdk-0.24.1/tests/test_r1_counter_checks.py +235 -0
  19. agentnode_sdk-0.24.1/tests/test_r1_runtime_remediation.py +756 -0
  20. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_sandbox_backend.py +7 -0
  21. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_sandbox_doctor.py +35 -2
  22. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/.env.example +0 -0
  23. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/README.md +0 -0
  24. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/REGISTRY_SIGNING_ACTIVATION.md +0 -0
  25. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/REGISTRY_SIGNING_SPEC.md +0 -0
  26. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/THREAT_MODEL.md +0 -0
  27. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/TRUST_STACK.md +0 -0
  28. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode.lock +0 -0
  29. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/_agent_pip.py +0 -0
  30. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/_env_lock.py +0 -0
  31. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/_env_rwlock.py +0 -0
  32. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/_fileutil.py +0 -0
  33. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/_wheel_meta.py +0 -0
  34. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/async_client.py +0 -0
  35. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/capability_graph.py +0 -0
  36. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/capability_taxonomy.py +0 -0
  37. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/__init__.py +0 -0
  38. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/__main__.py +0 -0
  39. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/audit.py +0 -0
  40. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/auth.py +0 -0
  41. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/cassette_audit.py +0 -0
  42. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/commands.py +0 -0
  43. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/complements.py +0 -0
  44. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/init.py +0 -0
  45. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/main.py +0 -0
  46. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/mcp_commands.py +0 -0
  47. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/mcp_ownership.py +0 -0
  48. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/mcp_status.py +0 -0
  49. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/mcp_submit.py +0 -0
  50. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/mcp_verify.py +0 -0
  51. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/output.py +0 -0
  52. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/publish.py +0 -0
  53. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/record_cases.py +0 -0
  54. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/serve.py +0 -0
  55. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/setup_wizard.py +0 -0
  56. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/smart_run.py +0 -0
  57. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/templates.py +0 -0
  58. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/validate.py +0 -0
  59. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/cli/verify_local.py +0 -0
  60. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/client.py +0 -0
  61. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/compatibility.py +0 -0
  62. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/config.py +0 -0
  63. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/credential_handle.py +0 -0
  64. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/credential_resolver.py +0 -0
  65. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/credential_store.py +0 -0
  66. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/detect.py +0 -0
  67. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/exceptions.py +0 -0
  68. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/guard.py +0 -0
  69. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/input_guard.py +0 -0
  70. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/installer.py +0 -0
  71. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/key_status.py +0 -0
  72. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/llm_providers.py +0 -0
  73. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/lock_integrity.py +0 -0
  74. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/lock_surface.py +0 -0
  75. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/mcp_server.py +0 -0
  76. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/models.py +0 -0
  77. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/planner.py +0 -0
  78. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/policy.py +0 -0
  79. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/references.py +0 -0
  80. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/registry_trust.py +0 -0
  81. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/resolve.py +0 -0
  82. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/resource_provider.py +0 -0
  83. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/risk_profile.py +0 -0
  84. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/run_log.py +0 -0
  85. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runner.py +0 -0
  86. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtime.py +0 -0
  87. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtime_integrity.py +0 -0
  88. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/__init__.py +0 -0
  89. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/agent_llm_broker.py +0 -0
  90. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/agent_llm_policy.py +0 -0
  91. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/agent_runner.py +0 -0
  92. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/agent_sandbox.py +0 -0
  93. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/mcp_consent.py +0 -0
  94. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/mcp_consent_store.py +0 -0
  95. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/mcp_launch.py +0 -0
  96. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/mcp_runner.py +0 -0
  97. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/python_runner.py +0 -0
  98. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/remote_runner.py +0 -0
  99. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/runtimes/toolpack_credentials.py +0 -0
  100. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/__init__.py +0 -0
  101. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/agent_container_wrapper.py +0 -0
  102. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/agent_rpc.py +0 -0
  103. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/agent_session.py +0 -0
  104. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/backend.py +0 -0
  105. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/domain_policy.py +0 -0
  106. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/egress.py +0 -0
  107. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/egress_proxy.py +0 -0
  108. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/mcp_preinstall.py +0 -0
  109. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/sandbox/policy.py +0 -0
  110. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/signature.py +0 -0
  111. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/signing_key.py +0 -0
  112. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/agentnode_sdk/skill.py +0 -0
  113. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/data/compatibility/current.json +0 -0
  114. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/data/compatibility/removed_2026-07-09.txt +0 -0
  115. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/sandbox-image/Dockerfile +0 -0
  116. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/sandbox-image/README.md +0 -0
  117. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/analyze_scores.py +0 -0
  118. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/batch_verify.py +0 -0
  119. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/check_model_drift.py +0 -0
  120. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/ci_smoke_test.py +0 -0
  121. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/generate_compatibility_artifacts.py +0 -0
  122. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/merge_batches.py +0 -0
  123. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/verify_toolcalls.py +0 -0
  124. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/scripts/weekly_retest.sh +0 -0
  125. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/spikes/agent_sandbox_routing/README.md +0 -0
  126. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/spikes/agent_sandbox_routing/__init__.py +0 -0
  127. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/spikes/agent_sandbox_routing/container_agent_wrapper.py +0 -0
  128. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/spikes/agent_sandbox_routing/fake_llm.py +0 -0
  129. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/spikes/agent_sandbox_routing/host_driver.py +0 -0
  130. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/spikes/agent_sandbox_routing/trivial_agent.py +0 -0
  131. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/__init__.py +0 -0
  132. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/agent_m1_helpers.py +0 -0
  133. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/conftest.py +0 -0
  134. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/data/allowed_domains_vectors.json +0 -0
  135. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/hostpolicy.py +0 -0
  136. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/lanes/FROZEN_INVENTORY.json +0 -0
  137. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/lanes/__init__.py +0 -0
  138. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/lanes/conftest_report.py +0 -0
  139. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/lanes/constraints.txt +0 -0
  140. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/lanes/freeze_inventory.py +0 -0
  141. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/lanes/npm_e2e_pins.json +0 -0
  142. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/rwlock_worker.py +0 -0
  143. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_host_unsupported.py +0 -0
  144. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_llm_broker.py +0 -0
  145. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_llm_policy.py +0 -0
  146. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_m1_amendment.py +0 -0
  147. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_m1_env_lock.py +0 -0
  148. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_m1_fileutil.py +0 -0
  149. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_m1_lock_fields.py +0 -0
  150. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_m1_transaction.py +0 -0
  151. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_m1_wheel_meta.py +0 -0
  152. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_rpc.py +0 -0
  153. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_runner.py +0 -0
  154. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_sandbox_e2e.py +0 -0
  155. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_sandbox_hardening.py +0 -0
  156. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_sandbox_routing.py +0 -0
  157. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_sandbox_spike.py +0 -0
  158. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_agent_session_container.py +0 -0
  159. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_async_client.py +0 -0
  160. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_audit_ux.py +0 -0
  161. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_auth_cli_vault.py +0 -0
  162. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_auto_upgrade_policy.py +0 -0
  163. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_cli.py +0 -0
  164. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_cli_lock.py +0 -0
  165. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_cli_lock_verify_structure.py +0 -0
  166. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_cli_run_resolution.py +0 -0
  167. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_client.py +0 -0
  168. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_client_json_guard.py +0 -0
  169. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_client_sprint_b.py +0 -0
  170. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_config.py +0 -0
  171. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_consent_prompt.py +0 -0
  172. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_credential_handle.py +0 -0
  173. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_credential_integration.py +0 -0
  174. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_credential_resolver.py +0 -0
  175. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_credential_store.py +0 -0
  176. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_credential_vault.py +0 -0
  177. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_detect.py +0 -0
  178. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_detect_and_install.py +0 -0
  179. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_domain_policy.py +0 -0
  180. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_e2e_runtime.py +0 -0
  181. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_edge_cases.py +0 -0
  182. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_egress_domain_validation.py +0 -0
  183. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_egress_e2e.py +0 -0
  184. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_egress_lifecycle.py +0 -0
  185. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_egress_proxy_unit.py +0 -0
  186. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_egress_wrap.py +0 -0
  187. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_env_passthrough_wrap.py +0 -0
  188. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_env_rwlock.py +0 -0
  189. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard.py +0 -0
  190. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_check.py +0 -0
  191. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_config_cache.py +0 -0
  192. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_policy.py +0 -0
  193. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_preview.py +0 -0
  194. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_schema.py +0 -0
  195. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_set.py +0 -0
  196. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_status.py +0 -0
  197. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_tool_override.py +0 -0
  198. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_tool_override_audit.py +0 -0
  199. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_tool_override_cli.py +0 -0
  200. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_guard_ux.py +0 -0
  201. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_host_policy_snapshot.py +0 -0
  202. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_host_trust_policy.py +0 -0
  203. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_host_trust_policy_routing.py +0 -0
  204. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_input_guard.py +0 -0
  205. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_input_guard_escalation.py +0 -0
  206. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_install_hardening.py +0 -0
  207. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_installer_sprint_b.py +0 -0
  208. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_intelligence.py +0 -0
  209. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_key_status.py +0 -0
  210. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_layer3_admin_funnel.py +0 -0
  211. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_layer3_env_write_lock_core.py +0 -0
  212. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_layer3_install_snapshot.py +0 -0
  213. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_layer3_installer_concurrency.py +0 -0
  214. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_layer3_interpreter_and_no_runtime_install.py +0 -0
  215. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_llm_binding.py +0 -0
  216. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_llm_call_runlog.py +0 -0
  217. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_llm_providers.py +0 -0
  218. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_llm_vault_binding.py +0 -0
  219. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_load_tool_integrity.py +0 -0
  220. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_lock_integrity.py +0 -0
  221. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_lock_runtime.py +0 -0
  222. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_lockfile_duplicate_keys.py +0 -0
  223. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_allowed_domains_seal.py +0 -0
  224. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_audit.py +0 -0
  225. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_cli_scaffold.py +0 -0
  226. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_consent.py +0 -0
  227. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_consent_resolver.py +0 -0
  228. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_consent_store.py +0 -0
  229. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_credentialed_launch.py +0 -0
  230. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_doctor.py +0 -0
  231. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_doctor_integrity.py +0 -0
  232. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_ownership_cli.py +0 -0
  233. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_preinstall.py +0 -0
  234. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_preinstall_cache.py +0 -0
  235. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_preinstall_run.py +0 -0
  236. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_sandbox.py +0 -0
  237. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_server.py +0 -0
  238. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_submit.py +0 -0
  239. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_mcp_verify_pinning.py +0 -0
  240. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_observability.py +0 -0
  241. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_planner.py +0 -0
  242. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_policy.py +0 -0
  243. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_policy_integration.py +0 -0
  244. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_prompt_specs.py +0 -0
  245. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_provider_matrix.py +0 -0
  246. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_publish.py +0 -0
  247. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_references.py +0 -0
  248. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_registry_trust.py +0 -0
  249. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_remote_hardening.py +0 -0
  250. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_remote_runner.py +0 -0
  251. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_resource_provider.py +0 -0
  252. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_resource_specs.py +0 -0
  253. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_risk_profile.py +0 -0
  254. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_run_log.py +0 -0
  255. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_runner.py +0 -0
  256. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_runtime.py +0 -0
  257. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_runtime_audit.py +0 -0
  258. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_sandbox_e2e.py +0 -0
  259. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_sandbox_gate.py +0 -0
  260. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_security_hardening.py +0 -0
  261. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_setup_wizard.py +0 -0
  262. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_shipped_default_live_paths.py +0 -0
  263. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_shipped_default_routing.py +0 -0
  264. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_signature.py +0 -0
  265. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_signing_key.py +0 -0
  266. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_skill.py +0 -0
  267. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_smart.py +0 -0
  268. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_stability.py +0 -0
  269. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_structure_digest.py +0 -0
  270. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_structure_writer_seal.py +0 -0
  271. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_toolpack_credentials.py +0 -0
  272. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_toolpack_credentials_b.py +0 -0
  273. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_toolpack_sandbox.py +0 -0
  274. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_v02.py +0 -0
  275. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_validate.py +0 -0
  276. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/test_validate_skill.py +0 -0
  277. {agentnode_sdk-0.24.0 → agentnode_sdk-0.24.1}/tests/validation_lockfile.json +0 -0
@@ -1,5 +1,61 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.1 — the sandbox does what it said
4
+
5
+ Three defects in the local sandbox runtime, found by the backend conformance suite (EM-3B)
6
+ measuring a real container rather than reading its configuration. Each is a case where
7
+ AgentNode reported a property it was not enforcing.
8
+
9
+ ### Fixed
10
+
11
+ - **A wall-clock timeout now ends the payload.** It killed the `docker run` client, which is
12
+ a pipe to a daemon that owns the process — so the SDK reported a timeout while the
13
+ container kept running, and `--rm` never removed it because it never exited. Every run now
14
+ carries an exact identity (a unique name *and* a cidfile); a timeout removes that exact
15
+ container, waits, and verifies that neither the id nor the name remains. If any of that
16
+ cannot be shown, `SandboxContainmentError` is raised instead of the ordinary timeout
17
+ result: a stop nobody could verify is not a stop. Nothing outside the run being stopped is
18
+ ever addressed, and an identity in doubt stops the removal rather than guessing.
19
+ - **The declared memory ceiling now binds.** `--memory` was passed without `--memory-swap`,
20
+ and a runtime with only the first set grants a swap allowance of twice the limit — the
21
+ suite watched a 768 MiB allocation finish with exit code 0 under a 512 MiB "limit". The
22
+ two are now equal, so the total of memory and swap *is* the limit. Whether an engine can
23
+ account for swap at all is recorded from `docker info` rather than assumed, so a report can
24
+ say the ceiling is unproven on that engine instead of resting on the flag having been
25
+ passed.
26
+ - **A refusal now carries a way out.** It said `no container runtime (docker or podman)
27
+ found on PATH` and nothing more. There were also two answers to the same question — the
28
+ SDK's bare sentence and the CLI doctor's structured checks — and only one of them ever had
29
+ a next step. Both now render one classifier, which distinguishes *not installed*, *not
30
+ running*, *not permitted*, *an engine in the wrong mode* and *a device where no local
31
+ sandbox is possible*, and offers only actions that exist on the platform in front of you,
32
+ each followed by the check that tells you whether it worked. Joining the `docker` group is
33
+ deliberately not among them: it is administrator-equivalent power on the machine.
34
+
35
+ ### Changed
36
+
37
+ - `SandboxAvailability` carries `probe_error`, `engine_os` and `memory_limit_enforceable`;
38
+ `check_available(force=True)` re-asks rather than returning the cached answer, which is what
39
+ a re-check after a fix needs.
40
+ - One-shot sandboxed runs are now named and labelled like the long-lived ones. Nothing
41
+ filters on that label; it makes a run identifiable, which is the point.
42
+
43
+ ### Not fixed in this release
44
+
45
+ - **Declared network levels are still not distinguished from one another.** A toolpack that
46
+ declares `restricted` receives the same open container network as one that declares
47
+ `unrestricted`: six recognised level names all map to the engine's default bridge. An unknown or
48
+ missing level is still correctly isolated (`--network none`), so this is not a case of an
49
+ unrecognised value being let through — the recognised names simply do not differ in what they
50
+ grant. The risk score meanwhile rates `internal` below `external`, which points the opposite way
51
+ from what the runtime does.
52
+
53
+ This release deliberately does not correct it. The correction requires a declared domain
54
+ allowlist in the package manifest, registry validation for it, and a refusal for packages that
55
+ ask for `restricted` without one — a behaviour change that refuses packages which work today,
56
+ and too large to carry inside a patch that exists to get two proven runtime fixes to people.
57
+ It ships separately, at a version that reflects the break.
58
+
3
59
  ## 0.24.0 — The container is the boundary
4
60
 
5
61
  This release makes the execution boundary real rather than advisory. Third-party code
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentnode-sdk
3
- Version: 0.24.0
3
+ Version: 0.24.1
4
4
  Summary: Python SDK for AgentNode — the open upgrade and discovery infrastructure for AI agents.
5
5
  Project-URL: Homepage, https://agentnode.net
6
6
  Project-URL: Repository, https://github.com/agentnode-ai/agentnode
@@ -38,7 +38,7 @@ from agentnode_sdk.runtime import AgentNodeRuntime
38
38
  Client = AgentNodeClient
39
39
  ToolError = AgentNodeToolError
40
40
 
41
- __version__ = "0.24.0"
41
+ __version__ = "0.24.1"
42
42
  __all__ = [
43
43
  "AgentNode",
44
44
  "AsyncAgentNode",
@@ -151,27 +151,54 @@ def _build_env_checks() -> tuple[list[dict], bool, bool]:
151
151
  beyond the cached availability probe."""
152
152
  from agentnode_sdk.sandbox.container_backend import _BASE_IMAGE, ContainerBackend
153
153
 
154
- av = ContainerBackend().check_available()
154
+ # EM-3B-R1/R3: the refusal and this output come from ONE classifier, so the doctor cannot
155
+ # drift from what the SDK tells a caller. `fix` is the first action that applies here.
156
+ from agentnode_sdk.sandbox.refusal import RefusalCase, classify
157
+
158
+ backend = ContainerBackend()
159
+ av = backend.check_available()
155
160
  placeholder = _is_placeholder_digest(_BASE_IMAGE)
161
+ refusal = classify(av, placeholder=placeholder)
156
162
  checks: list[dict] = []
157
163
 
158
164
  def rec(name, ok, detail, fix=None):
159
165
  checks.append({"check": name, "ok": ok, "detail": detail, "fix": fix})
160
166
 
167
+ def first_action() -> str | None:
168
+ """Every action that applies on this platform, in one line.
169
+
170
+ Not just the first: the Windows start advice ends with the firmware and WSL2 case, and a
171
+ person whose engine will not start needs that as much as the first sentence.
172
+ """
173
+ if refusal is None or not refusal.actions:
174
+ return None
175
+ parts = []
176
+ for a in refusal.actions:
177
+ parts.append(a.text + (f" ({a.command or a.url})" if (a.command or a.url) else ""))
178
+ return "; ".join(parts)
179
+
161
180
  if av.backend == "none":
162
- rec("runtime", False, "no Docker or Podman found",
163
- "Install Docker or Podman (NOT auto-installed): https://docs.docker.com/get-docker/")
181
+ rec("runtime", False, "no Docker or Podman found", first_action()
182
+ or "Install Docker or Podman (NOT auto-installed): https://docs.docker.com/get-docker/")
164
183
  return checks, False, False
165
184
 
166
185
  rec("runtime", True, f"{av.backend} ({av.executable_path or 'on PATH'})")
167
186
 
168
187
  if not av.daemon_ok:
169
- rec("daemon", False, f"{av.backend} found but its daemon is not reachable",
170
- "Start the container runtime (e.g. Docker Desktop). On Windows this can also be "
171
- "WSL2/Hyper-V not running or hardware virtualization disabled in BIOS.")
188
+ permitted = refusal is not None and refusal.case is RefusalCase.NOT_PERMITTED
189
+ rec("daemon", False,
190
+ f"{av.backend} is installed but this account may not use it" if permitted
191
+ else f"{av.backend} found but its daemon is not reachable",
192
+ first_action()
193
+ or ("Start the container runtime (e.g. Docker Desktop). On Windows this can also be "
194
+ "WSL2/Hyper-V not running or hardware virtualization disabled in BIOS."))
172
195
  return checks, False, False
173
196
  rec("daemon", True, "reachable")
174
197
 
198
+ if refusal is not None and refusal.case is RefusalCase.INCOMPATIBLE:
199
+ rec("engine", False, refusal.headline, first_action())
200
+ return checks, False, False
201
+
175
202
  if placeholder:
176
203
  rec("image", False, "this SDK build has no pinned sandbox image (placeholder digest)",
177
204
  "Update AgentNode to a build with an activated sandbox image.")
@@ -0,0 +1,47 @@
1
+ """EM-3B: the backend conformance suite.
2
+
3
+ One question, asked the same way of every sandbox backend: **do the properties it claims actually
4
+ hold?** The local container backend that exists today, a sandbox an operator runs themselves, and a
5
+ managed one all have to answer it, and none of them can be trusted on description alone -- this
6
+ codebase has already carried module docstrings that described a capability as inert while two run
7
+ paths were calling it.
8
+
9
+ So the suite measures. It runs a probe inside the payload, where untrusted code actually sits, and
10
+ asks the runtime what it sees from outside where that is possible. Evidence that consists of an argv
11
+ or of a Python object's assertion is capped at ``self-reported`` and cannot be promoted; a property
12
+ nobody measured is ``not_checked``; and a required property that was not measured keeps the whole
13
+ report from being conformant.
14
+
15
+ Three assurance levels, and there is no fourth: ``self-reported``, ``observed``, ``attested``.
16
+ ``attested`` needs an external attestation document and no code path here has one. The word
17
+ *certified* is rejected at construction, because no outside body has examined anything.
18
+
19
+ from agentnode_sdk.conformance import run_conformance
20
+ from agentnode_sdk.sandbox.policy import get_default_backend
21
+
22
+ report = run_conformance(get_default_backend(), generated_at="2026-09-03T00:00:00Z")
23
+ print(report.summary_line())
24
+ """
25
+ from agentnode_sdk.conformance.checks import Context, run_all
26
+ from agentnode_sdk.conformance.report import (
27
+ SUITE_VERSION,
28
+ Assurance,
29
+ CheckResult,
30
+ ConformanceReport,
31
+ Outcome,
32
+ Vantage,
33
+ )
34
+ from agentnode_sdk.conformance.runner import SuiteOptions, run_conformance
35
+
36
+ __all__ = [
37
+ "Assurance",
38
+ "CheckResult",
39
+ "ConformanceReport",
40
+ "Context",
41
+ "Outcome",
42
+ "SUITE_VERSION",
43
+ "SuiteOptions",
44
+ "Vantage",
45
+ "run_all",
46
+ "run_conformance",
47
+ ]