agentnode-sdk 0.20.0__tar.gz → 0.21.0__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 (224) hide show
  1. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/CHANGELOG.md +38 -0
  2. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/PKG-INFO +1 -1
  3. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode.lock +236 -236
  4. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/__init__.py +1 -1
  5. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/publish.py +30 -5
  6. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/setup_wizard.py +8 -12
  7. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/config.py +7 -1
  8. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_sandbox.py +223 -218
  9. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/agent_container_wrapper.py +124 -83
  10. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/pyproject.toml +1 -1
  11. agentnode_sdk-0.21.0/scripts/check_model_drift.py +65 -0
  12. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/scripts/ci_smoke_test.py +3 -2
  13. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_runner.py +6 -0
  14. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_sandbox_e2e.py +182 -175
  15. agentnode_sdk-0.21.0/tests/test_agent_sandbox_hardening.py +174 -0
  16. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_sandbox_routing.py +56 -11
  17. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_config.py +129 -128
  18. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_publish.py +55 -0
  19. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_setup_wizard.py +18 -16
  20. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/.env.example +0 -0
  21. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/.gitignore +0 -0
  22. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/README.md +0 -0
  23. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/REGISTRY_SIGNING_ACTIVATION.md +0 -0
  24. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/REGISTRY_SIGNING_SPEC.md +0 -0
  25. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/THREAT_MODEL.md +0 -0
  26. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/TRUST_STACK.md +0 -0
  27. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/_fileutil.py +0 -0
  28. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/async_client.py +0 -0
  29. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/capability_graph.py +0 -0
  30. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/capability_taxonomy.py +0 -0
  31. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/__init__.py +0 -0
  32. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/__main__.py +0 -0
  33. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/audit.py +0 -0
  34. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/auth.py +0 -0
  35. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/cassette_audit.py +0 -0
  36. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/commands.py +0 -0
  37. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/complements.py +0 -0
  38. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/init.py +0 -0
  39. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/main.py +0 -0
  40. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_commands.py +0 -0
  41. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_status.py +0 -0
  42. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_submit.py +0 -0
  43. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_verify.py +0 -0
  44. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/output.py +0 -0
  45. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/record_cases.py +0 -0
  46. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/sandbox_commands.py +0 -0
  47. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/serve.py +0 -0
  48. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/smart_run.py +0 -0
  49. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/templates.py +0 -0
  50. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/validate.py +0 -0
  51. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/verify_local.py +0 -0
  52. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/client.py +0 -0
  53. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/compatibility.py +0 -0
  54. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/credential_handle.py +0 -0
  55. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/credential_resolver.py +0 -0
  56. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/credential_store.py +0 -0
  57. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/detect.py +0 -0
  58. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/exceptions.py +0 -0
  59. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/guard.py +0 -0
  60. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/input_guard.py +0 -0
  61. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/installer.py +0 -0
  62. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/key_status.py +0 -0
  63. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/llm_providers.py +0 -0
  64. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/lock_integrity.py +0 -0
  65. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/mcp_server.py +0 -0
  66. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/models.py +0 -0
  67. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/planner.py +0 -0
  68. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/policy.py +0 -0
  69. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/references.py +0 -0
  70. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/registry_trust.py +0 -0
  71. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/resolve.py +0 -0
  72. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/resource_provider.py +0 -0
  73. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/risk_profile.py +0 -0
  74. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/run_log.py +0 -0
  75. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runner.py +0 -0
  76. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtime.py +0 -0
  77. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/__init__.py +0 -0
  78. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_llm_broker.py +0 -0
  79. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_llm_policy.py +0 -0
  80. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_runner.py +0 -0
  81. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/mcp_consent.py +0 -0
  82. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/mcp_consent_store.py +0 -0
  83. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/mcp_runner.py +0 -0
  84. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/python_runner.py +0 -0
  85. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/remote_runner.py +0 -0
  86. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/toolpack_credentials.py +0 -0
  87. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/__init__.py +0 -0
  88. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/agent_rpc.py +0 -0
  89. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/agent_session.py +0 -0
  90. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/backend.py +0 -0
  91. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/container_backend.py +0 -0
  92. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/domain_policy.py +0 -0
  93. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/egress.py +0 -0
  94. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/egress_proxy.py +0 -0
  95. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/mcp_preinstall.py +0 -0
  96. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/policy.py +0 -0
  97. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/types.py +0 -0
  98. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/signature.py +0 -0
  99. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/signing_key.py +0 -0
  100. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/agentnode_sdk/skill.py +0 -0
  101. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/data/compatibility/current.json +0 -0
  102. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/dist-0.18.0/.gitignore +0 -0
  103. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/dist-0.19.0/.gitignore +0 -0
  104. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/sandbox-image/Dockerfile +0 -0
  105. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/sandbox-image/README.md +0 -0
  106. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/scripts/analyze_scores.py +0 -0
  107. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/scripts/batch_verify.py +0 -0
  108. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/scripts/generate_compatibility_artifacts.py +0 -0
  109. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/scripts/merge_batches.py +0 -0
  110. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/scripts/verify_toolcalls.py +0 -0
  111. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/scripts/weekly_retest.sh +0 -0
  112. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/README.md +0 -0
  113. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/__init__.py +0 -0
  114. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/container_agent_wrapper.py +0 -0
  115. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/fake_llm.py +0 -0
  116. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/host_driver.py +0 -0
  117. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/trivial_agent.py +0 -0
  118. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/__init__.py +0 -0
  119. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/conftest.py +0 -0
  120. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/data/allowed_domains_vectors.json +0 -0
  121. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_llm_broker.py +0 -0
  122. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_llm_policy.py +0 -0
  123. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_rpc.py +0 -0
  124. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_sandbox_spike.py +0 -0
  125. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_agent_session_container.py +0 -0
  126. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_async_client.py +0 -0
  127. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_audit_ux.py +0 -0
  128. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_auth_cli_vault.py +0 -0
  129. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_auto_upgrade_policy.py +0 -0
  130. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_cli.py +0 -0
  131. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_cli_lock.py +0 -0
  132. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_cli_run_resolution.py +0 -0
  133. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_client.py +0 -0
  134. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_client_json_guard.py +0 -0
  135. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_client_sprint_b.py +0 -0
  136. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_consent_prompt.py +0 -0
  137. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_credential_handle.py +0 -0
  138. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_credential_integration.py +0 -0
  139. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_credential_resolver.py +0 -0
  140. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_credential_store.py +0 -0
  141. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_credential_vault.py +0 -0
  142. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_detect.py +0 -0
  143. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_detect_and_install.py +0 -0
  144. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_domain_policy.py +0 -0
  145. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_e2e_runtime.py +0 -0
  146. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_edge_cases.py +0 -0
  147. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_egress_domain_validation.py +0 -0
  148. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_egress_e2e.py +0 -0
  149. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_egress_lifecycle.py +0 -0
  150. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_egress_proxy_unit.py +0 -0
  151. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_egress_wrap.py +0 -0
  152. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_env_passthrough_wrap.py +0 -0
  153. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard.py +0 -0
  154. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_check.py +0 -0
  155. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_config_cache.py +0 -0
  156. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_policy.py +0 -0
  157. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_preview.py +0 -0
  158. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_schema.py +0 -0
  159. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_set.py +0 -0
  160. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_status.py +0 -0
  161. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_tool_override.py +0 -0
  162. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_tool_override_audit.py +0 -0
  163. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_tool_override_cli.py +0 -0
  164. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_guard_ux.py +0 -0
  165. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_host_trust_policy.py +0 -0
  166. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_host_trust_policy_routing.py +0 -0
  167. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_input_guard.py +0 -0
  168. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_input_guard_escalation.py +0 -0
  169. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_install_hardening.py +0 -0
  170. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_installer_sprint_b.py +0 -0
  171. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_intelligence.py +0 -0
  172. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_key_status.py +0 -0
  173. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_llm_binding.py +0 -0
  174. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_llm_call_runlog.py +0 -0
  175. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_llm_providers.py +0 -0
  176. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_llm_vault_binding.py +0 -0
  177. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_lock_integrity.py +0 -0
  178. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_lock_runtime.py +0 -0
  179. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_allowed_domains_seal.py +0 -0
  180. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_audit.py +0 -0
  181. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_consent.py +0 -0
  182. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_consent_resolver.py +0 -0
  183. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_consent_store.py +0 -0
  184. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_credentialed_launch.py +0 -0
  185. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_doctor.py +0 -0
  186. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_preinstall.py +0 -0
  187. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_preinstall_run.py +0 -0
  188. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_sandbox.py +0 -0
  189. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_server.py +0 -0
  190. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_mcp_submit.py +0 -0
  191. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_observability.py +0 -0
  192. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_planner.py +0 -0
  193. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_policy.py +0 -0
  194. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_policy_integration.py +0 -0
  195. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_prompt_specs.py +0 -0
  196. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_provider_matrix.py +0 -0
  197. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_references.py +0 -0
  198. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_registry_trust.py +0 -0
  199. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_remote_hardening.py +0 -0
  200. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_remote_runner.py +0 -0
  201. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_resource_provider.py +0 -0
  202. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_resource_specs.py +0 -0
  203. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_risk_profile.py +0 -0
  204. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_run_log.py +0 -0
  205. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_runner.py +0 -0
  206. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_runtime.py +0 -0
  207. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_runtime_audit.py +0 -0
  208. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_backend.py +0 -0
  209. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_doctor.py +0 -0
  210. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_e2e.py +0 -0
  211. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_gate.py +0 -0
  212. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_security_hardening.py +0 -0
  213. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_signature.py +0 -0
  214. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_signing_key.py +0 -0
  215. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_skill.py +0 -0
  216. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_smart.py +0 -0
  217. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_stability.py +0 -0
  218. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_toolpack_credentials.py +0 -0
  219. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_toolpack_credentials_b.py +0 -0
  220. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_toolpack_sandbox.py +0 -0
  221. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_v02.py +0 -0
  222. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_validate.py +0 -0
  223. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/test_validate_skill.py +0 -0
  224. {agentnode_sdk-0.20.0 → agentnode_sdk-0.21.0}/tests/validation_lockfile.json +0 -0
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.21.0 — Community agents run sandboxed by default
4
+
5
+ ### Changed
6
+
7
+ - **`agent_sandbox.enabled` now defaults to ON.** Community agents
8
+ (`verified`/`unverified`/unknown) run **sandbox-or-refuse**, consistent with
9
+ toolpacks and MCP servers: in an isolated container when a container runtime
10
+ and the pinned image are present, otherwise **refused cleanly** — never a host
11
+ fallback. Set `agent_sandbox.enabled=false` (or `AGENTNODE_AGENT_SANDBOX=0`)
12
+ to restore the previous behavior (community agents refused outright).
13
+ - `trusted`/`curated` agents are **unchanged**: they still run on the host under
14
+ the `default` host-trust policy. `sandbox.host_trust_policy` can still tighten
15
+ this (`curated_only`, `none`).
16
+ - The setup wizard's sandbox screen now states community agents are isolated by
17
+ default and offers to disable, instead of prompting to opt in.
18
+
19
+ ### Security
20
+
21
+ - Agent containers are regression-locked to the hardened profile: CPU, memory
22
+ and PID limits, read-only rootfs, all Linux capabilities dropped,
23
+ `no-new-privileges`, a non-root user, `noexec`/`nosuid` `/tmp`, a clean
24
+ ephemeral HOME, and `network=none`. The container env carries only
25
+ `PYTHONPATH` — no host secret reaches the container in the environment or on
26
+ the argv; the LLM key stays host-side behind the broker.
27
+ - The in-container agent wrapper installs a fork/exec/subprocess guard before
28
+ loading agent code (defense-in-depth; the container flags are the real
29
+ boundary).
30
+ - End-to-end verified on a real container host: a community agent runs isolated
31
+ with tool calls brokered host-side (allowlist enforced), LLM calls through the
32
+ host broker, and no host env/filesystem/network/key leakage — with no host
33
+ fallback when the sandbox is unavailable.
34
+
35
+ ### Fixed
36
+
37
+ - The gated agent-sandbox end-to-end test now injects the real container backend
38
+ past the test-suite's fake, so it actually exercises the real
39
+ `run_agent → run_agent_sandboxed` path on a Docker host.
40
+
3
41
  ## 0.20.0 — Credentialed toolpacks (bring your own API key)
4
42
 
5
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentnode-sdk
3
- Version: 0.20.0
3
+ Version: 0.21.0
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
@@ -1,236 +1,236 @@
1
- {
2
- "lockfile_version": "0.1",
3
- "updated_at": "2026-05-28T19:20:23.936900+00:00",
4
- "packages": {
5
- "word-counter-pack": {
6
- "version": "1.0.0",
7
- "package_type": "toolpack",
8
- "runtime": "python",
9
- "entrypoint": "word_counter_pack.tool",
10
- "capability_ids": [
11
- "data_cleaning"
12
- ],
13
- "tools": [
14
- {
15
- "name": "count_words",
16
- "entrypoint": "word_counter_pack.tool:count_words"
17
- }
18
- ],
19
- "artifact_hash": "sha256:445388c86aa2b20c3e748f58b2d221548f1f3f71ff5c715a64cdc80966fab03c",
20
- "installed_at": "2026-03-18T02:18:53.827396+00:00",
21
- "source": "sdk",
22
- "trust_level": "trusted",
23
- "permissions": {
24
- "network_level": "none",
25
- "filesystem_level": "none",
26
- "code_execution_level": "none",
27
- "data_access_level": "input_only",
28
- "user_approval_level": "never"
29
- }
30
- },
31
- "pdf-reader-pack": {
32
- "version": "1.0.0",
33
- "package_type": "toolpack",
34
- "runtime": "python",
35
- "entrypoint": "pdf_reader_pack.tool",
36
- "capability_ids": [
37
- "pdf_extraction"
38
- ],
39
- "tools": [],
40
- "artifact_hash": "sha256:4635316cb5f8ee477f41ccad570c3bcd5026fc7cd1fbf402a12df575be54ae20",
41
- "installed_at": "2026-04-15T23:53:44.341323+00:00",
42
- "source": "sdk",
43
- "trust_level": "trusted",
44
- "permissions": {
45
- "network_level": "none",
46
- "filesystem_level": "temp",
47
- "code_execution_level": "none",
48
- "data_access_level": "input_only",
49
- "user_approval_level": "never"
50
- },
51
- "prompts": [],
52
- "resources": [],
53
- "connector": null,
54
- "agent": null
55
- },
56
- "web-search-pack": {
57
- "version": "1.0.0",
58
- "package_type": "toolpack",
59
- "runtime": "python",
60
- "entrypoint": "web_search_pack.tool",
61
- "capability_ids": [
62
- "web_search"
63
- ],
64
- "tools": [],
65
- "artifact_hash": "sha256:3e667ba523ceddf6137a1a15f4103d48a59085d1d277750f30addf2758228d12",
66
- "installed_at": "2026-04-16T13:48:00.554169+00:00",
67
- "source": "sdk",
68
- "trust_level": "trusted",
69
- "permissions": {
70
- "network_level": "restricted",
71
- "filesystem_level": "none",
72
- "code_execution_level": "none",
73
- "data_access_level": "input_only",
74
- "user_approval_level": "never"
75
- },
76
- "prompts": [],
77
- "resources": [],
78
- "connector": null,
79
- "agent": null
80
- },
81
- "web-design-pack": {
82
- "version": "1.0.0",
83
- "package_type": "toolpack",
84
- "runtime": "python",
85
- "entrypoint": "web_design_pack.tool",
86
- "capability_ids": [
87
- "web_design"
88
- ],
89
- "tools": [],
90
- "artifact_hash": "sha256:bf90bc3e2fb78682bc3df5f53d7a195675c564f0f3ede8dddfce403b59b73525",
91
- "installed_at": "2026-04-16T13:48:58.751523+00:00",
92
- "source": "sdk",
93
- "trust_level": "trusted",
94
- "permissions": {
95
- "network_level": "none",
96
- "filesystem_level": "temp",
97
- "code_execution_level": "none",
98
- "data_access_level": "input_only",
99
- "user_approval_level": "never"
100
- },
101
- "prompts": [],
102
- "resources": [],
103
- "connector": null,
104
- "agent": null
105
- },
106
- "csv-analyzer-pack": {
107
- "version": "1.0.0",
108
- "package_type": "toolpack",
109
- "runtime": "python",
110
- "entrypoint": "csv_analyzer_pack.tool",
111
- "capability_ids": [
112
- "csv_analysis"
113
- ],
114
- "tools": [],
115
- "artifact_hash": "sha256:62cfe9be62e97174ab41eff190e356d1c512b11ac88cb566d7c75e5f5e0f8d42",
116
- "installed_at": "2026-04-24T13:59:54.295800+00:00",
117
- "source": "sdk",
118
- "trust_level": "trusted",
119
- "permissions": {
120
- "network_level": "none",
121
- "filesystem_level": "temp",
122
- "code_execution_level": "none",
123
- "data_access_level": "input_only",
124
- "user_approval_level": "never"
125
- },
126
- "prompts": [],
127
- "resources": [],
128
- "connector": null,
129
- "agent": null
130
- },
131
- "data-visualizer-pack": {
132
- "version": "1.0.0",
133
- "package_type": "toolpack",
134
- "runtime": "python",
135
- "entrypoint": "data_visualizer_pack.tool",
136
- "capability_ids": [
137
- "data_visualization"
138
- ],
139
- "tools": [],
140
- "artifact_hash": "sha256:bc9485ae4d4eec2644fb0b5dc0d8108293142db673e877b30f64dd335298822b",
141
- "installed_at": "2026-05-05T10:30:55.275916+00:00",
142
- "source": "sdk",
143
- "trust_level": "trusted",
144
- "permissions": {
145
- "network_level": "none",
146
- "filesystem_level": "temp",
147
- "code_execution_level": "none",
148
- "data_access_level": "input_only",
149
- "user_approval_level": "never"
150
- },
151
- "prompts": [],
152
- "resources": [],
153
- "connector": null,
154
- "agent": null
155
- },
156
- "mcp-filesystem": {
157
- "version": "0.1.0",
158
- "package_type": "toolpack",
159
- "runtime": "mcp",
160
- "entrypoint": "",
161
- "capability_ids": [
162
- "file_read",
163
- "file_write",
164
- "file_read"
165
- ],
166
- "tools": [],
167
- "artifact_hash": "",
168
- "installed_at": "2026-05-28T19:19:36.026966+00:00",
169
- "source": "sdk",
170
- "trust_level": "unverified",
171
- "last_trust_check": "2026-05-28T19:19:36.026975+00:00",
172
- "permissions": {
173
- "network_level": "none",
174
- "filesystem_level": "none",
175
- "code_execution_level": "none",
176
- "data_access_level": "input_only",
177
- "user_approval_level": "once"
178
- },
179
- "prompts": [],
180
- "resources": [],
181
- "connector": null,
182
- "agent": null,
183
- "publisher_slug": "agentnode-community",
184
- "mcp_command": [
185
- "npx",
186
- "-y",
187
- "@modelcontextprotocol/server-filesystem@2025.3.28"
188
- ],
189
- "_integrity": {
190
- "algorithm": "sha256",
191
- "canonical_version": 3,
192
- "hash": "e328410426cb56408c78c3a8b4ca3e5149b0f9a69e209755a2473c5596344e77"
193
- }
194
- },
195
- "mcp-brave-search": {
196
- "version": "0.1.0",
197
- "package_type": "toolpack",
198
- "runtime": "mcp",
199
- "entrypoint": "",
200
- "capability_ids": [
201
- "web_search"
202
- ],
203
- "tools": [],
204
- "artifact_hash": "",
205
- "installed_at": "2026-05-28T19:20:23.929529+00:00",
206
- "source": "sdk",
207
- "trust_level": "unverified",
208
- "last_trust_check": "2026-05-28T19:20:23.929538+00:00",
209
- "permissions": {
210
- "network_level": "none",
211
- "filesystem_level": "none",
212
- "code_execution_level": "none",
213
- "data_access_level": "input_only",
214
- "user_approval_level": "once"
215
- },
216
- "prompts": [],
217
- "resources": [],
218
- "connector": null,
219
- "agent": null,
220
- "publisher_slug": "agentnode-community",
221
- "mcp_command": [
222
- "npx",
223
- "-y",
224
- "@modelcontextprotocol/server-brave-search@2025.3.28"
225
- ],
226
- "mcp_env_keys": [
227
- "BRAVE_API_KEY"
228
- ],
229
- "_integrity": {
230
- "algorithm": "sha256",
231
- "canonical_version": 3,
232
- "hash": "6971a6e31fc7b6364c7378cde6d6a2f86712aa7cc80ab53ddbcedf731b03632f"
233
- }
234
- }
235
- }
236
- }
1
+ {
2
+ "lockfile_version": "0.1",
3
+ "updated_at": "2026-05-28T19:20:23.936900+00:00",
4
+ "packages": {
5
+ "word-counter-pack": {
6
+ "version": "1.0.0",
7
+ "package_type": "toolpack",
8
+ "runtime": "python",
9
+ "entrypoint": "word_counter_pack.tool",
10
+ "capability_ids": [
11
+ "data_cleaning"
12
+ ],
13
+ "tools": [
14
+ {
15
+ "name": "count_words",
16
+ "entrypoint": "word_counter_pack.tool:count_words"
17
+ }
18
+ ],
19
+ "artifact_hash": "sha256:445388c86aa2b20c3e748f58b2d221548f1f3f71ff5c715a64cdc80966fab03c",
20
+ "installed_at": "2026-03-18T02:18:53.827396+00:00",
21
+ "source": "sdk",
22
+ "trust_level": "trusted",
23
+ "permissions": {
24
+ "network_level": "none",
25
+ "filesystem_level": "none",
26
+ "code_execution_level": "none",
27
+ "data_access_level": "input_only",
28
+ "user_approval_level": "never"
29
+ }
30
+ },
31
+ "pdf-reader-pack": {
32
+ "version": "1.0.0",
33
+ "package_type": "toolpack",
34
+ "runtime": "python",
35
+ "entrypoint": "pdf_reader_pack.tool",
36
+ "capability_ids": [
37
+ "pdf_extraction"
38
+ ],
39
+ "tools": [],
40
+ "artifact_hash": "sha256:4635316cb5f8ee477f41ccad570c3bcd5026fc7cd1fbf402a12df575be54ae20",
41
+ "installed_at": "2026-04-15T23:53:44.341323+00:00",
42
+ "source": "sdk",
43
+ "trust_level": "trusted",
44
+ "permissions": {
45
+ "network_level": "none",
46
+ "filesystem_level": "temp",
47
+ "code_execution_level": "none",
48
+ "data_access_level": "input_only",
49
+ "user_approval_level": "never"
50
+ },
51
+ "prompts": [],
52
+ "resources": [],
53
+ "connector": null,
54
+ "agent": null
55
+ },
56
+ "web-search-pack": {
57
+ "version": "1.0.0",
58
+ "package_type": "toolpack",
59
+ "runtime": "python",
60
+ "entrypoint": "web_search_pack.tool",
61
+ "capability_ids": [
62
+ "web_search"
63
+ ],
64
+ "tools": [],
65
+ "artifact_hash": "sha256:3e667ba523ceddf6137a1a15f4103d48a59085d1d277750f30addf2758228d12",
66
+ "installed_at": "2026-04-16T13:48:00.554169+00:00",
67
+ "source": "sdk",
68
+ "trust_level": "trusted",
69
+ "permissions": {
70
+ "network_level": "restricted",
71
+ "filesystem_level": "none",
72
+ "code_execution_level": "none",
73
+ "data_access_level": "input_only",
74
+ "user_approval_level": "never"
75
+ },
76
+ "prompts": [],
77
+ "resources": [],
78
+ "connector": null,
79
+ "agent": null
80
+ },
81
+ "web-design-pack": {
82
+ "version": "1.0.0",
83
+ "package_type": "toolpack",
84
+ "runtime": "python",
85
+ "entrypoint": "web_design_pack.tool",
86
+ "capability_ids": [
87
+ "web_design"
88
+ ],
89
+ "tools": [],
90
+ "artifact_hash": "sha256:bf90bc3e2fb78682bc3df5f53d7a195675c564f0f3ede8dddfce403b59b73525",
91
+ "installed_at": "2026-04-16T13:48:58.751523+00:00",
92
+ "source": "sdk",
93
+ "trust_level": "trusted",
94
+ "permissions": {
95
+ "network_level": "none",
96
+ "filesystem_level": "temp",
97
+ "code_execution_level": "none",
98
+ "data_access_level": "input_only",
99
+ "user_approval_level": "never"
100
+ },
101
+ "prompts": [],
102
+ "resources": [],
103
+ "connector": null,
104
+ "agent": null
105
+ },
106
+ "csv-analyzer-pack": {
107
+ "version": "1.0.0",
108
+ "package_type": "toolpack",
109
+ "runtime": "python",
110
+ "entrypoint": "csv_analyzer_pack.tool",
111
+ "capability_ids": [
112
+ "csv_analysis"
113
+ ],
114
+ "tools": [],
115
+ "artifact_hash": "sha256:62cfe9be62e97174ab41eff190e356d1c512b11ac88cb566d7c75e5f5e0f8d42",
116
+ "installed_at": "2026-04-24T13:59:54.295800+00:00",
117
+ "source": "sdk",
118
+ "trust_level": "trusted",
119
+ "permissions": {
120
+ "network_level": "none",
121
+ "filesystem_level": "temp",
122
+ "code_execution_level": "none",
123
+ "data_access_level": "input_only",
124
+ "user_approval_level": "never"
125
+ },
126
+ "prompts": [],
127
+ "resources": [],
128
+ "connector": null,
129
+ "agent": null
130
+ },
131
+ "data-visualizer-pack": {
132
+ "version": "1.0.0",
133
+ "package_type": "toolpack",
134
+ "runtime": "python",
135
+ "entrypoint": "data_visualizer_pack.tool",
136
+ "capability_ids": [
137
+ "data_visualization"
138
+ ],
139
+ "tools": [],
140
+ "artifact_hash": "sha256:bc9485ae4d4eec2644fb0b5dc0d8108293142db673e877b30f64dd335298822b",
141
+ "installed_at": "2026-05-05T10:30:55.275916+00:00",
142
+ "source": "sdk",
143
+ "trust_level": "trusted",
144
+ "permissions": {
145
+ "network_level": "none",
146
+ "filesystem_level": "temp",
147
+ "code_execution_level": "none",
148
+ "data_access_level": "input_only",
149
+ "user_approval_level": "never"
150
+ },
151
+ "prompts": [],
152
+ "resources": [],
153
+ "connector": null,
154
+ "agent": null
155
+ },
156
+ "mcp-filesystem": {
157
+ "version": "0.1.0",
158
+ "package_type": "toolpack",
159
+ "runtime": "mcp",
160
+ "entrypoint": "",
161
+ "capability_ids": [
162
+ "file_read",
163
+ "file_write",
164
+ "file_read"
165
+ ],
166
+ "tools": [],
167
+ "artifact_hash": "",
168
+ "installed_at": "2026-05-28T19:19:36.026966+00:00",
169
+ "source": "sdk",
170
+ "trust_level": "unverified",
171
+ "last_trust_check": "2026-05-28T19:19:36.026975+00:00",
172
+ "permissions": {
173
+ "network_level": "none",
174
+ "filesystem_level": "none",
175
+ "code_execution_level": "none",
176
+ "data_access_level": "input_only",
177
+ "user_approval_level": "once"
178
+ },
179
+ "prompts": [],
180
+ "resources": [],
181
+ "connector": null,
182
+ "agent": null,
183
+ "publisher_slug": "agentnode-community",
184
+ "mcp_command": [
185
+ "npx",
186
+ "-y",
187
+ "@modelcontextprotocol/server-filesystem@2025.3.28"
188
+ ],
189
+ "_integrity": {
190
+ "algorithm": "sha256",
191
+ "canonical_version": 3,
192
+ "hash": "e328410426cb56408c78c3a8b4ca3e5149b0f9a69e209755a2473c5596344e77"
193
+ }
194
+ },
195
+ "mcp-brave-search": {
196
+ "version": "0.1.0",
197
+ "package_type": "toolpack",
198
+ "runtime": "mcp",
199
+ "entrypoint": "",
200
+ "capability_ids": [
201
+ "web_search"
202
+ ],
203
+ "tools": [],
204
+ "artifact_hash": "",
205
+ "installed_at": "2026-05-28T19:20:23.929529+00:00",
206
+ "source": "sdk",
207
+ "trust_level": "unverified",
208
+ "last_trust_check": "2026-05-28T19:20:23.929538+00:00",
209
+ "permissions": {
210
+ "network_level": "none",
211
+ "filesystem_level": "none",
212
+ "code_execution_level": "none",
213
+ "data_access_level": "input_only",
214
+ "user_approval_level": "once"
215
+ },
216
+ "prompts": [],
217
+ "resources": [],
218
+ "connector": null,
219
+ "agent": null,
220
+ "publisher_slug": "agentnode-community",
221
+ "mcp_command": [
222
+ "npx",
223
+ "-y",
224
+ "@modelcontextprotocol/server-brave-search@2025.3.28"
225
+ ],
226
+ "mcp_env_keys": [
227
+ "BRAVE_API_KEY"
228
+ ],
229
+ "_integrity": {
230
+ "algorithm": "sha256",
231
+ "canonical_version": 3,
232
+ "hash": "6971a6e31fc7b6364c7378cde6d6a2f86712aa7cc80ab53ddbcedf731b03632f"
233
+ }
234
+ }
235
+ }
236
+ }
@@ -38,7 +38,7 @@ from agentnode_sdk.runtime import AgentNodeRuntime
38
38
  Client = AgentNodeClient
39
39
  ToolError = AgentNodeToolError
40
40
 
41
- __version__ = "0.20.0"
41
+ __version__ = "0.21.0"
42
42
  __all__ = [
43
43
  "AgentNode",
44
44
  "AsyncAgentNode",
@@ -324,6 +324,26 @@ def _extract_warnings(message: str) -> str:
324
324
  return text.strip()
325
325
 
326
326
 
327
+ def _publish_outcome(resp: dict) -> tuple[bool, str, list[str]]:
328
+ """Normalize a publish response into (quarantined, reason, warnings).
329
+
330
+ Prefers the structured fields (quarantined / quarantine_reason / warnings);
331
+ falls back to parsing the message text for older backends that don't send
332
+ them yet.
333
+ """
334
+ if "quarantined" in resp:
335
+ quarantined = bool(resp.get("quarantined"))
336
+ warnings_list = [w for w in (resp.get("warnings") or []) if w]
337
+ reason = resp.get("quarantine_reason") or (
338
+ "; ".join(warnings_list) if warnings_list else ""
339
+ )
340
+ return quarantined, reason, warnings_list
341
+ msg = resp.get("message", "")
342
+ quarantined = "quarantine" in msg.lower()
343
+ reason = _extract_warnings(msg)
344
+ return quarantined, reason, ([reason] if reason else [])
345
+
346
+
327
347
  def cmd_publish(
328
348
  path_str: str,
329
349
  *,
@@ -496,8 +516,13 @@ def cmd_publish(
496
516
 
497
517
  slug = resp.get("slug", pkg_id)
498
518
  ver = resp.get("version", version)
499
- msg = resp.get("message", "")
500
- quarantined = "quarantine" in msg.lower()
519
+
520
+ # Prefer the structured publish outcome; fall back to parsing the message
521
+ # text for older backends that don't return the quarantined flag yet.
522
+ quarantined, reason, warnings_list = _publish_outcome(resp)
523
+ # For a quarantined result, the reason is shown on its own line; don't also
524
+ # repeat it in the generic warnings loop.
525
+ display_warnings = [] if quarantined else warnings_list
501
526
 
502
527
  print(f" Published {slug}@{ver}")
503
528
  print()
@@ -507,15 +532,15 @@ def cmd_publish(
507
532
  # search and not installable until cleared. Frame it honestly instead
508
533
  # of printing the URL as if the package were already live.
509
534
  print(" Status: Under review — not yet public.")
510
- reason = _extract_warnings(msg)
511
535
  if reason:
512
536
  print(f" {reason}")
513
537
  print(" It won't appear in search or be installable until review clears it.")
514
538
  print()
515
539
  print(f" Track status: https://agentnode.net/packages/{slug}")
516
540
  else:
517
- if "warning" in msg.lower():
518
- print(f" {msg}")
541
+ for w in display_warnings:
542
+ print(f" Warning: {w}")
543
+ if display_warnings:
519
544
  print()
520
545
  print(f" Live: https://agentnode.net/packages/{slug}")
521
546
  print(" Verification runs automatically; its tier and score appear on the page shortly.")
@@ -342,19 +342,15 @@ def _sandbox_screen(cfg: dict) -> tuple[str, bool]:
342
342
  print()
343
343
  print(" Sandbox ready — community packages run isolated.")
344
344
  print()
345
- print(" Sandboxed community agents are currently disabled (default).")
346
- print(" Enabling lets verified/unverified community agents run isolated;")
347
- print(" without it they are refused.")
345
+ print(" Sandboxed community agents are enabled by default: verified/")
346
+ print(" unverified community agents run isolated in the sandbox, or are")
347
+ print(" refused if it is unavailable — never on the host.")
348
348
  if sys.stdin.isatty():
349
- en = _prompt(" Enable sandboxed community agents now? [y/N]: ", "n")
350
- if en.lower() == "y":
351
- cfg["agent_sandbox"]["enabled"] = True
352
- else:
353
- print(dim(" You can enable it later with "
354
- "`agentnode config set agent_sandbox.enabled true`."))
355
- else:
356
- print(dim(" Enable later with "
357
- "`agentnode config set agent_sandbox.enabled true`."))
349
+ dis = _prompt(" Disable sandboxed community agents? [y/N]: ", "n")
350
+ if dis.lower() == "y":
351
+ cfg["agent_sandbox"]["enabled"] = False
352
+ print(dim(" Disabled — community agents will be refused outright. "
353
+ "Re-enable with `agentnode config set agent_sandbox.enabled true`."))
358
354
  return "ready", False
359
355
 
360
356
  from agentnode_sdk.cli.sandbox_commands import _first_failure
@@ -42,7 +42,13 @@ DEFAULTS: dict[str, Any] = {
42
42
  "unknown": "prompt",
43
43
  },
44
44
  "agent_sandbox": {
45
- "enabled": False,
45
+ # Default ON (Slice B, SDK 0.21.0): community agents run sandbox-or-refuse,
46
+ # consistent with toolpacks and MCPs. On a host without a container runtime
47
+ # + pinned image they are refused cleanly (never a host fallback); with the
48
+ # sandbox present they run in the container (LLM key stays host-side behind
49
+ # the broker, tool calls via RPC). Set to false to restore the old behavior
50
+ # (community agents refused outright).
51
+ "enabled": True,
46
52
  },
47
53
  "sandbox": {
48
54
  "host_trust_policy": "default",