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.
Files changed (412) hide show
  1. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/.gitignore +8 -4
  2. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/PKG-INFO +116 -4
  3. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/README.md +112 -2
  4. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/pyproject.toml +8 -5
  5. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/__init__.py +1 -1
  6. opensandbox-1.1.1/src/opensandbox/_async_pool_reconciler.py +135 -0
  7. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/_async_pool_store.py +1 -1
  8. opensandbox-1.1.1/src/opensandbox/_httpx.py +162 -0
  9. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/_pool_reconciler.py +19 -107
  10. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/_pool_store.py +1 -1
  11. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/__init__.py +1 -1
  12. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/command_adapter.py +58 -96
  13. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/__init__.py +1 -1
  14. opensandbox-1.1.1/src/opensandbox/adapters/converter/command_execution.py +84 -0
  15. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/command_model_converter.py +1 -1
  16. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/diagnostic_model_converter.py +1 -1
  17. opensandbox-1.1.1/src/opensandbox/adapters/converter/env_entry.py +95 -0
  18. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/event_node.py +1 -1
  19. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/exception_converter.py +1 -1
  20. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/execution_converter.py +16 -4
  21. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/execution_event_dispatcher.py +1 -1
  22. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/filesystem_model_converter.py +1 -1
  23. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/metrics_model_converter.py +1 -1
  24. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/response_handler.py +1 -1
  25. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/converter/sandbox_model_converter.py +102 -42
  26. opensandbox-1.1.1/src/opensandbox/adapters/converter/template_model_converter.py +206 -0
  27. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/diagnostics_adapter.py +7 -1
  28. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/egress_adapter.py +6 -6
  29. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/endpoint_cache.py +1 -1
  30. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/factory.py +11 -1
  31. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/filesystem_adapter.py +27 -14
  32. opensandbox-1.1.1/src/opensandbox/adapters/filesystem_identity.py +26 -0
  33. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/health_adapter.py +9 -9
  34. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/isolated_adapter.py +6 -6
  35. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/isolated_filesystem_adapter.py +15 -9
  36. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/metrics_adapter.py +7 -8
  37. opensandbox-1.1.1/src/opensandbox/adapters/network_policy_adapter.py +219 -0
  38. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/sandboxes_adapter.py +192 -10
  39. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/adapters/sse.py +1 -1
  40. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/__init__.py +1 -1
  41. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/__init__.py +1 -1
  42. {opensandbox-0.1.17.dev0/src/opensandbox/api/execd → opensandbox-1.1.1/src/opensandbox/api/diagnostic}/api/__init__.py +1 -1
  43. {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
  44. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/api/diagnostics/get_sandboxes_sandbox_id_diagnostics_events.py +1 -1
  45. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/api/diagnostics/get_sandboxes_sandbox_id_diagnostics_logs.py +1 -1
  46. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/client.py +1 -1
  47. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/errors.py +1 -1
  48. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/__init__.py +1 -1
  49. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/diagnostic_content_response.py +1 -1
  50. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/diagnostic_content_response_delivery.py +1 -1
  51. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/diagnostic_content_response_kind.py +1 -1
  52. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/models/error_response.py +1 -1
  53. {opensandbox-0.1.17.dev0/src/opensandbox/api/execd → opensandbox-1.1.1/src/opensandbox/api/diagnostic}/types.py +1 -1
  54. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/__init__.py +1 -1
  55. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/__init__.py +1 -1
  56. {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
  57. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/delete_credential_vault.py +1 -1
  58. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault.py +1 -1
  59. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault_bindings.py +1 -1
  60. {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
  61. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/get_credential_vault_credentials.py +1 -1
  62. {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
  63. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/patch_credential_vault.py +1 -1
  64. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/credential_vault/post_credential_vault.py +1 -1
  65. {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
  66. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/policy/delete_policy.py +1 -1
  67. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/policy/get_policy.py +1 -1
  68. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/api/policy/patch_policy.py +1 -1
  69. {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/egress}/client.py +1 -1
  70. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/errors.py +1 -1
  71. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/__init__.py +1 -1
  72. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/api_key_credential_auth.py +1 -1
  73. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/api_key_credential_auth_type.py +1 -1
  74. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/basic_credential_auth.py +1 -1
  75. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/basic_credential_auth_type.py +1 -1
  76. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/bearer_credential_auth.py +1 -1
  77. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/bearer_credential_auth_type.py +1 -1
  78. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential.py +1 -1
  79. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_auth_metadata.py +1 -1
  80. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding.py +1 -1
  81. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding_list_response.py +1 -1
  82. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding_metadata.py +1 -1
  83. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_binding_mutation_set.py +1 -1
  84. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_list_response.py +1 -1
  85. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_match.py +1 -1
  86. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_match_schemes_item.py +1 -1
  87. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_metadata.py +1 -1
  88. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_mutation_set.py +1 -1
  89. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_substitution.py +1 -1
  90. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_substitution_in_item.py +1 -1
  91. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_vault_create_request.py +1 -1
  92. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_vault_mutation_request.py +1 -1
  93. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/credential_vault_state.py +1 -1
  94. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/custom_header_entry.py +1 -1
  95. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/custom_headers_credential_auth.py +1 -1
  96. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/custom_headers_credential_auth_type.py +1 -1
  97. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/inline_credential_source.py +1 -1
  98. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/inline_credential_source_type.py +1 -1
  99. {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/egress}/models/network_policy.py +1 -1
  100. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/network_policy_default_action.py +1 -1
  101. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/network_rule.py +1 -1
  102. {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/egress}/models/network_rule_action.py +1 -1
  103. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/passthrough_credential_auth.py +1 -1
  104. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/passthrough_credential_auth_type.py +1 -1
  105. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/models/policy_status_response.py +1 -1
  106. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/types.py +1 -1
  107. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/__init__.py +1 -1
  108. {opensandbox-0.1.17.dev0/src/opensandbox/api/diagnostic → opensandbox-1.1.1/src/opensandbox/api/execd}/api/__init__.py +1 -1
  109. {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
  110. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/create_code_context.py +1 -1
  111. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/delete_context.py +1 -1
  112. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/delete_contexts_by_language.py +1 -1
  113. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/get_context.py +1 -1
  114. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/interrupt_code.py +1 -1
  115. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/list_contexts.py +1 -1
  116. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/code_interpreting/run_code.py +1 -1
  117. opensandbox-1.1.1/src/opensandbox/api/execd/api/command/__init__.py +17 -0
  118. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/create_session.py +1 -1
  119. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/delete_session.py +1 -1
  120. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/get_background_command_logs.py +9 -1
  121. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/get_command_status.py +9 -1
  122. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/interrupt_command.py +1 -1
  123. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/run_command.py +33 -13
  124. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/command/run_in_session.py +1 -1
  125. opensandbox-1.1.1/src/opensandbox/api/execd/api/filesystem/__init__.py +17 -0
  126. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/chmod_files.py +1 -1
  127. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/download_file.py +1 -1
  128. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/get_files_info.py +1 -1
  129. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/list_directory.py +1 -1
  130. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/make_dirs.py +1 -1
  131. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/remove_dirs.py +1 -1
  132. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/remove_files.py +1 -1
  133. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/rename_files.py +1 -1
  134. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/replace_content.py +3 -1
  135. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/search_files.py +1 -1
  136. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/filesystem/upload_file.py +1 -1
  137. opensandbox-1.1.1/src/opensandbox/api/execd/api/health/__init__.py +17 -0
  138. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/health/ping.py +1 -1
  139. opensandbox-1.1.1/src/opensandbox/api/execd/api/isolated_execution/__init__.py +17 -0
  140. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/create_isolated_session.py +17 -5
  141. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/delete_isolated_session.py +1 -1
  142. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/get_isolated_run_logs.py +1 -1
  143. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/get_isolated_run_status.py +1 -1
  144. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/get_isolated_session.py +1 -1
  145. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_capabilities.py +1 -1
  146. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_chmod_files.py +1 -1
  147. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_download_file.py +1 -1
  148. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_get_files_info.py +1 -1
  149. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_list_directory.py +1 -1
  150. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_make_dirs.py +1 -1
  151. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_remove_dirs.py +1 -1
  152. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_remove_files.py +1 -1
  153. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_rename_files.py +1 -1
  154. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_replace_content.py +1 -1
  155. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_search_files.py +1 -1
  156. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_session_commit.py +1 -1
  157. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_session_diff.py +1 -1
  158. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/isolated_upload_file.py +1 -1
  159. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/list_isolated_sessions.py +1 -1
  160. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/isolated_execution/run_in_isolated_session.py +1 -1
  161. opensandbox-1.1.1/src/opensandbox/api/execd/api/metric/__init__.py +17 -0
  162. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/metric/get_metrics.py +1 -1
  163. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/api/metric/watch_metrics.py +1 -1
  164. {opensandbox-0.1.17.dev0/src/opensandbox/api/egress → opensandbox-1.1.1/src/opensandbox/api/execd}/client.py +1 -1
  165. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/errors.py +1 -1
  166. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/__init__.py +17 -1
  167. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/bind_mount.py +1 -1
  168. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/capabilities_response.py +1 -1
  169. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/capabilities_response_hardening.py +1 -1
  170. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/capabilities_response_hardening_init_mode.py +1 -1
  171. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/chmod_files_body.py +1 -1
  172. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/code_context.py +1 -1
  173. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/code_context_request.py +1 -1
  174. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/command_status_response.py +1 -1
  175. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_isolated_session_request.py +64 -29
  176. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_isolated_session_request_profile.py +1 -1
  177. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_isolated_session_request_uid_mode.py +1 -1
  178. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_session_request.py +1 -1
  179. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/create_session_response.py +1 -1
  180. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/env_passthrough_spec.py +1 -1
  181. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/env_passthrough_spec_mode.py +1 -1
  182. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/error_response.py +1 -1
  183. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/file_info.py +1 -1
  184. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/file_info_type.py +1 -1
  185. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/file_metadata.py +1 -1
  186. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/get_files_info_response_200.py +1 -1
  187. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/hardening_layer_state.py +1 -1
  188. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/hardening_layer_state_state.py +1 -1
  189. opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_chmod_files_body.py +75 -0
  190. opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_get_files_info_response_200.py +75 -0
  191. opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_make_dirs_body.py +75 -0
  192. opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_replace_content_body.py +75 -0
  193. opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_replace_content_response_200.py +75 -0
  194. opensandbox-1.1.1/src/opensandbox/api/execd/models/identity_upload_file_body.py +110 -0
  195. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_background_run_response.py +1 -1
  196. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_chmod_files_body.py +1 -1
  197. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_create_session_response.py +1 -1
  198. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_get_files_info_response_200.py +1 -1
  199. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_make_dirs_body.py +1 -1
  200. opensandbox-1.1.1/src/opensandbox/api/execd/models/isolated_overlay_spec.py +117 -0
  201. opensandbox-1.1.1/src/opensandbox/api/execd/models/isolated_overlay_spec_mode.py +26 -0
  202. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_replace_content_body.py +1 -1
  203. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_replace_content_response_200.py +1 -1
  204. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_run_request.py +6 -5
  205. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_run_request_envs.py +1 -1
  206. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_run_status.py +1 -1
  207. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_session_summary.py +1 -1
  208. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_session_summary_status.py +1 -1
  209. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_upload_file_body.py +1 -1
  210. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_workspace_spec.py +1 -1
  211. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/isolated_workspace_spec_mode.py +1 -1
  212. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/list_isolated_sessions_response.py +1 -1
  213. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/make_dirs_body.py +1 -1
  214. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/metrics.py +1 -1
  215. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/permission.py +1 -1
  216. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/rename_file_item.py +1 -1
  217. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_content_body.py +1 -1
  218. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_content_response_200.py +1 -1
  219. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_file_content_item.py +1 -1
  220. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/replace_file_content_result.py +1 -1
  221. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_code_request.py +1 -1
  222. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_command_request.py +30 -14
  223. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_command_request_envs.py +5 -4
  224. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/run_in_session_request.py +1 -1
  225. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event.py +1 -1
  226. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event_error.py +1 -1
  227. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event_results.py +1 -1
  228. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/server_stream_event_type.py +1 -1
  229. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state.py +29 -4
  230. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state_profile.py +1 -1
  231. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state_status.py +1 -1
  232. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/session_state_uid_mode.py +1 -1
  233. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/models/upload_file_body.py +1 -1
  234. {opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle → opensandbox-1.1.1/src/opensandbox/api/execd}/types.py +1 -1
  235. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/__init__.py +1 -1
  236. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/__init__.py +1 -1
  237. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/metrics/__init__.py +17 -0
  238. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/metrics/report_metrics_event.py +1 -1
  239. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/__init__.py +17 -0
  240. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/delete_sandbox_network_policy_rules.py +247 -0
  241. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/delete_sandboxes_sandbox_id.py +1 -1
  242. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/get_sandbox_network_policy.py +220 -0
  243. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/get_sandboxes.py +1 -1
  244. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/get_sandboxes_sandbox_id.py +1 -1
  245. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/get_sandboxes_sandbox_id_endpoints_port.py +1 -1
  246. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/patch_sandbox_network_policy.py +267 -0
  247. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/patch_sandboxes_sandbox_id_metadata.py +1 -1
  248. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes.py +58 -25
  249. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes_sandbox_id_pause.py +1 -1
  250. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes_sandbox_id_renew_expiration.py +17 -5
  251. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/sandboxes/post_sandboxes_sandbox_id_resume.py +1 -1
  252. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/sandboxes/replace_sandbox_network_policy.py +256 -0
  253. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/snapshots/__init__.py +17 -0
  254. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/delete_snapshots_snapshot_id.py +1 -1
  255. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/get_snapshots.py +1 -1
  256. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/get_snapshots_snapshot_id.py +1 -1
  257. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/api/snapshots/post_sandboxes_sandbox_id_snapshots.py +1 -1
  258. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/__init__.py +17 -0
  259. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/create_template.py +274 -0
  260. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/delete_template.py +196 -0
  261. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/get_template.py +202 -0
  262. opensandbox-1.1.1/src/opensandbox/api/lifecycle/api/templates/list_templates.py +232 -0
  263. {opensandbox-0.1.17.dev0/src/opensandbox/api/execd → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/client.py +1 -1
  264. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/errors.py +1 -1
  265. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/__init__.py +27 -1
  266. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/allocation_summary.py +1 -1
  267. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/allocation_summary_mode.py +1 -1
  268. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/allocation_summary_state.py +1 -1
  269. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request.py +195 -0
  270. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request_env.py +72 -0
  271. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request_format.py +25 -0
  272. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/create_fsb_template_request_metadata.py +62 -0
  273. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request.py +26 -3
  274. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request_env.py +1 -1
  275. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request_extensions.py +1 -1
  276. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_request_metadata.py +1 -1
  277. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_response.py +1 -1
  278. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_response_extensions.py +1 -1
  279. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_sandbox_response_metadata.py +1 -1
  280. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/create_snapshot_request.py +1 -1
  281. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/credential_proxy_config.py +1 -1
  282. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/endpoint.py +1 -1
  283. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/endpoint_headers.py +1 -1
  284. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/error_response.py +1 -1
  285. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template.py +210 -0
  286. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_env.py +62 -0
  287. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_format.py +25 -0
  288. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_metadata.py +62 -0
  289. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_readiness.py +69 -0
  290. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_status.py +81 -0
  291. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/fsb_template_status_phase.py +27 -0
  292. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/host.py +1 -1
  293. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/image_spec.py +1 -1
  294. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/image_spec_auth.py +1 -1
  295. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/lifecycle_hook.py +1 -1
  296. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/list_fsb_templates_response.py +83 -0
  297. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/list_sandboxes_response.py +1 -1
  298. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/list_snapshots_response.py +1 -1
  299. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/metrics_event.py +1 -1
  300. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/metrics_event_event_type.py +1 -1
  301. {opensandbox-0.1.17.dev0/src/opensandbox/api/egress → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/models/network_policy.py +1 -1
  302. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/network_policy_default_action.py +1 -1
  303. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/network_rule.py +1 -1
  304. {opensandbox-0.1.17.dev0/src/opensandbox/api/egress → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/models/network_rule_action.py +1 -1
  305. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/ossfs.py +1 -1
  306. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/ossfs_version.py +1 -1
  307. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/pagination_info.py +1 -1
  308. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/patch_sandbox_metadata_request.py +1 -1
  309. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/periodic_lifecycle_hook.py +1 -1
  310. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/platform_spec.py +1 -1
  311. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/platform_spec_arch.py +1 -1
  312. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/platform_spec_os.py +1 -1
  313. opensandbox-1.1.1/src/opensandbox/api/lifecycle/models/policy_status_response.py +111 -0
  314. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/pvc.py +1 -1
  315. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/renew_sandbox_expiration_request.py +3 -2
  316. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/renew_sandbox_expiration_response.py +1 -1
  317. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/resource_limits.py +1 -1
  318. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox.py +1 -1
  319. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_extensions.py +1 -1
  320. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_lifecycle.py +1 -1
  321. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_metadata.py +1 -1
  322. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/sandbox_status.py +1 -1
  323. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/snapshot.py +1 -1
  324. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/snapshot_status.py +1 -1
  325. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/models/volume.py +1 -1
  326. {opensandbox-0.1.17.dev0/src/opensandbox/api/diagnostic → opensandbox-1.1.1/src/opensandbox/api/lifecycle}/types.py +1 -1
  327. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/async_redis_pool_store.py +1 -1
  328. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/__init__.py +1 -1
  329. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/client_ip.py +1 -1
  330. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/connection.py +68 -20
  331. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/config/connection_sync.py +76 -27
  332. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/constants.py +1 -1
  333. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/exceptions/__init__.py +1 -1
  334. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/exceptions/sandbox.py +1 -1
  335. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/internal/__init__.py +1 -1
  336. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/internal/lifecycle_metrics.py +21 -5
  337. opensandbox-1.1.1/src/opensandbox/internal/pool_tracing.py +203 -0
  338. opensandbox-1.1.1/src/opensandbox/internal/readiness.py +221 -0
  339. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/manager.py +28 -1
  340. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/__init__.py +3 -1
  341. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/diagnostics.py +1 -1
  342. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/execd.py +25 -9
  343. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/execd_sync.py +1 -1
  344. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/filesystem.py +1 -1
  345. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/isolated.py +53 -8
  346. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/models/sandboxes.py +69 -2
  347. opensandbox-1.1.1/src/opensandbox/models/templates.py +255 -0
  348. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool.py +1 -1
  349. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_async.py +553 -215
  350. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_manager.py +1 -1
  351. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_redis.py +1 -1
  352. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/pool_types.py +32 -27
  353. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/redis_pool_store.py +1 -1
  354. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sandbox.py +297 -98
  355. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/__init__.py +1 -1
  356. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/command.py +27 -4
  357. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/diagnostics.py +1 -1
  358. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/egress.py +1 -1
  359. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/filesystem.py +1 -1
  360. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/health.py +1 -1
  361. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/isolated.py +1 -1
  362. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/metrics.py +1 -1
  363. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/services/sandbox.py +81 -1
  364. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/__init__.py +1 -1
  365. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/__init__.py +1 -1
  366. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/command_adapter.py +58 -93
  367. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/converter/__init__.py +1 -1
  368. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/converter/execution_event_dispatcher.py +1 -1
  369. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/diagnostics_adapter.py +7 -1
  370. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/egress_adapter.py +6 -6
  371. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/factory.py +6 -1
  372. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/filesystem_adapter.py +32 -11
  373. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/health_adapter.py +19 -7
  374. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/isolated_adapter.py +5 -6
  375. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/isolated_filesystem_adapter.py +15 -9
  376. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/metrics_adapter.py +9 -7
  377. opensandbox-1.1.1/src/opensandbox/sync/adapters/network_policy_adapter.py +212 -0
  378. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/adapters/sandboxes_adapter.py +149 -16
  379. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/manager.py +23 -1
  380. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/pool.py +809 -103
  381. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/sandbox.py +288 -83
  382. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/__init__.py +1 -1
  383. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/command.py +27 -4
  384. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/diagnostics.py +1 -1
  385. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/egress.py +1 -1
  386. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/filesystem.py +1 -1
  387. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/health.py +1 -1
  388. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/isolated.py +1 -1
  389. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/metrics.py +1 -1
  390. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/sync/services/sandbox.py +40 -1
  391. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/__init__.py +1 -1
  392. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_async_retry.py +1 -1
  393. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_classify.py +1 -1
  394. opensandbox-1.1.1/src/opensandbox/transport/_deadline_sync.py +163 -0
  395. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_decision.py +1 -1
  396. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/_sync_retry.py +9 -14
  397. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/transport/retry.py +1 -1
  398. opensandbox-0.1.17.dev0/src/opensandbox/_async_pool_reconciler.py +0 -270
  399. opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/command/__init__.py +0 -17
  400. opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/filesystem/__init__.py +0 -17
  401. opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/health/__init__.py +0 -17
  402. opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/isolated_execution/__init__.py +0 -17
  403. opensandbox-0.1.17.dev0/src/opensandbox/api/execd/api/metric/__init__.py +0 -17
  404. opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle/api/metrics/__init__.py +0 -17
  405. opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle/api/sandboxes/__init__.py +0 -17
  406. opensandbox-0.1.17.dev0/src/opensandbox/api/lifecycle/api/snapshots/__init__.py +0 -17
  407. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/LICENSE +0 -0
  408. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/diagnostic/py.typed +0 -0
  409. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/egress/py.typed +0 -0
  410. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/execd/py.typed +0 -0
  411. {opensandbox-0.1.17.dev0 → opensandbox-1.1.1}/src/opensandbox/api/lifecycle/py.typed +0 -0
  412. {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
- # fleets FastPath gRPC stubs are committed intentionally (deterministic protoc
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/fleets/generated/
276
- !server/opensandbox_server/services/fleets/generated/**
277
- server/opensandbox_server/services/fleets/generated/__pycache__/
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: 0.1.17.dev0
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.13.0; extra == 'pool-redis'
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
- reconcile_interval=timedelta(seconds=5),
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. Sandbox Management (Admin)
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
- reconcile_interval=timedelta(seconds=5),
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. Sandbox Management (Admin)
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 Alibaba Group Holding Ltd.
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.13.0",
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 = "^python/sandbox/v(?P<version>\\d+\\.\\d+\\.\\d+(?:[\\.\\w\\+\\-]*)?)$"
71
- git_describe_command = 'git describe --dirty --tags --long --match "python/sandbox/v*"'
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.13.0",
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
  ]
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2025 Alibaba Group Holding Ltd.
2
+ # Copyright 2025 The OpenSandbox Authors
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -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
+ )
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2025 Alibaba Group Holding Ltd.
2
+ # Copyright 2025 The OpenSandbox Authors
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -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
+ }