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