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.
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/CHANGELOG.md +22 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/PKG-INFO +1 -1
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/__init__.py +1 -1
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/config.py +14 -1
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/pyproject.toml +1 -1
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_config.py +99 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/.env.example +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/.gitignore +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/README.md +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/REGISTRY_SIGNING_ACTIVATION.md +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/REGISTRY_SIGNING_SPEC.md +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/THREAT_MODEL.md +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/TRUST_STACK.md +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode.lock +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/_fileutil.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/async_client.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/capability_graph.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/capability_taxonomy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/__init__.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/__main__.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/audit.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/auth.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/cassette_audit.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/commands.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/complements.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/init.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/main.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_commands.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_status.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_submit.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/mcp_verify.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/output.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/publish.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/record_cases.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/sandbox_commands.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/serve.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/setup_wizard.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/smart_run.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/templates.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/validate.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/cli/verify_local.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/client.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/compatibility.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/credential_handle.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/credential_resolver.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/credential_store.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/detect.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/exceptions.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/guard.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/input_guard.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/installer.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/key_status.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/lock_integrity.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/mcp_server.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/models.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/planner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/policy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/references.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/registry_trust.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/resolve.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/resource_provider.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/risk_profile.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/run_log.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtime.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/__init__.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_llm_broker.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_llm_policy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/agent_sandbox.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/mcp_runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/python_runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/runtimes/remote_runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/__init__.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/agent_container_wrapper.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/agent_rpc.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/agent_session.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/backend.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/container_backend.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/policy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/types.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/signature.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/signing_key.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/skill.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/sandbox-image/Dockerfile +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/sandbox-image/README.md +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/analyze_scores.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/batch_verify.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/ci_smoke_test.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/generate_compatibility_artifacts.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/verify_toolcalls.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/scripts/weekly_retest.sh +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/README.md +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/__init__.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/container_agent_wrapper.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/fake_llm.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/host_driver.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/spikes/agent_sandbox_routing/trivial_agent.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/__init__.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/conftest.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_llm_broker.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_llm_policy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_rpc.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_sandbox_e2e.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_sandbox_routing.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_sandbox_spike.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_agent_session_container.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_async_client.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_audit_ux.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_auto_upgrade_policy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_cli.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_cli_lock.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_cli_run_resolution.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_client.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_client_json_guard.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_client_sprint_b.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_handle.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_integration.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_resolver.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_credential_store.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_detect.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_detect_and_install.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_e2e_runtime.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_edge_cases.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_check.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_config_cache.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_policy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_preview.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_schema.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_set.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_status.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_tool_override.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_tool_override_audit.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_tool_override_cli.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_guard_ux.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_input_guard.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_input_guard_escalation.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_install_hardening.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_installer_sprint_b.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_intelligence.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_key_status.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_llm_binding.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_llm_call_runlog.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_lock_integrity.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_lock_runtime.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_audit.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_doctor.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_sandbox.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_mcp_server.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_observability.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_planner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_policy.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_policy_integration.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_prompt_specs.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_provider_matrix.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_publish.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_references.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_registry_trust.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_remote_hardening.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_remote_runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_resource_provider.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_resource_specs.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_risk_profile.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_run_log.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_runner.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_runtime.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_runtime_audit.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_backend.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_doctor.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_e2e.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_sandbox_gate.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_security_hardening.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_signature.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_signing_key.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_skill.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_smart.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_stability.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_toolpack_sandbox.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_v02.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_validate.py +0 -0
- {agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/tests/test_validate_skill.py +0 -0
- {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.
|
|
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
|
|
@@ -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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentnode_sdk-0.12.0 → agentnode_sdk-0.12.1}/agentnode_sdk/sandbox/agent_container_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|