agentnode-sdk 0.12.0__tar.gz → 0.12.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 (184) hide show
  1. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/CHANGELOG.md +22 -0
  2. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/PKG-INFO +1 -1
  3. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/__init__.py +1 -1
  4. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/config.py +14 -1
  5. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/pyproject.toml +1 -1
  6. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_config.py +99 -0
  7. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/.env.example +0 -0
  8. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/.gitignore +0 -0
  9. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/README.md +0 -0
  10. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/REGISTRY_SIGNING_ACTIVATION.md +0 -0
  11. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/REGISTRY_SIGNING_SPEC.md +0 -0
  12. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/THREAT_MODEL.md +0 -0
  13. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/TRUST_STACK.md +0 -0
  14. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode.lock +0 -0
  15. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/_fileutil.py +0 -0
  16. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/async_client.py +0 -0
  17. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/capability_graph.py +0 -0
  18. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/capability_taxonomy.py +0 -0
  19. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/__init__.py +0 -0
  20. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/__main__.py +0 -0
  21. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/audit.py +0 -0
  22. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/auth.py +0 -0
  23. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/cassette_audit.py +0 -0
  24. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/commands.py +0 -0
  25. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/complements.py +0 -0
  26. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/init.py +0 -0
  27. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/main.py +0 -0
  28. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_commands.py +0 -0
  29. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_status.py +0 -0
  30. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_submit.py +0 -0
  31. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_verify.py +0 -0
  32. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/output.py +0 -0
  33. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/publish.py +0 -0
  34. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/record_cases.py +0 -0
  35. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/sandbox_commands.py +0 -0
  36. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/serve.py +0 -0
  37. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/setup_wizard.py +0 -0
  38. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/smart_run.py +0 -0
  39. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/templates.py +0 -0
  40. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/validate.py +0 -0
  41. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/verify_local.py +0 -0
  42. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/client.py +0 -0
  43. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/compatibility.py +0 -0
  44. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/credential_handle.py +0 -0
  45. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/credential_resolver.py +0 -0
  46. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/credential_store.py +0 -0
  47. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/detect.py +0 -0
  48. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/exceptions.py +0 -0
  49. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/guard.py +0 -0
  50. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/input_guard.py +0 -0
  51. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/installer.py +0 -0
  52. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/key_status.py +0 -0
  53. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/lock_integrity.py +0 -0
  54. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/mcp_server.py +0 -0
  55. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/models.py +0 -0
  56. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/planner.py +0 -0
  57. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/policy.py +0 -0
  58. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/references.py +0 -0
  59. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/registry_trust.py +0 -0
  60. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/resolve.py +0 -0
  61. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/resource_provider.py +0 -0
  62. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/risk_profile.py +0 -0
  63. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/run_log.py +0 -0
  64. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runner.py +0 -0
  65. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtime.py +0 -0
  66. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/__init__.py +0 -0
  67. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_llm_broker.py +0 -0
  68. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_llm_policy.py +0 -0
  69. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_runner.py +0 -0
  70. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_sandbox.py +0 -0
  71. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/mcp_runner.py +0 -0
  72. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/python_runner.py +0 -0
  73. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/remote_runner.py +0 -0
  74. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/__init__.py +0 -0
  75. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/agent_container_wrapper.py +0 -0
  76. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/agent_rpc.py +0 -0
  77. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/agent_session.py +0 -0
  78. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/backend.py +0 -0
  79. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/container_backend.py +0 -0
  80. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/policy.py +0 -0
  81. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/types.py +0 -0
  82. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/signature.py +0 -0
  83. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/signing_key.py +0 -0
  84. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/skill.py +0 -0
  85. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/sandbox-image/Dockerfile +0 -0
  86. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/sandbox-image/README.md +0 -0
  87. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/analyze_scores.py +0 -0
  88. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/batch_verify.py +0 -0
  89. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/ci_smoke_test.py +0 -0
  90. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/generate_compatibility_artifacts.py +0 -0
  91. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/verify_toolcalls.py +0 -0
  92. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/weekly_retest.sh +0 -0
  93. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/README.md +0 -0
  94. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/__init__.py +0 -0
  95. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/container_agent_wrapper.py +0 -0
  96. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/fake_llm.py +0 -0
  97. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/host_driver.py +0 -0
  98. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/trivial_agent.py +0 -0
  99. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/__init__.py +0 -0
  100. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/conftest.py +0 -0
  101. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_llm_broker.py +0 -0
  102. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_llm_policy.py +0 -0
  103. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_rpc.py +0 -0
  104. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_runner.py +0 -0
  105. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_sandbox_e2e.py +0 -0
  106. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_sandbox_routing.py +0 -0
  107. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_sandbox_spike.py +0 -0
  108. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_session_container.py +0 -0
  109. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_async_client.py +0 -0
  110. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_audit_ux.py +0 -0
  111. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_auto_upgrade_policy.py +0 -0
  112. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_cli.py +0 -0
  113. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_cli_lock.py +0 -0
  114. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_cli_run_resolution.py +0 -0
  115. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_client.py +0 -0
  116. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_client_json_guard.py +0 -0
  117. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_client_sprint_b.py +0 -0
  118. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_handle.py +0 -0
  119. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_integration.py +0 -0
  120. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_resolver.py +0 -0
  121. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_store.py +0 -0
  122. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_detect.py +0 -0
  123. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_detect_and_install.py +0 -0
  124. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_e2e_runtime.py +0 -0
  125. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_edge_cases.py +0 -0
  126. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard.py +0 -0
  127. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_check.py +0 -0
  128. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_config_cache.py +0 -0
  129. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_policy.py +0 -0
  130. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_preview.py +0 -0
  131. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_schema.py +0 -0
  132. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_set.py +0 -0
  133. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_status.py +0 -0
  134. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_tool_override.py +0 -0
  135. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_tool_override_audit.py +0 -0
  136. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_tool_override_cli.py +0 -0
  137. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_ux.py +0 -0
  138. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_input_guard.py +0 -0
  139. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_input_guard_escalation.py +0 -0
  140. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_install_hardening.py +0 -0
  141. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_installer_sprint_b.py +0 -0
  142. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_intelligence.py +0 -0
  143. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_key_status.py +0 -0
  144. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_llm_binding.py +0 -0
  145. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_llm_call_runlog.py +0 -0
  146. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_lock_integrity.py +0 -0
  147. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_lock_runtime.py +0 -0
  148. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_audit.py +0 -0
  149. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_doctor.py +0 -0
  150. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_sandbox.py +0 -0
  151. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_server.py +0 -0
  152. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_observability.py +0 -0
  153. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_planner.py +0 -0
  154. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_policy.py +0 -0
  155. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_policy_integration.py +0 -0
  156. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_prompt_specs.py +0 -0
  157. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_provider_matrix.py +0 -0
  158. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_publish.py +0 -0
  159. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_references.py +0 -0
  160. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_registry_trust.py +0 -0
  161. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_remote_hardening.py +0 -0
  162. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_remote_runner.py +0 -0
  163. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_resource_provider.py +0 -0
  164. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_resource_specs.py +0 -0
  165. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_risk_profile.py +0 -0
  166. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_run_log.py +0 -0
  167. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_runner.py +0 -0
  168. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_runtime.py +0 -0
  169. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_runtime_audit.py +0 -0
  170. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_backend.py +0 -0
  171. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_doctor.py +0 -0
  172. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_e2e.py +0 -0
  173. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_gate.py +0 -0
  174. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_security_hardening.py +0 -0
  175. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_signature.py +0 -0
  176. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_signing_key.py +0 -0
  177. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_skill.py +0 -0
  178. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_smart.py +0 -0
  179. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_stability.py +0 -0
  180. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_toolpack_sandbox.py +0 -0
  181. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_v02.py +0 -0
  182. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_validate.py +0 -0
  183. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_validate_skill.py +0 -0
  184. {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/validation_lockfile.json +0 -0
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.1 — agent_sandbox config fix
4
+
5
+ ### Fixed
6
+
7
+ - **`agent_sandbox` config section was stripped during `load_config()`.** The
8
+ config loader rebuilt the file from defaults and silently dropped a
9
+ hand-written `agent_sandbox` section, so the documented
10
+ `agent_sandbox.enabled: true` config path never took effect (only the
11
+ `AGENTNODE_AGENT_SANDBOX` env var worked), and the host LLM ceiling
12
+ (`agent_sandbox.llm.*`) never reached policy resolution. Both now survive
13
+ loading; the nested `llm` ceiling is passed through verbatim.
14
+ - **`agentnode config set agent_sandbox.enabled true|false` now works** (the
15
+ key was missing from the allowed-keys whitelist) and stores a **real
16
+ boolean** — previously a stored string `"false"` would have been truthy,
17
+ i.e. read as enabled.
18
+
19
+ ### Upgrade Notes
20
+
21
+ - No breaking changes. No behavior change unless you use the `agent_sandbox`
22
+ config path; the env var `AGENTNODE_AGENT_SANDBOX` behaves exactly as
23
+ before. The agent sandbox remains **default OFF**.
24
+
3
25
  ## 0.12.0 — Sandboxed community agents (flag-gated)
4
26
 
5
27
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentnode-sdk
3
- Version: 0.12.0
3
+ Version: 0.12.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.12.0"
41
+ __version__ = "0.12.1"
42
42
  __all__ = [
43
43
  "AgentNode",
44
44
  "AsyncAgentNode",
@@ -41,6 +41,9 @@ DEFAULTS: dict[str, Any] = {
41
41
  "compute": "allow",
42
42
  "unknown": "prompt",
43
43
  },
44
+ "agent_sandbox": {
45
+ "enabled": False,
46
+ },
44
47
  }
45
48
 
46
49
  VALID_VALUES: dict[str, tuple[str, ...]] = {
@@ -61,6 +64,7 @@ VALID_VALUES: dict[str, tuple[str, ...]] = {
61
64
  "guard.read": ("allow", "prompt", "deny"),
62
65
  "guard.compute": ("allow", "prompt", "deny"),
63
66
  "guard.unknown": ("allow", "prompt", "deny"),
67
+ "agent_sandbox.enabled": ("true", "false"),
64
68
  }
65
69
 
66
70
 
@@ -82,6 +86,7 @@ CONFIG_DESCRIPTIONS: dict[str, str] = {
82
86
  "guard.read": "Guard policy for tools that read data",
83
87
  "guard.compute": "Guard policy for tools that perform computation",
84
88
  "guard.unknown": "Guard policy for tools with unknown action type",
89
+ "agent_sandbox.enabled": "Route community (verified/unverified) agents through the container sandbox",
85
90
  }
86
91
 
87
92
 
@@ -138,6 +143,14 @@ def _merge_defaults(data: dict) -> dict[str, Any]:
138
143
  for extra_key in ("rate_limits", "agent_overrides", "tool_overrides"):
139
144
  if extra_key in data["guard"]:
140
145
  cfg["guard"][extra_key] = data["guard"][extra_key]
146
+ if isinstance(data.get("agent_sandbox"), dict):
147
+ if "enabled" in data["agent_sandbox"]:
148
+ cfg["agent_sandbox"]["enabled"] = data["agent_sandbox"]["enabled"]
149
+ # The nested llm ceiling (max_calls/max_input_chars/max_output_chars/
150
+ # allowed_models/enabled) holds ints/lists — pass it through verbatim,
151
+ # like the guard extra keys above.
152
+ if isinstance(data["agent_sandbox"].get("llm"), dict):
153
+ cfg["agent_sandbox"]["llm"] = data["agent_sandbox"]["llm"]
141
154
  return cfg
142
155
 
143
156
 
@@ -201,7 +214,7 @@ def set_value(cfg: dict[str, Any], key: str, value: str) -> dict[str, Any]:
201
214
  f"Allowed: {', '.join(allowed)}"
202
215
  )
203
216
 
204
- bool_keys = ("credentials.require_before_auto_install",)
217
+ bool_keys = ("credentials.require_before_auto_install", "agent_sandbox.enabled")
205
218
  actual_value: Any = value.lower() == "true" if key in bool_keys else value.lower()
206
219
 
207
220
  parts = key.split(".")
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "agentnode-sdk"
7
- version = "0.12.0"
7
+ version = "0.12.1"
8
8
  description = "Python SDK for AgentNode — the open upgrade and discovery infrastructure for AI agents."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -244,3 +244,102 @@ def test_config_path_env_dir_override(tmp_path, monkeypatch):
244
244
  custom_dir = tmp_path / "custom_dir"
245
245
  monkeypatch.setenv("AGENTNODE_CONFIG", str(custom_dir))
246
246
  assert config_path() == custom_dir / "config.json"
247
+
248
+
249
+ # --- agent_sandbox section (0.12.1 hotfix: _merge_defaults must not strip it) ---
250
+
251
+
252
+ class TestAgentSandboxConfigSection:
253
+ """Regression tests for the shipped 0.12.0 bug: a hand-written
254
+ agent_sandbox section was silently stripped by _merge_defaults, so the
255
+ documented config path (agent_sandbox.enabled) and the C2 host LLM
256
+ ceiling (agent_sandbox.llm) never reached their consumers."""
257
+
258
+ def test_defaults_include_agent_sandbox_disabled(self):
259
+ cfg = default_config()
260
+ assert cfg["agent_sandbox"]["enabled"] is False
261
+
262
+ def test_handwritten_section_survives_load(self, isolated_config):
263
+ isolated_config.parent.mkdir(parents=True, exist_ok=True)
264
+ isolated_config.write_text(
265
+ json.dumps({"agent_sandbox": {"enabled": True}}), encoding="utf-8")
266
+ loaded = load_config()
267
+ assert loaded["agent_sandbox"]["enabled"] is True
268
+
269
+ def test_nested_llm_ceiling_survives_load(self, isolated_config):
270
+ llm = {"enabled": True, "max_calls": 3, "max_input_chars": 1000,
271
+ "allowed_models": ["gpt-4o-mini"]}
272
+ isolated_config.parent.mkdir(parents=True, exist_ok=True)
273
+ isolated_config.write_text(
274
+ json.dumps({"agent_sandbox": {"enabled": True, "llm": llm}}),
275
+ encoding="utf-8")
276
+ loaded = load_config()
277
+ assert loaded["agent_sandbox"]["llm"] == llm
278
+
279
+ def test_save_load_roundtrip_preserves_section(self, isolated_config):
280
+ cfg = default_config()
281
+ cfg["agent_sandbox"] = {"enabled": True, "llm": {"max_calls": 5}}
282
+ save_config(cfg)
283
+ loaded = load_config()
284
+ assert loaded["agent_sandbox"]["enabled"] is True
285
+ assert loaded["agent_sandbox"]["llm"] == {"max_calls": 5}
286
+
287
+ def test_set_value_true_stores_real_bool(self):
288
+ cfg = default_config()
289
+ set_value(cfg, "agent_sandbox.enabled", "true")
290
+ assert cfg["agent_sandbox"]["enabled"] is True
291
+
292
+ def test_set_value_false_stores_real_bool_not_truthy_string(self):
293
+ # without the bool_keys entry this stored the string "false",
294
+ # which bool() would read as ENABLED
295
+ cfg = default_config()
296
+ set_value(cfg, "agent_sandbox.enabled", "false")
297
+ assert cfg["agent_sandbox"]["enabled"] is False
298
+ assert cfg["agent_sandbox"]["enabled"] is not True
299
+ assert not isinstance(cfg["agent_sandbox"]["enabled"], str)
300
+
301
+ def test_set_value_rejects_garbage(self):
302
+ cfg = default_config()
303
+ with pytest.raises(ValueError):
304
+ set_value(cfg, "agent_sandbox.enabled", "maybe")
305
+
306
+ def test_flag_enabled_via_config_file_alone(self, isolated_config, monkeypatch):
307
+ # the REAL integration: file on disk -> load_config -> flag reader
308
+ # (the old routing tests mocked load_config, which hid this bug)
309
+ from agentnode_sdk.runtimes.agent_sandbox import _agent_sandbox_enabled
310
+ monkeypatch.delenv("AGENTNODE_AGENT_SANDBOX", raising=False)
311
+ isolated_config.parent.mkdir(parents=True, exist_ok=True)
312
+ isolated_config.write_text(
313
+ json.dumps({"agent_sandbox": {"enabled": True}}), encoding="utf-8")
314
+ assert _agent_sandbox_enabled() is True
315
+
316
+ def test_flag_disabled_via_config_file_false(self, isolated_config, monkeypatch):
317
+ from agentnode_sdk.runtimes.agent_sandbox import _agent_sandbox_enabled
318
+ monkeypatch.delenv("AGENTNODE_AGENT_SANDBOX", raising=False)
319
+ isolated_config.parent.mkdir(parents=True, exist_ok=True)
320
+ isolated_config.write_text(
321
+ json.dumps({"agent_sandbox": {"enabled": False}}), encoding="utf-8")
322
+ assert _agent_sandbox_enabled() is False
323
+
324
+ def test_llm_ceiling_reaches_policy_resolution(self, isolated_config):
325
+ # file on disk -> load_config -> resolve_llm_policy: the host ceiling
326
+ # must clamp a greedy manifest (dead config before this fix)
327
+ from agentnode_sdk.runtimes.agent_llm_policy import resolve_llm_policy
328
+ isolated_config.parent.mkdir(parents=True, exist_ok=True)
329
+ isolated_config.write_text(
330
+ json.dumps({"agent_sandbox": {"llm": {"max_calls": 2}}}),
331
+ encoding="utf-8")
332
+ host_cfg = load_config()
333
+ pol = resolve_llm_policy(
334
+ {"llm_access": {"enabled": True, "max_calls": 999}}, host_cfg)
335
+ assert pol.max_calls == 2
336
+
337
+ def test_other_sections_unchanged(self, isolated_config):
338
+ isolated_config.parent.mkdir(parents=True, exist_ok=True)
339
+ isolated_config.write_text(
340
+ json.dumps({"guard": {"delete": "deny"},
341
+ "agent_sandbox": {"enabled": True}}), encoding="utf-8")
342
+ loaded = load_config()
343
+ assert loaded["guard"]["delete"] == "deny"
344
+ assert loaded["guard"]["read"] == "allow" # defaults intact
345
+ assert loaded["trust"]["minimum_trust_level"] == "verified"
File without changes