agentnode-sdk 0.19.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.19.0 → agentnode_sdk-0.21.0}/CHANGELOG.md +71 -0
  2. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/PKG-INFO +1 -1
  3. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode.lock +236 -236
  4. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/__init__.py +1 -1
  5. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/commands.py +39 -0
  6. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_submit.py +165 -161
  7. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_verify.py +747 -747
  8. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/publish.py +548 -494
  9. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/setup_wizard.py +8 -12
  10. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/client.py +4 -0
  11. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/config.py +7 -1
  12. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/installer.py +5 -0
  13. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/lock_integrity.py +5 -0
  14. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/models.py +6 -0
  15. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runner.py +5 -1
  16. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_sandbox.py +223 -218
  17. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/python_runner.py +78 -10
  18. agentnode_sdk-0.21.0/agentnode_sdk/runtimes/toolpack_credentials.py +151 -0
  19. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/agent_container_wrapper.py +124 -83
  20. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/pyproject.toml +1 -1
  21. agentnode_sdk-0.21.0/scripts/check_model_drift.py +65 -0
  22. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/scripts/ci_smoke_test.py +3 -2
  23. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_runner.py +6 -0
  24. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_sandbox_e2e.py +182 -175
  25. agentnode_sdk-0.21.0/tests/test_agent_sandbox_hardening.py +174 -0
  26. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_sandbox_routing.py +56 -11
  27. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_config.py +129 -128
  28. agentnode_sdk-0.21.0/tests/test_mcp_submit.py +68 -0
  29. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_publish.py +756 -678
  30. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_runner.py +3 -1
  31. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_setup_wizard.py +18 -16
  32. agentnode_sdk-0.21.0/tests/test_toolpack_credentials.py +114 -0
  33. agentnode_sdk-0.21.0/tests/test_toolpack_credentials_b.py +257 -0
  34. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/.env.example +0 -0
  35. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/.gitignore +0 -0
  36. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/README.md +0 -0
  37. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/REGISTRY_SIGNING_ACTIVATION.md +0 -0
  38. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/REGISTRY_SIGNING_SPEC.md +0 -0
  39. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/THREAT_MODEL.md +0 -0
  40. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/TRUST_STACK.md +0 -0
  41. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/_fileutil.py +0 -0
  42. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/async_client.py +0 -0
  43. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/capability_graph.py +0 -0
  44. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/capability_taxonomy.py +0 -0
  45. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/__init__.py +0 -0
  46. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/__main__.py +0 -0
  47. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/audit.py +0 -0
  48. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/auth.py +0 -0
  49. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/cassette_audit.py +0 -0
  50. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/complements.py +0 -0
  51. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/init.py +0 -0
  52. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/main.py +0 -0
  53. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_commands.py +0 -0
  54. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/mcp_status.py +0 -0
  55. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/output.py +0 -0
  56. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/record_cases.py +0 -0
  57. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/sandbox_commands.py +0 -0
  58. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/serve.py +0 -0
  59. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/smart_run.py +0 -0
  60. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/templates.py +0 -0
  61. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/validate.py +0 -0
  62. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/cli/verify_local.py +0 -0
  63. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/compatibility.py +0 -0
  64. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/credential_handle.py +0 -0
  65. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/credential_resolver.py +0 -0
  66. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/credential_store.py +0 -0
  67. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/detect.py +0 -0
  68. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/exceptions.py +0 -0
  69. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/guard.py +0 -0
  70. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/input_guard.py +0 -0
  71. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/key_status.py +0 -0
  72. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/llm_providers.py +0 -0
  73. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/mcp_server.py +0 -0
  74. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/planner.py +0 -0
  75. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/policy.py +0 -0
  76. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/references.py +0 -0
  77. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/registry_trust.py +0 -0
  78. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/resolve.py +0 -0
  79. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/resource_provider.py +0 -0
  80. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/risk_profile.py +0 -0
  81. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/run_log.py +0 -0
  82. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtime.py +0 -0
  83. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/__init__.py +0 -0
  84. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_llm_broker.py +0 -0
  85. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_llm_policy.py +0 -0
  86. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/agent_runner.py +0 -0
  87. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/mcp_consent.py +0 -0
  88. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/mcp_consent_store.py +0 -0
  89. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/mcp_runner.py +0 -0
  90. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/runtimes/remote_runner.py +0 -0
  91. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/__init__.py +0 -0
  92. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/agent_rpc.py +0 -0
  93. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/agent_session.py +0 -0
  94. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/backend.py +0 -0
  95. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/container_backend.py +0 -0
  96. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/domain_policy.py +0 -0
  97. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/egress.py +0 -0
  98. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/egress_proxy.py +0 -0
  99. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/mcp_preinstall.py +0 -0
  100. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/policy.py +0 -0
  101. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/sandbox/types.py +0 -0
  102. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/signature.py +0 -0
  103. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/signing_key.py +0 -0
  104. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/agentnode_sdk/skill.py +0 -0
  105. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/data/compatibility/current.json +0 -0
  106. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/dist-0.18.0/.gitignore +0 -0
  107. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/dist-0.19.0/.gitignore +0 -0
  108. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/sandbox-image/Dockerfile +0 -0
  109. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/sandbox-image/README.md +0 -0
  110. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/scripts/analyze_scores.py +0 -0
  111. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/scripts/batch_verify.py +0 -0
  112. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/scripts/generate_compatibility_artifacts.py +0 -0
  113. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/scripts/merge_batches.py +0 -0
  114. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/scripts/verify_toolcalls.py +0 -0
  115. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/scripts/weekly_retest.sh +0 -0
  116. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/README.md +0 -0
  117. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/__init__.py +0 -0
  118. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/container_agent_wrapper.py +0 -0
  119. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/fake_llm.py +0 -0
  120. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/host_driver.py +0 -0
  121. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/spikes/agent_sandbox_routing/trivial_agent.py +0 -0
  122. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/__init__.py +0 -0
  123. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/conftest.py +0 -0
  124. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/data/allowed_domains_vectors.json +0 -0
  125. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_llm_broker.py +0 -0
  126. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_llm_policy.py +0 -0
  127. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_rpc.py +0 -0
  128. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_sandbox_spike.py +0 -0
  129. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_agent_session_container.py +0 -0
  130. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_async_client.py +0 -0
  131. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_audit_ux.py +0 -0
  132. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_auth_cli_vault.py +0 -0
  133. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_auto_upgrade_policy.py +0 -0
  134. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_cli.py +0 -0
  135. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_cli_lock.py +0 -0
  136. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_cli_run_resolution.py +0 -0
  137. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_client.py +0 -0
  138. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_client_json_guard.py +0 -0
  139. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_client_sprint_b.py +0 -0
  140. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_consent_prompt.py +0 -0
  141. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_credential_handle.py +0 -0
  142. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_credential_integration.py +0 -0
  143. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_credential_resolver.py +0 -0
  144. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_credential_store.py +0 -0
  145. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_credential_vault.py +0 -0
  146. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_detect.py +0 -0
  147. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_detect_and_install.py +0 -0
  148. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_domain_policy.py +0 -0
  149. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_e2e_runtime.py +0 -0
  150. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_edge_cases.py +0 -0
  151. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_egress_domain_validation.py +0 -0
  152. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_egress_e2e.py +0 -0
  153. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_egress_lifecycle.py +0 -0
  154. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_egress_proxy_unit.py +0 -0
  155. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_egress_wrap.py +0 -0
  156. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_env_passthrough_wrap.py +0 -0
  157. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard.py +0 -0
  158. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_check.py +0 -0
  159. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_config_cache.py +0 -0
  160. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_policy.py +0 -0
  161. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_preview.py +0 -0
  162. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_schema.py +0 -0
  163. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_set.py +0 -0
  164. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_status.py +0 -0
  165. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_tool_override.py +0 -0
  166. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_tool_override_audit.py +0 -0
  167. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_tool_override_cli.py +0 -0
  168. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_guard_ux.py +0 -0
  169. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_host_trust_policy.py +0 -0
  170. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_host_trust_policy_routing.py +0 -0
  171. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_input_guard.py +0 -0
  172. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_input_guard_escalation.py +0 -0
  173. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_install_hardening.py +0 -0
  174. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_installer_sprint_b.py +0 -0
  175. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_intelligence.py +0 -0
  176. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_key_status.py +0 -0
  177. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_llm_binding.py +0 -0
  178. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_llm_call_runlog.py +0 -0
  179. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_llm_providers.py +0 -0
  180. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_llm_vault_binding.py +0 -0
  181. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_lock_integrity.py +0 -0
  182. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_lock_runtime.py +0 -0
  183. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_allowed_domains_seal.py +0 -0
  184. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_audit.py +0 -0
  185. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_consent.py +0 -0
  186. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_consent_resolver.py +0 -0
  187. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_consent_store.py +0 -0
  188. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_credentialed_launch.py +0 -0
  189. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_doctor.py +0 -0
  190. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_preinstall.py +0 -0
  191. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_preinstall_run.py +0 -0
  192. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_sandbox.py +0 -0
  193. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_mcp_server.py +0 -0
  194. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_observability.py +0 -0
  195. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_planner.py +0 -0
  196. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_policy.py +0 -0
  197. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_policy_integration.py +0 -0
  198. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_prompt_specs.py +0 -0
  199. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_provider_matrix.py +0 -0
  200. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_references.py +0 -0
  201. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_registry_trust.py +0 -0
  202. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_remote_hardening.py +0 -0
  203. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_remote_runner.py +0 -0
  204. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_resource_provider.py +0 -0
  205. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_resource_specs.py +0 -0
  206. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_risk_profile.py +0 -0
  207. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_run_log.py +0 -0
  208. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_runtime.py +0 -0
  209. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_runtime_audit.py +0 -0
  210. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_backend.py +0 -0
  211. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_doctor.py +0 -0
  212. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_e2e.py +0 -0
  213. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_sandbox_gate.py +0 -0
  214. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_security_hardening.py +0 -0
  215. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_signature.py +0 -0
  216. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_signing_key.py +0 -0
  217. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_skill.py +0 -0
  218. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_smart.py +0 -0
  219. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_stability.py +0 -0
  220. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_toolpack_sandbox.py +0 -0
  221. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_v02.py +0 -0
  222. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_validate.py +0 -0
  223. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/test_validate_skill.py +0 -0
  224. {agentnode_sdk-0.19.0 → agentnode_sdk-0.21.0}/tests/validation_lockfile.json +0 -0
@@ -1,5 +1,76 @@
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
+
41
+ ## 0.20.0 — Credentialed toolpacks (bring your own API key)
42
+
43
+ ### Added
44
+
45
+ - Toolpacks can declare the credentials they need (`env_requirements` in the
46
+ manifest: names, required flag, description — never values). The declaration
47
+ and the publisher's `permissions.network.allowed_domains` egress allowlist
48
+ are sealed into the lockfile at install (integrity-covered; tampering with
49
+ either breaks lockfile integrity).
50
+ - `agentnode install` lists the declared environment variables with their
51
+ set/not-set status and tells you to set required ones before running.
52
+ - Sandboxed community toolpacks can now receive user-provided API keys under
53
+ a fail-closed regime mirroring credentialed MCPs: a consent prompt (or a
54
+ stored grant) bound to the exact package identity
55
+ (slug + version + artifact hash + key names + domains), an enforced egress
56
+ proxy restricted to the sealed `allowed_domains`, and name-only key
57
+ pass-through (`--env NAME` — the value never appears on argv, in the
58
+ process spec, or in logs).
59
+
60
+ ### Changed
61
+
62
+ - Running a toolpack with a missing *required* environment variable now fails
63
+ before dispatch with an actionable, value-free message
64
+ (`mode_used="credentials_missing"`) instead of a cryptic tool error.
65
+
66
+ ### Security
67
+
68
+ - A credentialed toolpack without a valid, non-empty `allowed_domains`
69
+ allowlist is refused — a secret never rides an open or unrestricted
70
+ network. Consent cannot transfer between packages, versions, artifacts,
71
+ key sets, or domain sets. There is no fallback run without these
72
+ protections. Non-credentialed toolpacks behave exactly as before.
73
+
3
74
  ## 0.19.0 — Full setup wizard coverage
4
75
 
5
76
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentnode-sdk
3
- Version: 0.19.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.19.0"
41
+ __version__ = "0.21.0"
42
42
  __all__ = [
43
43
  "AgentNode",
44
44
  "AsyncAgentNode",
@@ -813,6 +813,7 @@ def cmd_install(capability: str, version: str | None = None, yes: bool = False)
813
813
  _print_install_trust_summary(result.slug)
814
814
  _print_install_guard_summary(result.slug)
815
815
  _print_install_mcp_guidance(result.slug)
816
+ _print_install_env_guidance(result.slug)
816
817
  print()
817
818
  else:
818
819
  print(f"\n {result.message}\n")
@@ -1937,6 +1938,44 @@ def _print_install_mcp_guidance(slug: str) -> None:
1937
1938
  pass
1938
1939
 
1939
1940
 
1941
+ def _print_install_env_guidance(slug: str) -> None:
1942
+ """Post-install guidance for toolpacks that declare env_requirements.
1943
+
1944
+ Names + set/missing status only — a credential VALUE is never read or
1945
+ printed.
1946
+ """
1947
+ import os
1948
+ from agentnode_sdk.installer import read_lockfile
1949
+
1950
+ try:
1951
+ lock = read_lockfile()
1952
+ pkg = lock.get("packages", {}).get(slug, {})
1953
+ if not pkg or pkg.get("runtime") == "mcp":
1954
+ return
1955
+ reqs = pkg.get("env_requirements") or []
1956
+ if not reqs:
1957
+ return
1958
+ print()
1959
+ print(" This toolpack declares environment variables:")
1960
+ for r in reqs:
1961
+ if not isinstance(r, dict) or not r.get("name"):
1962
+ continue
1963
+ name = r["name"]
1964
+ required = r.get("required", True)
1965
+ status = "set" if name in os.environ else "not set"
1966
+ tag = "required" if required else "optional"
1967
+ print(f" {name} ({tag}, {status})")
1968
+ missing_required = [
1969
+ r["name"] for r in reqs
1970
+ if isinstance(r, dict) and r.get("name")
1971
+ and r.get("required", True) and r["name"] not in os.environ
1972
+ ]
1973
+ if missing_required:
1974
+ print(" Set the required variable(s) before running this toolpack.")
1975
+ except Exception:
1976
+ pass
1977
+
1978
+
1940
1979
  def _severity(action: str) -> int:
1941
1980
  return {"allow": 0, "prompt": 1, "deny": 2}.get(action, 0)
1942
1981