opensandbox 0.1.17.dev0__tar.gz → 1.1.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.
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/.gitignore +8 -4
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/PKG-INFO +116 -4
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/README.md +112 -2
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/pyproject.toml +8 -5
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/__init__.py +1 -1
- opensandbox-1.1.1/src/opensandbox/_async_pool_reconciler.py +135 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/_async_pool_store.py +1 -1
- opensandbox-1.1.1/src/opensandbox/_httpx.py +162 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/_pool_reconciler.py +19 -107
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/_pool_store.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/command_adapter.py +58 -96
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/__init__.py +1 -1
- opensandbox-1.1.1/src/opensandbox/adapters/converter/command_execution.py +84 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/command_model_converter.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/diagnostic_model_converter.py +1 -1
- opensandbox-1.1.1/src/opensandbox/adapters/converter/env_entry.py +95 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/event_node.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/exception_converter.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/execution_converter.py +16 -4
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/execution_event_dispatcher.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/filesystem_model_converter.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/metrics_model_converter.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/response_handler.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/sandbox_model_converter.py +102 -42
- opensandbox-1.1.1/src/opensandbox/adapters/converter/template_model_converter.py +206 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/diagnostics_adapter.py +7 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/egress_adapter.py +6 -6
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/endpoint_cache.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/factory.py +11 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/filesystem_adapter.py +27 -14
- opensandbox-1.1.1/src/opensandbox/adapters/filesystem_identity.py +26 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/health_adapter.py +9 -9
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/isolated_adapter.py +6 -6
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/isolated_filesystem_adapter.py +15 -9
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/metrics_adapter.py +7 -8
- opensandbox-1.1.1/src/opensandbox/adapters/network_policy_adapter.py +219 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/sandboxes_adapter.py +192 -10
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/sse.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/__init__.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/execd → opensandbox-1.1.1/src/opensandbox/api/diagnostic}/api/__init__.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/egress/api/credential_vault → opensandbox-1.1.1/src/opensandbox/api/diagnostic/api/diagnostics}/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/api/diagnostics/get_sandboxes_sandbox_id_diagnostics_events.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/api/diagnostics/get_sandboxes_sandbox_id_diagnostics_logs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/client.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/errors.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/diagnostic_content_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/diagnostic_content_response_delivery.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/diagnostic_content_response_kind.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/error_response.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/execd → opensandbox-1.1.1/src/opensandbox/api/diagnostic}/types.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/__init__.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/egress/api/policy → opensandbox-1.1.1/src/opensandbox/api/egress/api/credential_vault}/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/delete_credential_vault.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault_bindings.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault_bindings_binding_name.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault_credentials.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault_credentials_credential_name.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/patch_credential_vault.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/post_credential_vault.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/code_interpreting → opensandbox-1.1.1/src/opensandbox/api/egress/api/policy}/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/policy/delete_policy.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/policy/get_policy.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/policy/patch_policy.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/egress}/client.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/errors.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/api_key_credential_auth.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/api_key_credential_auth_type.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/basic_credential_auth.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/basic_credential_auth_type.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/bearer_credential_auth.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/bearer_credential_auth_type.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_auth_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding_list_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding_mutation_set.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_list_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_match.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_match_schemes_item.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_mutation_set.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_substitution.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_substitution_in_item.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_vault_create_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_vault_mutation_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_vault_state.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/custom_header_entry.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/custom_headers_credential_auth.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/custom_headers_credential_auth_type.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/inline_credential_source.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/inline_credential_source_type.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/egress}/models/network_policy.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/network_policy_default_action.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/network_rule.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/egress}/models/network_rule_action.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/passthrough_credential_auth.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/passthrough_credential_auth_type.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/policy_status_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/types.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/__init__.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/diagnostic → opensandbox-1.1.1/src/opensandbox/api/execd}/api/__init__.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/diagnostic/api/diagnostics → opensandbox-1.1.1/src/opensandbox/api/execd/api/code_interpreting}/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/create_code_context.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/delete_context.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/delete_contexts_by_language.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/get_context.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/interrupt_code.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/list_contexts.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/run_code.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/execd/api/command/__init__.py +17 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/create_session.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/delete_session.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/get_background_command_logs.py +9 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/get_command_status.py +9 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/interrupt_command.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/run_command.py +33 -13
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/run_in_session.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/execd/api/filesystem/__init__.py +17 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/chmod_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/download_file.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/get_files_info.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/list_directory.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/make_dirs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/remove_dirs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/remove_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/rename_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/replace_content.py +3 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/search_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/upload_file.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/execd/api/health/__init__.py +17 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/health/ping.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/execd/api/isolated_execution/__init__.py +17 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/create_isolated_session.py +17 -5
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/delete_isolated_session.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/get_isolated_run_logs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/get_isolated_run_status.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/get_isolated_session.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_capabilities.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_chmod_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_download_file.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_get_files_info.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_list_directory.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_make_dirs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_remove_dirs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_remove_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_rename_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_replace_content.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_search_files.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_session_commit.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_session_diff.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_upload_file.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/list_isolated_sessions.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/run_in_isolated_session.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/execd/api/metric/__init__.py +17 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/metric/get_metrics.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/metric/watch_metrics.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/egress → opensandbox-1.1.1/src/opensandbox/api/execd}/client.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/errors.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/__init__.py +17 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/bind_mount.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/capabilities_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/capabilities_response_hardening.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/capabilities_response_hardening_init_mode.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/chmod_files_body.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/code_context.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/code_context_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/command_status_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_isolated_session_request.py +64 -29
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_isolated_session_request_profile.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_isolated_session_request_uid_mode.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_session_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_session_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/env_passthrough_spec.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/env_passthrough_spec_mode.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/error_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/file_info.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/file_info_type.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/file_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/get_files_info_response_200.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/hardening_layer_state.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/hardening_layer_state_state.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_chmod_files_body.py +75 -0
- opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_get_files_info_response_200.py +75 -0
- opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_make_dirs_body.py +75 -0
- opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_replace_content_body.py +75 -0
- opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_replace_content_response_200.py +75 -0
- opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_upload_file_body.py +110 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_background_run_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_chmod_files_body.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_create_session_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_get_files_info_response_200.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_make_dirs_body.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/execd/models/isolated_overlay_spec.py +117 -0
- opensandbox-1.1.1/src/opensandbox/api/execd/models/isolated_overlay_spec_mode.py +26 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_replace_content_body.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_replace_content_response_200.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_run_request.py +6 -5
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_run_request_envs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_run_status.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_session_summary.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_session_summary_status.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_upload_file_body.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_workspace_spec.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_workspace_spec_mode.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/list_isolated_sessions_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/make_dirs_body.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/metrics.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/permission.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/rename_file_item.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_content_body.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_content_response_200.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_file_content_item.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_file_content_result.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_code_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_command_request.py +30 -14
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_command_request_envs.py +5 -4
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_in_session_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event_error.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event_results.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event_type.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state.py +29 -4
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state_profile.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state_status.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state_uid_mode.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/upload_file_body.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/execd}/types.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/__init__.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/metrics/__init__.py +17 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/metrics/report_metrics_event.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/__init__.py +17 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/delete_sandbox_network_policy_rules.py +247 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/delete_sandboxes_sandbox_id.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/get_sandbox_network_policy.py +220 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/get_sandboxes.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/get_sandboxes_sandbox_id.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/get_sandboxes_sandbox_id_endpoints_port.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/patch_sandbox_network_policy.py +267 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/patch_sandboxes_sandbox_id_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes.py +58 -25
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes_sandbox_id_pause.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes_sandbox_id_renew_expiration.py +17 -5
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes_sandbox_id_resume.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/replace_sandbox_network_policy.py +256 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/snapshots/__init__.py +17 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/delete_snapshots_snapshot_id.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/get_snapshots.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/get_snapshots_snapshot_id.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/post_sandboxes_sandbox_id_snapshots.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/__init__.py +17 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/create_template.py +274 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/delete_template.py +196 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/get_template.py +202 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/list_templates.py +232 -0
- {opensandbox-0.1.17.dev0/src/opensandbox/api/execd → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/client.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/errors.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/__init__.py +27 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/allocation_summary.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/allocation_summary_mode.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/allocation_summary_state.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request.py +195 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request_env.py +72 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request_format.py +25 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request_metadata.py +62 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request.py +26 -3
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request_env.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request_extensions.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_response_extensions.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_response_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_snapshot_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/credential_proxy_config.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/endpoint.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/endpoint_headers.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/error_response.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template.py +210 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_env.py +62 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_format.py +25 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_metadata.py +62 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_readiness.py +69 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_status.py +81 -0
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_status_phase.py +27 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/host.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/image_spec.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/image_spec_auth.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/lifecycle_hook.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/list_fsb_templates_response.py +83 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/list_sandboxes_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/list_snapshots_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/metrics_event.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/metrics_event_event_type.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/egress → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/models/network_policy.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/network_policy_default_action.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/network_rule.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/egress → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/models/network_rule_action.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/ossfs.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/ossfs_version.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/pagination_info.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/patch_sandbox_metadata_request.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/periodic_lifecycle_hook.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/platform_spec.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/platform_spec_arch.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/platform_spec_os.py +1 -1
- opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/policy_status_response.py +111 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/pvc.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/renew_sandbox_expiration_request.py +3 -2
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/renew_sandbox_expiration_response.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/resource_limits.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_extensions.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_lifecycle.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_metadata.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_status.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/snapshot.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/snapshot_status.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/volume.py +1 -1
- {opensandbox-0.1.17.dev0/src/opensandbox/api/diagnostic → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/types.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/async_redis_pool_store.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/client_ip.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/connection.py +68 -20
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/connection_sync.py +76 -27
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/constants.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/exceptions/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/exceptions/sandbox.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/internal/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/internal/lifecycle_metrics.py +21 -5
- opensandbox-1.1.1/src/opensandbox/internal/pool_tracing.py +203 -0
- opensandbox-1.1.1/src/opensandbox/internal/readiness.py +221 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/manager.py +28 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/__init__.py +3 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/diagnostics.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/execd.py +25 -9
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/execd_sync.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/filesystem.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/isolated.py +53 -8
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/sandboxes.py +69 -2
- opensandbox-1.1.1/src/opensandbox/models/templates.py +255 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_async.py +553 -215
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_manager.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_redis.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_types.py +32 -27
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/redis_pool_store.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sandbox.py +297 -98
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/command.py +27 -4
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/diagnostics.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/egress.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/filesystem.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/health.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/isolated.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/metrics.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/sandbox.py +81 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/command_adapter.py +58 -93
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/converter/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/converter/execution_event_dispatcher.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/diagnostics_adapter.py +7 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/egress_adapter.py +6 -6
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/factory.py +6 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/filesystem_adapter.py +32 -11
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/health_adapter.py +19 -7
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/isolated_adapter.py +5 -6
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/isolated_filesystem_adapter.py +15 -9
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/metrics_adapter.py +9 -7
- opensandbox-1.1.1/src/opensandbox/sync/adapters/network_policy_adapter.py +212 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/sandboxes_adapter.py +149 -16
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/manager.py +23 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/pool.py +809 -103
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/sandbox.py +288 -83
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/command.py +27 -4
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/diagnostics.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/egress.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/filesystem.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/health.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/isolated.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/metrics.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/sandbox.py +40 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/__init__.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_async_retry.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_classify.py +1 -1
- opensandbox-1.1.1/src/opensandbox/transport/_deadline_sync.py +163 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_decision.py +1 -1
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_sync_retry.py +9 -14
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/retry.py +1 -1
- opensandbox-0.1.17.dev0/src/opensandbox/_async_pool_reconciler.py +0 -270
- opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/command/__init__.py +0 -17
- opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/filesystem/__init__.py +0 -17
- opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/health/__init__.py +0 -17
- opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/isolated_execution/__init__.py +0 -17
- opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/metric/__init__.py +0 -17
- opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle/api/metrics/__init__.py +0 -17
- opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle/api/sandboxes/__init__.py +0 -17
- opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle/api/snapshots/__init__.py +0 -17
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/LICENSE +0 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/py.typed +0 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/py.typed +0 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/py.typed +0 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/py.typed +0 -0
- {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/py.typed +0 -0
|
@@ -269,12 +269,12 @@ nbdist/
|
|
|
269
269
|
generated/
|
|
270
270
|
**/generated/**
|
|
271
271
|
|
|
272
|
-
#
|
|
272
|
+
# Fast Sandbox FastPath gRPC stubs are committed intentionally (deterministic protoc
|
|
273
273
|
# output; the server package needs them at install time, so they are checked
|
|
274
274
|
# in rather than regenerated).
|
|
275
|
-
!server/opensandbox_server/services/
|
|
276
|
-
!server/opensandbox_server/services/
|
|
277
|
-
server/opensandbox_server/services/
|
|
275
|
+
!server/opensandbox_server/services/fast_sandbox/generated/
|
|
276
|
+
!server/opensandbox_server/services/fast_sandbox/generated/**
|
|
277
|
+
server/opensandbox_server/services/fast_sandbox/generated/__pycache__/
|
|
278
278
|
|
|
279
279
|
# execd eBPF kernel BTF dumps (bpf2go build-time only, never committed —
|
|
280
280
|
# see components/execd/pkg/ebpf/prog/audit.bpf.c; regenerate with:
|
|
@@ -290,3 +290,7 @@ obj/
|
|
|
290
290
|
|
|
291
291
|
.qoder/
|
|
292
292
|
/.vs
|
|
293
|
+
|
|
294
|
+
# fast-sandbox pinned source checkout (materialized by
|
|
295
|
+
# manifests/release/build-fast-sandbox.sh from manifests/third-party/fast-sandbox.commit)
|
|
296
|
+
.fast-sandbox/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: opensandbox
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: OpenSandbox Python SDK - Secure, isolated execution environments
|
|
5
5
|
Project-URL: Homepage, https://open-sandbox.ai
|
|
6
6
|
Project-URL: Repository, https://github.com/opensandbox-group/OpenSandbox
|
|
@@ -224,12 +224,14 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
224
224
|
Classifier: Typing :: Typed
|
|
225
225
|
Requires-Python: >=3.10
|
|
226
226
|
Requires-Dist: attrs>=21.3.0
|
|
227
|
+
Requires-Dist: httpcore<2.0,>=1.0.0
|
|
227
228
|
Requires-Dist: httpx-sse<0.5,>=0.4.3
|
|
228
229
|
Requires-Dist: httpx<1.0,>=0.27.0
|
|
230
|
+
Requires-Dist: opentelemetry-api<2.0,>=1.20
|
|
229
231
|
Requires-Dist: pydantic<3.0,>=2.4.2
|
|
230
232
|
Requires-Dist: python-dateutil<3.0,>=2.8.2
|
|
231
233
|
Provides-Extra: pool-redis
|
|
232
|
-
Requires-Dist: pyjwt>=2.
|
|
234
|
+
Requires-Dist: pyjwt>=2.14.0; extra == 'pool-redis'
|
|
233
235
|
Requires-Dist: redis<6.0,>=5.0; extra == 'pool-redis'
|
|
234
236
|
Description-Content-Type: text/markdown
|
|
235
237
|
|
|
@@ -354,7 +356,8 @@ pool = SandboxPoolSync(
|
|
|
354
356
|
state_store=InMemoryPoolStateStore(), # single-process only
|
|
355
357
|
connection_config=ConnectionConfigSync(domain="api.opensandbox.io"),
|
|
356
358
|
creation_spec=PoolCreationSpec(image="ubuntu:22.04"),
|
|
357
|
-
|
|
359
|
+
warmup_create_qps=10,
|
|
360
|
+
warmup_concurrency=128,
|
|
358
361
|
)
|
|
359
362
|
|
|
360
363
|
pool.start()
|
|
@@ -598,7 +601,94 @@ for f in files:
|
|
|
598
601
|
await sandbox.files.delete_files(["/tmp/hello.txt"])
|
|
599
602
|
```
|
|
600
603
|
|
|
601
|
-
### 5.
|
|
604
|
+
### 5. Snapshots
|
|
605
|
+
|
|
606
|
+
Capture a sandbox's state and restore new sandboxes from it. Snapshots are
|
|
607
|
+
administered through `SandboxManager`:
|
|
608
|
+
|
|
609
|
+
```python
|
|
610
|
+
from opensandbox.manager import SandboxManager
|
|
611
|
+
from opensandbox.models.sandboxes import SnapshotFilter
|
|
612
|
+
|
|
613
|
+
async with await SandboxManager.create(connection_config=config) as manager:
|
|
614
|
+
# Create a snapshot from a running sandbox, then wait until it is Ready
|
|
615
|
+
snapshot = await manager.create_snapshot(sandbox_id, name="pre-migration")
|
|
616
|
+
|
|
617
|
+
info = await manager.get_snapshot(snapshot.id)
|
|
618
|
+
while info.status.state == "Creating":
|
|
619
|
+
await asyncio.sleep(2)
|
|
620
|
+
info = await manager.get_snapshot(snapshot.id)
|
|
621
|
+
if info.status.state != "Ready":
|
|
622
|
+
raise RuntimeError(
|
|
623
|
+
f"snapshot not Ready: state={info.status.state} reason={info.status.reason}"
|
|
624
|
+
)
|
|
625
|
+
|
|
626
|
+
# List all snapshots
|
|
627
|
+
page = await manager.list_snapshots(SnapshotFilter())
|
|
628
|
+
|
|
629
|
+
# Restore: create a new sandbox FROM a snapshot (image and snapshot_id are
|
|
630
|
+
# mutually exclusive — set exactly one)
|
|
631
|
+
restored = await Sandbox.create(
|
|
632
|
+
snapshot_id=snapshot.id,
|
|
633
|
+
connection_config=config,
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
# Only delete the snapshot after the restore has succeeded
|
|
637
|
+
async with await SandboxManager.create(connection_config=config) as manager:
|
|
638
|
+
await manager.delete_snapshot(snapshot.id)
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
A `Sandbox` can also snapshot itself directly:
|
|
642
|
+
`await sandbox.create_snapshot(name="checkpoint-1")`.
|
|
643
|
+
|
|
644
|
+
### 6. Isolated Sessions
|
|
645
|
+
|
|
646
|
+
Isolated sessions run multi-step code in a hardened, resource-bounded
|
|
647
|
+
namespace with bind mounts — reachable through `sandbox.isolation`:
|
|
648
|
+
|
|
649
|
+
```python
|
|
650
|
+
from opensandbox.models.isolated import (
|
|
651
|
+
CreateIsolatedSessionRequest,
|
|
652
|
+
IsolatedRunOpts,
|
|
653
|
+
IsolatedWorkspaceSpec,
|
|
654
|
+
BindMount,
|
|
655
|
+
)
|
|
656
|
+
|
|
657
|
+
session = await sandbox.isolation.create(
|
|
658
|
+
CreateIsolatedSessionRequest(
|
|
659
|
+
workspace=IsolatedWorkspaceSpec(path="/workspace", mode="rw"),
|
|
660
|
+
profile="strict",
|
|
661
|
+
# Optional bind mounts (source on host, dest inside the session)
|
|
662
|
+
binds=[BindMount(source="/data", dest="/data", readonly=True)],
|
|
663
|
+
# Auto-destroy after 10 idle minutes; omitting this leaves the
|
|
664
|
+
# session alive with no idle GC
|
|
665
|
+
idle_timeout_seconds=600,
|
|
666
|
+
)
|
|
667
|
+
)
|
|
668
|
+
try:
|
|
669
|
+
# Foreground run — timeout_seconds applies here only; background
|
|
670
|
+
# runs are deliberately not time-limited
|
|
671
|
+
run = await session.run(
|
|
672
|
+
"python -c 'print(1+1)'",
|
|
673
|
+
opts=IsolatedRunOpts(timeout_seconds=30),
|
|
674
|
+
)
|
|
675
|
+
print(run.logs.stdout[0].text)
|
|
676
|
+
|
|
677
|
+
# Background runs: start, poll until finished, then fetch logs
|
|
678
|
+
bg = await session.run_background("make build")
|
|
679
|
+
status = await session.run_status(bg.run_id)
|
|
680
|
+
while status.running:
|
|
681
|
+
await asyncio.sleep(2)
|
|
682
|
+
status = await session.run_status(bg.run_id)
|
|
683
|
+
logs = await session.run_logs(bg.run_id)
|
|
684
|
+
finally:
|
|
685
|
+
# Runs even if a foreground run, polling, or log fetch raises —
|
|
686
|
+
# without this the session leaks (idle GC only fires if
|
|
687
|
+
# idle_timeout_seconds was set)
|
|
688
|
+
await session.delete()
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
### 7. Sandbox Management (Admin)
|
|
602
692
|
|
|
603
693
|
Use `SandboxManager` for administrative tasks and finding existing sandboxes.
|
|
604
694
|
|
|
@@ -637,9 +727,31 @@ The `ConnectionConfig` class manages API server connection settings.
|
|
|
637
727
|
| `request_timeout` | Timeout for API requests | 30 seconds | - |
|
|
638
728
|
| `debug` | Enable debug logging for HTTP requests | `False` | - |
|
|
639
729
|
| `headers` | Custom HTTP headers | Empty | - |
|
|
730
|
+
| `follow_redirects` | Follow HTTP redirects for SDK requests | `False` | - |
|
|
731
|
+
| `event_hooks` | Additional httpx hooks for adapter clients | Empty | - |
|
|
640
732
|
| `transport` | Shared httpx transport (pool/proxy/retry) | SDK-created per instance | - |
|
|
641
733
|
| `use_server_proxy` | Use sandbox server as proxy for execd/endpoint requests (e.g. when client cannot reach the sandbox directly) | `False` | - |
|
|
642
734
|
|
|
735
|
+
When `follow_redirects` is enabled, same-origin redirects preserve request
|
|
736
|
+
headers. An origin is the combination of scheme, host, and port, so changing
|
|
737
|
+
any of those values is cross-origin. Before following a cross-origin redirect,
|
|
738
|
+
the SDK removes every header whose name starts with `OPEN-SANDBOX-` or
|
|
739
|
+
`OPENSANDBOX-` (case-insensitive). Other custom headers are not stripped
|
|
740
|
+
automatically.
|
|
741
|
+
|
|
742
|
+
File uploads never follow redirects, even when `follow_redirects` is enabled,
|
|
743
|
+
because streamed or file-backed multipart request bodies cannot always be
|
|
744
|
+
safely replayed. This applies to both direct chunked uploads and uploads through
|
|
745
|
+
the server proxy. A redirect response from an upload is surfaced as a
|
|
746
|
+
`SandboxApiException` with the original 3xx status.
|
|
747
|
+
|
|
748
|
+
`ConnectionConfig.event_hooks` accepts async httpx hooks, while
|
|
749
|
+
`ConnectionConfigSync.event_hooks` accepts synchronous hooks. Configured
|
|
750
|
+
request hooks run before the SDK safety hook, so they cannot re-add protected
|
|
751
|
+
OpenSandbox headers to a cross-origin request. Lifecycle telemetry honors
|
|
752
|
+
`follow_redirects` and the SDK safety hook, but does not invoke configured user
|
|
753
|
+
hooks.
|
|
754
|
+
|
|
643
755
|
```python
|
|
644
756
|
from datetime import timedelta
|
|
645
757
|
|
|
@@ -119,7 +119,8 @@ pool = SandboxPoolSync(
|
|
|
119
119
|
state_store=InMemoryPoolStateStore(), # single-process only
|
|
120
120
|
connection_config=ConnectionConfigSync(domain="api.opensandbox.io"),
|
|
121
121
|
creation_spec=PoolCreationSpec(image="ubuntu:22.04"),
|
|
122
|
-
|
|
122
|
+
warmup_create_qps=10,
|
|
123
|
+
warmup_concurrency=128,
|
|
123
124
|
)
|
|
124
125
|
|
|
125
126
|
pool.start()
|
|
@@ -363,7 +364,94 @@ for f in files:
|
|
|
363
364
|
await sandbox.files.delete_files(["/tmp/hello.txt"])
|
|
364
365
|
```
|
|
365
366
|
|
|
366
|
-
### 5.
|
|
367
|
+
### 5. Snapshots
|
|
368
|
+
|
|
369
|
+
Capture a sandbox's state and restore new sandboxes from it. Snapshots are
|
|
370
|
+
administered through `SandboxManager`:
|
|
371
|
+
|
|
372
|
+
```python
|
|
373
|
+
from opensandbox.manager import SandboxManager
|
|
374
|
+
from opensandbox.models.sandboxes import SnapshotFilter
|
|
375
|
+
|
|
376
|
+
async with await SandboxManager.create(connection_config=config) as manager:
|
|
377
|
+
# Create a snapshot from a running sandbox, then wait until it is Ready
|
|
378
|
+
snapshot = await manager.create_snapshot(sandbox_id, name="pre-migration")
|
|
379
|
+
|
|
380
|
+
info = await manager.get_snapshot(snapshot.id)
|
|
381
|
+
while info.status.state == "Creating":
|
|
382
|
+
await asyncio.sleep(2)
|
|
383
|
+
info = await manager.get_snapshot(snapshot.id)
|
|
384
|
+
if info.status.state != "Ready":
|
|
385
|
+
raise RuntimeError(
|
|
386
|
+
f"snapshot not Ready: state={info.status.state} reason={info.status.reason}"
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
# List all snapshots
|
|
390
|
+
page = await manager.list_snapshots(SnapshotFilter())
|
|
391
|
+
|
|
392
|
+
# Restore: create a new sandbox FROM a snapshot (image and snapshot_id are
|
|
393
|
+
# mutually exclusive — set exactly one)
|
|
394
|
+
restored = await Sandbox.create(
|
|
395
|
+
snapshot_id=snapshot.id,
|
|
396
|
+
connection_config=config,
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
# Only delete the snapshot after the restore has succeeded
|
|
400
|
+
async with await SandboxManager.create(connection_config=config) as manager:
|
|
401
|
+
await manager.delete_snapshot(snapshot.id)
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
A `Sandbox` can also snapshot itself directly:
|
|
405
|
+
`await sandbox.create_snapshot(name="checkpoint-1")`.
|
|
406
|
+
|
|
407
|
+
### 6. Isolated Sessions
|
|
408
|
+
|
|
409
|
+
Isolated sessions run multi-step code in a hardened, resource-bounded
|
|
410
|
+
namespace with bind mounts — reachable through `sandbox.isolation`:
|
|
411
|
+
|
|
412
|
+
```python
|
|
413
|
+
from opensandbox.models.isolated import (
|
|
414
|
+
CreateIsolatedSessionRequest,
|
|
415
|
+
IsolatedRunOpts,
|
|
416
|
+
IsolatedWorkspaceSpec,
|
|
417
|
+
BindMount,
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
session = await sandbox.isolation.create(
|
|
421
|
+
CreateIsolatedSessionRequest(
|
|
422
|
+
workspace=IsolatedWorkspaceSpec(path="/workspace", mode="rw"),
|
|
423
|
+
profile="strict",
|
|
424
|
+
# Optional bind mounts (source on host, dest inside the session)
|
|
425
|
+
binds=[BindMount(source="/data", dest="/data", readonly=True)],
|
|
426
|
+
# Auto-destroy after 10 idle minutes; omitting this leaves the
|
|
427
|
+
# session alive with no idle GC
|
|
428
|
+
idle_timeout_seconds=600,
|
|
429
|
+
)
|
|
430
|
+
)
|
|
431
|
+
try:
|
|
432
|
+
# Foreground run — timeout_seconds applies here only; background
|
|
433
|
+
# runs are deliberately not time-limited
|
|
434
|
+
run = await session.run(
|
|
435
|
+
"python -c 'print(1+1)'",
|
|
436
|
+
opts=IsolatedRunOpts(timeout_seconds=30),
|
|
437
|
+
)
|
|
438
|
+
print(run.logs.stdout[0].text)
|
|
439
|
+
|
|
440
|
+
# Background runs: start, poll until finished, then fetch logs
|
|
441
|
+
bg = await session.run_background("make build")
|
|
442
|
+
status = await session.run_status(bg.run_id)
|
|
443
|
+
while status.running:
|
|
444
|
+
await asyncio.sleep(2)
|
|
445
|
+
status = await session.run_status(bg.run_id)
|
|
446
|
+
logs = await session.run_logs(bg.run_id)
|
|
447
|
+
finally:
|
|
448
|
+
# Runs even if a foreground run, polling, or log fetch raises —
|
|
449
|
+
# without this the session leaks (idle GC only fires if
|
|
450
|
+
# idle_timeout_seconds was set)
|
|
451
|
+
await session.delete()
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### 7. Sandbox Management (Admin)
|
|
367
455
|
|
|
368
456
|
Use `SandboxManager` for administrative tasks and finding existing sandboxes.
|
|
369
457
|
|
|
@@ -402,9 +490,31 @@ The `ConnectionConfig` class manages API server connection settings.
|
|
|
402
490
|
| `request_timeout` | Timeout for API requests | 30 seconds | - |
|
|
403
491
|
| `debug` | Enable debug logging for HTTP requests | `False` | - |
|
|
404
492
|
| `headers` | Custom HTTP headers | Empty | - |
|
|
493
|
+
| `follow_redirects` | Follow HTTP redirects for SDK requests | `False` | - |
|
|
494
|
+
| `event_hooks` | Additional httpx hooks for adapter clients | Empty | - |
|
|
405
495
|
| `transport` | Shared httpx transport (pool/proxy/retry) | SDK-created per instance | - |
|
|
406
496
|
| `use_server_proxy` | Use sandbox server as proxy for execd/endpoint requests (e.g. when client cannot reach the sandbox directly) | `False` | - |
|
|
407
497
|
|
|
498
|
+
When `follow_redirects` is enabled, same-origin redirects preserve request
|
|
499
|
+
headers. An origin is the combination of scheme, host, and port, so changing
|
|
500
|
+
any of those values is cross-origin. Before following a cross-origin redirect,
|
|
501
|
+
the SDK removes every header whose name starts with `OPEN-SANDBOX-` or
|
|
502
|
+
`OPENSANDBOX-` (case-insensitive). Other custom headers are not stripped
|
|
503
|
+
automatically.
|
|
504
|
+
|
|
505
|
+
File uploads never follow redirects, even when `follow_redirects` is enabled,
|
|
506
|
+
because streamed or file-backed multipart request bodies cannot always be
|
|
507
|
+
safely replayed. This applies to both direct chunked uploads and uploads through
|
|
508
|
+
the server proxy. A redirect response from an upload is surfaced as a
|
|
509
|
+
`SandboxApiException` with the original 3xx status.
|
|
510
|
+
|
|
511
|
+
`ConnectionConfig.event_hooks` accepts async httpx hooks, while
|
|
512
|
+
`ConnectionConfigSync.event_hooks` accepts synchronous hooks. Configured
|
|
513
|
+
request hooks run before the SDK safety hook, so they cannot re-add protected
|
|
514
|
+
OpenSandbox headers to a cross-origin request. Lifecycle telemetry honors
|
|
515
|
+
`follow_redirects` and the SDK safety hook, but does not invoke configured user
|
|
516
|
+
hooks.
|
|
517
|
+
|
|
408
518
|
```python
|
|
409
519
|
from datetime import timedelta
|
|
410
520
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 2025
|
|
1
|
+
# Copyright 2025 The OpenSandbox Authors
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -46,13 +46,15 @@ dependencies = [
|
|
|
46
46
|
"python-dateutil>=2.8.2,<3.0",
|
|
47
47
|
"attrs>=21.3.0",
|
|
48
48
|
"httpx>=0.27.0,<1.0",
|
|
49
|
+
"httpcore>=1.0.0,<2.0",
|
|
49
50
|
"httpx-sse>=0.4.3,<0.5",
|
|
51
|
+
"opentelemetry-api>=1.20,<2.0",
|
|
50
52
|
]
|
|
51
53
|
|
|
52
54
|
[project.optional-dependencies]
|
|
53
55
|
pool-redis = [
|
|
54
56
|
"redis>=5.0,<6.0",
|
|
55
|
-
"pyjwt>=2.
|
|
57
|
+
"pyjwt>=2.14.0",
|
|
56
58
|
]
|
|
57
59
|
|
|
58
60
|
[project.urls]
|
|
@@ -67,8 +69,8 @@ source = "vcs"
|
|
|
67
69
|
[tool.hatch.version.raw-options]
|
|
68
70
|
# This package is in a subdirectory; explicitly point setuptools-scm at the git root.
|
|
69
71
|
root = "../../.."
|
|
70
|
-
tag_regex = "^
|
|
71
|
-
git_describe_command = 'git describe --dirty --tags --long --match "
|
|
72
|
+
tag_regex = "^release-(?P<version>\\d+\\.\\d+\\.\\d+(?:[\\.\\w\\+\\-]*)?)$"
|
|
73
|
+
git_describe_command = 'git describe --dirty --tags --long --match "release-*"'
|
|
72
74
|
fallback_version = "0.1.16"
|
|
73
75
|
|
|
74
76
|
[tool.hatch.build]
|
|
@@ -140,7 +142,7 @@ asyncio_mode = "auto"
|
|
|
140
142
|
|
|
141
143
|
[tool.uv]
|
|
142
144
|
constraint-dependencies = [
|
|
143
|
-
"pyjwt>=2.
|
|
145
|
+
"pyjwt>=2.14.0",
|
|
144
146
|
]
|
|
145
147
|
|
|
146
148
|
[tool.coverage.run]
|
|
@@ -156,4 +158,5 @@ dev = [
|
|
|
156
158
|
"ruff>=0.14.8",
|
|
157
159
|
"pyright>=1.1.0",
|
|
158
160
|
"openapi-python-client>=0.28.0",
|
|
161
|
+
"opentelemetry-sdk>=1.20,<2.0",
|
|
159
162
|
]
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright 2025 The OpenSandbox Authors
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
"""Async sandbox pool reconciliation logic."""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import logging
|
|
21
|
+
from collections.abc import Awaitable, Callable
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
|
|
24
|
+
from opensandbox.pool_types import (
|
|
25
|
+
AsyncPoolConfig,
|
|
26
|
+
AsyncPoolStateStore,
|
|
27
|
+
)
|
|
28
|
+
from opensandbox.pool_types import (
|
|
29
|
+
reap_expired_idle_with_min_ttl_async as _reap_expired_idle_with_min_ttl_async,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
async def run_async_reconcile_tick(
|
|
36
|
+
*,
|
|
37
|
+
config: AsyncPoolConfig,
|
|
38
|
+
state_store: AsyncPoolStateStore,
|
|
39
|
+
on_discard_sandbox: Callable[[str], Awaitable[None]],
|
|
40
|
+
warming_count: int,
|
|
41
|
+
submit_warmups: Callable[[int], None],
|
|
42
|
+
on_primary_acquired: Callable[[], None] = lambda: None,
|
|
43
|
+
) -> bool:
|
|
44
|
+
pool_name = config.pool_name
|
|
45
|
+
owner_id = str(config.owner_id)
|
|
46
|
+
ttl = config.primary_lock_ttl
|
|
47
|
+
|
|
48
|
+
if not await state_store.try_acquire_primary_lock(pool_name, owner_id, ttl):
|
|
49
|
+
logger.debug(f"Async reconcile skip (not primary): pool_name={pool_name}")
|
|
50
|
+
return False
|
|
51
|
+
on_primary_acquired()
|
|
52
|
+
await _run_primary_replenish_once(
|
|
53
|
+
config=config,
|
|
54
|
+
state_store=state_store,
|
|
55
|
+
on_discard_sandbox=on_discard_sandbox,
|
|
56
|
+
warming_count=warming_count,
|
|
57
|
+
submit_warmups=submit_warmups,
|
|
58
|
+
)
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
async def _run_primary_replenish_once(
|
|
63
|
+
*,
|
|
64
|
+
config: AsyncPoolConfig,
|
|
65
|
+
state_store: AsyncPoolStateStore,
|
|
66
|
+
on_discard_sandbox: Callable[[str], Awaitable[None]],
|
|
67
|
+
warming_count: int,
|
|
68
|
+
submit_warmups: Callable[[int], None],
|
|
69
|
+
) -> None:
|
|
70
|
+
pool_name = config.pool_name
|
|
71
|
+
owner_id = str(config.owner_id)
|
|
72
|
+
ttl = config.primary_lock_ttl
|
|
73
|
+
now = datetime.now(timezone.utc)
|
|
74
|
+
|
|
75
|
+
discarded_alive = await _reap_expired_idle_with_min_ttl_async(
|
|
76
|
+
state_store, pool_name, now, config.acquire_min_remaining_ttl
|
|
77
|
+
)
|
|
78
|
+
for sandbox_id in discarded_alive:
|
|
79
|
+
await on_discard_sandbox(sandbox_id)
|
|
80
|
+
counters = await state_store.snapshot_counters(pool_name)
|
|
81
|
+
excess = max(0, counters.idle_count - config.max_idle)
|
|
82
|
+
to_remove = min(excess, int(config.warmup_concurrency or 1))
|
|
83
|
+
if to_remove > 0:
|
|
84
|
+
await _shrink_excess_idle(config, state_store, on_discard_sandbox, to_remove)
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
deficit = max(0, config.max_idle - counters.idle_count - warming_count)
|
|
88
|
+
to_create = min(deficit, config.warmup_create_qps)
|
|
89
|
+
if to_create == 0:
|
|
90
|
+
await state_store.renew_primary_lock(pool_name, owner_id, ttl)
|
|
91
|
+
return
|
|
92
|
+
|
|
93
|
+
if not await state_store.renew_primary_lock(pool_name, owner_id, ttl):
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
submit_warmups(to_create)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
async def _shrink_excess_idle(
|
|
100
|
+
config: AsyncPoolConfig,
|
|
101
|
+
state_store: AsyncPoolStateStore,
|
|
102
|
+
on_discard_sandbox: Callable[[str], Awaitable[None]],
|
|
103
|
+
to_remove: int,
|
|
104
|
+
) -> None:
|
|
105
|
+
pool_name = config.pool_name
|
|
106
|
+
owner_id = str(config.owner_id)
|
|
107
|
+
ttl = config.primary_lock_ttl
|
|
108
|
+
removed = 0
|
|
109
|
+
for _ in range(to_remove):
|
|
110
|
+
if not await state_store.renew_primary_lock(pool_name, owner_id, ttl):
|
|
111
|
+
logger.warning(
|
|
112
|
+
f"Async reconcile lost primary lock before shrinking idle: pool_name={pool_name} removed={removed}"
|
|
113
|
+
)
|
|
114
|
+
return
|
|
115
|
+
sandbox_id = await state_store.try_take_idle(pool_name)
|
|
116
|
+
if sandbox_id is None:
|
|
117
|
+
return
|
|
118
|
+
await _discard(on_discard_sandbox, sandbox_id)
|
|
119
|
+
removed += 1
|
|
120
|
+
|
|
121
|
+
await state_store.renew_primary_lock(pool_name, owner_id, ttl)
|
|
122
|
+
logger.debug(
|
|
123
|
+
f"Async reconcile shrunk {removed} idle sandbox(es): pool_name={pool_name}"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
async def _discard(
|
|
128
|
+
on_discard_sandbox: Callable[[str], Awaitable[None]], sandbox_id: str
|
|
129
|
+
) -> None:
|
|
130
|
+
try:
|
|
131
|
+
await on_discard_sandbox(sandbox_id)
|
|
132
|
+
except Exception as exc:
|
|
133
|
+
logger.warning(
|
|
134
|
+
f"Async reconcile sandbox cleanup failed: sandbox_id={sandbox_id} error={exc}"
|
|
135
|
+
)
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright 2026 The OpenSandbox Authors
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
"""httpx helpers shared by handwritten SDK adapters.
|
|
17
|
+
|
|
18
|
+
These helpers preserve user-provided event hooks while appending the SDK's
|
|
19
|
+
request hook that strips protected OpenSandbox headers from cross-origin
|
|
20
|
+
requests. The SDK hook must run last so user hooks cannot accidentally re-add
|
|
21
|
+
protected headers before httpx sends a redirected request.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from collections.abc import Awaitable, Callable, Mapping, Sequence
|
|
25
|
+
from typing import Protocol, TypedDict, TypeVar
|
|
26
|
+
|
|
27
|
+
import httpx
|
|
28
|
+
|
|
29
|
+
SyncEventHook = Callable[..., None]
|
|
30
|
+
AsyncEventHook = Callable[..., Awaitable[None]]
|
|
31
|
+
SyncEventHooks = Mapping[str, Sequence[SyncEventHook]]
|
|
32
|
+
AsyncEventHooks = Mapping[str, Sequence[AsyncEventHook]]
|
|
33
|
+
|
|
34
|
+
_HookT = TypeVar("_HookT")
|
|
35
|
+
_PROTECTED_HEADER_PREFIXES = ("OPEN-SANDBOX-", "OPENSANDBOX-")
|
|
36
|
+
|
|
37
|
+
_DEFAULT_PORTS = {
|
|
38
|
+
"http": 80,
|
|
39
|
+
"https": 443,
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class _SyncRedirectConfig(Protocol):
|
|
44
|
+
follow_redirects: bool
|
|
45
|
+
event_hooks: dict[str, list[SyncEventHook]]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class _AsyncRedirectConfig(Protocol):
|
|
49
|
+
follow_redirects: bool
|
|
50
|
+
event_hooks: dict[str, list[AsyncEventHook]]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SyncRedirectClientOptions(TypedDict):
|
|
54
|
+
"""Redirect-related options accepted by ``httpx.Client``."""
|
|
55
|
+
|
|
56
|
+
follow_redirects: bool
|
|
57
|
+
event_hooks: dict[str, list[SyncEventHook]]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class AsyncRedirectClientOptions(TypedDict):
|
|
61
|
+
"""Redirect-related options accepted by ``httpx.AsyncClient``."""
|
|
62
|
+
|
|
63
|
+
follow_redirects: bool
|
|
64
|
+
event_hooks: dict[str, list[AsyncEventHook]]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _origin(url: httpx.URL) -> tuple[str, str | None, int | None]:
|
|
68
|
+
return (url.scheme, url.host, url.port or _DEFAULT_PORTS.get(url.scheme))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _strip_protected_headers_for_cross_origin_request(
|
|
72
|
+
request: httpx.Request,
|
|
73
|
+
*,
|
|
74
|
+
base_origin: tuple[str, str | None, int | None],
|
|
75
|
+
) -> None:
|
|
76
|
+
if _origin(request.url) == base_origin:
|
|
77
|
+
return
|
|
78
|
+
protected_headers = [
|
|
79
|
+
name
|
|
80
|
+
for name in request.headers
|
|
81
|
+
if name.upper().startswith(_PROTECTED_HEADER_PREFIXES)
|
|
82
|
+
]
|
|
83
|
+
for name in protected_headers:
|
|
84
|
+
del request.headers[name]
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _copy_event_hooks(
|
|
88
|
+
event_hooks: Mapping[str, Sequence[_HookT]] | None,
|
|
89
|
+
) -> dict[str, list[_HookT]]:
|
|
90
|
+
if event_hooks is None:
|
|
91
|
+
return {}
|
|
92
|
+
return {event: list(hooks) for event, hooks in event_hooks.items()}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def build_redirect_event_hooks(
|
|
96
|
+
base_url: str,
|
|
97
|
+
event_hooks: SyncEventHooks | None = None,
|
|
98
|
+
) -> dict[str, list[SyncEventHook]]:
|
|
99
|
+
"""Build sync hooks for SDK clients.
|
|
100
|
+
|
|
101
|
+
Existing user hooks are copied and preserved. The SDK request hook is
|
|
102
|
+
appended after user request hooks so protected OpenSandbox headers are
|
|
103
|
+
removed from any request whose origin differs from ``base_url``.
|
|
104
|
+
"""
|
|
105
|
+
base_origin = _origin(httpx.URL(base_url))
|
|
106
|
+
|
|
107
|
+
def strip_protected_headers(request: httpx.Request) -> None:
|
|
108
|
+
_strip_protected_headers_for_cross_origin_request(
|
|
109
|
+
request, base_origin=base_origin
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
hooks = _copy_event_hooks(event_hooks)
|
|
113
|
+
hooks.setdefault("request", []).append(strip_protected_headers)
|
|
114
|
+
return hooks
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def build_async_redirect_event_hooks(
|
|
118
|
+
base_url: str,
|
|
119
|
+
event_hooks: AsyncEventHooks | None = None,
|
|
120
|
+
) -> dict[str, list[AsyncEventHook]]:
|
|
121
|
+
"""Build async hooks for SDK clients.
|
|
122
|
+
|
|
123
|
+
Existing user hooks are copied and preserved. The SDK request hook is
|
|
124
|
+
appended after user request hooks so protected OpenSandbox headers are
|
|
125
|
+
removed from any request whose origin differs from ``base_url``.
|
|
126
|
+
"""
|
|
127
|
+
base_origin = _origin(httpx.URL(base_url))
|
|
128
|
+
|
|
129
|
+
async def strip_protected_headers(request: httpx.Request) -> None:
|
|
130
|
+
_strip_protected_headers_for_cross_origin_request(
|
|
131
|
+
request, base_origin=base_origin
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
hooks = _copy_event_hooks(event_hooks)
|
|
135
|
+
hooks.setdefault("request", []).append(strip_protected_headers)
|
|
136
|
+
return hooks
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def build_redirect_client_options(
|
|
140
|
+
config: _SyncRedirectConfig,
|
|
141
|
+
base_url: str,
|
|
142
|
+
*,
|
|
143
|
+
additional_request_hooks: Sequence[SyncEventHook] = (),
|
|
144
|
+
) -> SyncRedirectClientOptions:
|
|
145
|
+
"""Build redirect options for a synchronous adapter client."""
|
|
146
|
+
event_hooks = build_redirect_event_hooks(base_url, config.event_hooks)
|
|
147
|
+
event_hooks.setdefault("request", [])[0:0] = additional_request_hooks
|
|
148
|
+
return {
|
|
149
|
+
"follow_redirects": config.follow_redirects,
|
|
150
|
+
"event_hooks": event_hooks,
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def build_async_redirect_client_options(
|
|
155
|
+
config: _AsyncRedirectConfig,
|
|
156
|
+
base_url: str,
|
|
157
|
+
) -> AsyncRedirectClientOptions:
|
|
158
|
+
"""Build redirect options for an asynchronous adapter client."""
|
|
159
|
+
return {
|
|
160
|
+
"follow_redirects": config.follow_redirects,
|
|
161
|
+
"event_hooks": build_async_redirect_event_hooks(base_url, config.event_hooks),
|
|
162
|
+
}
|