code-sandboxes 1.9.32__tar.gz → 1.9.34__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 (266) hide show
  1. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/PKG-INFO +1 -1
  2. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/__version__.py +1 -1
  3. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/adapters/daytona.py +62 -3
  4. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/bases.py +8 -5
  5. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_bases.py +1 -1
  6. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_daytona_builder.py +63 -0
  7. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.github/workflows/build.yml +0 -0
  8. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.github/workflows/environments-live.yml +0 -0
  9. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.github/workflows/py-code-style.yml +0 -0
  10. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.github/workflows/py-tests.yml +0 -0
  11. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.github/workflows/py-typing.yml +0 -0
  12. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.github/workflows/reusable-python.yml +0 -0
  13. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.gitignore +0 -0
  14. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.licenserc.yaml +0 -0
  15. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.pre-commit-config.yaml +0 -0
  16. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/.vscode/settings.json +0 -0
  17. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/CHANGELOG.md +0 -0
  18. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/Dockerfile +0 -0
  19. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/LICENSE +0 -0
  20. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/Makefile +0 -0
  21. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/README.md +0 -0
  22. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/__init__.py +0 -0
  23. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/base.py +0 -0
  24. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/bridge_mount.py +0 -0
  25. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/builds.py +0 -0
  26. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/cli.py +0 -0
  27. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/client.py +0 -0
  28. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/cloudflare_sandbox.py +0 -0
  29. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/commands.py +0 -0
  30. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/console.py +0 -0
  31. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/contents.py +0 -0
  32. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/coreweave_sandbox.py +0 -0
  33. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/datalayer_sandbox.py +0 -0
  34. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/daytona_sandbox.py +0 -0
  35. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/docker_sandbox.py +0 -0
  36. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/e2b_sandbox.py +0 -0
  37. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/__init__.py +0 -0
  38. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/__main__.py +0 -0
  39. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/accounts.py +0 -0
  40. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/adapters/__init__.py +0 -0
  41. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/adapters/datalayer.py +0 -0
  42. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/adapters/e2b.py +0 -0
  43. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/adapters/managed.py +0 -0
  44. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/adapters/modal.py +0 -0
  45. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/attest.py +0 -0
  46. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/breaker.py +0 -0
  47. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/build_secrets.py +0 -0
  48. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/builders.py +0 -0
  49. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/canonical.py +0 -0
  50. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/conformance.py +0 -0
  51. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/constraints/sandbox-contract-v1.txt +0 -0
  52. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/constraints/wheelhouse/README.md +0 -0
  53. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/constraints/wheelhouse/jupyter_server-2.21.0+datalayer.1-py3-none-any.whl +0 -0
  54. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/contract.py +0 -0
  55. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/doctor/__init__.py +0 -0
  56. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/doctor/build.py +0 -0
  57. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/doctor/datalayer_sandbox.py +0 -0
  58. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/doctor/report.schema.json +0 -0
  59. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/errors.py +0 -0
  60. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/files.py +0 -0
  61. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/image_import.py +0 -0
  62. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/lifecycle.py +0 -0
  63. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/policy.py +0 -0
  64. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/redact.py +0 -0
  65. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/resolve.py +0 -0
  66. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/resolve_conda.py +0 -0
  67. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/schema.py +0 -0
  68. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/environments/spec.py +0 -0
  69. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/eval_sandbox.py +0 -0
  70. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/exceptions.py +0 -0
  71. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/filesystem.py +0 -0
  72. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/google_colab.py +0 -0
  73. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/google_colab_sandbox.py +0 -0
  74. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/interfaces.py +0 -0
  75. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/jupyter_ingress.py +0 -0
  76. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/jupyter_server_sandbox.py +0 -0
  77. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/kaggle.py +0 -0
  78. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/kaggle_execute.py +0 -0
  79. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/kaggle_live.py +0 -0
  80. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/kaggle_sandbox.py +0 -0
  81. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/lifecycle.py +0 -0
  82. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/manage.py +0 -0
  83. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/modal_sandbox.py +0 -0
  84. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/models.py +0 -0
  85. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/monty_sandbox.py +0 -0
  86. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/provider_ingress.py +0 -0
  87. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/code_sandboxes/providers.py +0 -0
  88. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docker/Dockerfile +0 -0
  89. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/.gitignore +0 -0
  90. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/LICENSE +0 -0
  91. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/Makefile +0 -0
  92. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/README.md +0 -0
  93. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/babel.config.js +0 -0
  94. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/api-reference/_category_.yml +0 -0
  95. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/api-reference/index.mdx +0 -0
  96. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/cli/_category_.yml +0 -0
  97. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/cli/index.mdx +0 -0
  98. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/contribute/_category_.yml +0 -0
  99. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/contribute/index.mdx +0 -0
  100. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/environments/_category_.yml +0 -0
  101. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/environments/contract.mdx +0 -0
  102. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/environments/index.mdx +0 -0
  103. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/environments/specification.mdx +0 -0
  104. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/environments/spike-2026-09.mdx +0 -0
  105. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/examples/_category_.yml +0 -0
  106. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/examples/index.mdx +0 -0
  107. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/guide/_category_.yml +0 -0
  108. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/guide/index.mdx +0 -0
  109. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/index.mdx +0 -0
  110. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/install/_category_.yml +0 -0
  111. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/install/index.mdx +0 -0
  112. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/provider-ingress.mdx +0 -0
  113. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/_category_.yml +0 -0
  114. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/cloudflare.mdx +0 -0
  115. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/coreweave.mdx +0 -0
  116. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/datalayer.mdx +0 -0
  117. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/daytona.mdx +0 -0
  118. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/docker.mdx +0 -0
  119. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/e2b.mdx +0 -0
  120. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/eval.mdx +0 -0
  121. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/google-colab.mdx +0 -0
  122. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/index.mdx +0 -0
  123. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/jupyter-server.mdx +0 -0
  124. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/kaggle.mdx +0 -0
  125. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/modal.mdx +0 -0
  126. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docs/providers/monty.mdx +0 -0
  127. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/docusaurus.config.js +0 -0
  128. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/package.json +0 -0
  129. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/sidebars.js +0 -0
  130. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/components/HomepageRow1.js +0 -0
  131. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/components/HomepageRow1.module.css +0 -0
  132. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/components/HomepageRow2.js +0 -0
  133. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/components/HomepageRow2.module.css +0 -0
  134. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/components/HomepageRow3.js +0 -0
  135. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/components/HomepageRow3.module.css +0 -0
  136. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/css/custom.css +0 -0
  137. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/pages/index.module.css +0 -0
  138. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/pages/markdown-page.md +0 -0
  139. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/theme/CustomDocItem.tsx +0 -0
  140. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/src/theme/IconsTitle.tsx +0 -0
  141. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/bricks.svg +0 -0
  142. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/building-construction.svg +0 -0
  143. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/cloud-sun.svg +0 -0
  144. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/cloud.svg +0 -0
  145. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/collaboration.svg +0 -0
  146. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/copy-left.svg +0 -0
  147. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/datalayer/logo.png +0 -0
  148. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/datalayer/logo.svg +0 -0
  149. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/datalayer/personas/business.svg +0 -0
  150. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/datalayer/personas/data-scientist.svg +0 -0
  151. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/datalayer/personas/devops.svg +0 -0
  152. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/datalayer/project/project-line.svg +0 -0
  153. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/favicon.ico +0 -0
  154. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/jupyter.svg +0 -0
  155. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/open-source.svg +0 -0
  156. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/react-js.svg +0 -0
  157. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/react-js2.svg +0 -0
  158. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/ringed-planet.svg +0 -0
  159. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/robot.svg +0 -0
  160. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/rocket.svg +0 -0
  161. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/shield.svg +0 -0
  162. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/sparkles.svg +0 -0
  163. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/streamlit.gif +0 -0
  164. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/super-hero.svg +0 -0
  165. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/target.svg +0 -0
  166. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/docs/static/img/thumbs-up.svg +0 -0
  167. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/README.md +0 -0
  168. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/Makefile +0 -0
  169. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/cloudflare_sandbox_example.py +0 -0
  170. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/coreweave_sandbox_example.py +0 -0
  171. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/datalayer_sandbox_example.py +0 -0
  172. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/daytona_sandbox_example.py +0 -0
  173. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/docker_sandbox_example.py +0 -0
  174. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/e2b_sandbox_example.py +0 -0
  175. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/eval_sandbox_example.py +0 -0
  176. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/google_colab_sandbox_example.py +0 -0
  177. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/jupyter_server_sandbox_example.py +0 -0
  178. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/kaggle_sandbox_example.py +0 -0
  179. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/modal_sandbox_example.py +0 -0
  180. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/exec/monty_sandbox_example.py +0 -0
  181. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/Makefile +0 -0
  182. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/cloudflare_sandbox_example.py +0 -0
  183. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/coreweave_sandbox_example.py +0 -0
  184. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/datalayer_sandbox_example.py +0 -0
  185. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/daytona_sandbox_example.py +0 -0
  186. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/docker_sandbox_example.py +0 -0
  187. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/e2b_sandbox_example.py +0 -0
  188. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/eval_sandbox_example.py +0 -0
  189. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/google_colab_sandbox_example.py +0 -0
  190. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/jupyter_server_sandbox_example.py +0 -0
  191. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/kaggle_sandbox_example.py +0 -0
  192. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/modal_sandbox_example.py +0 -0
  193. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/examples/repl/monty_sandbox_example.py +0 -0
  194. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/pyproject.toml +0 -0
  195. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/schemas/environment-v1alpha1.json +0 -0
  196. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/__init__.py +0 -0
  197. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/conftest.py +0 -0
  198. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_a_datalayer_sandbox_can_be_interrupted.py +0 -0
  199. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_bridge_mount.py +0 -0
  200. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_builds.py +0 -0
  201. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_cli_exec.py +0 -0
  202. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_cli_repl.py +0 -0
  203. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_client.py +0 -0
  204. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_client_contents.py +0 -0
  205. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_client_files.py +0 -0
  206. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_client_outcome_error_output.py +0 -0
  207. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_cloudflare.py +0 -0
  208. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_commands_envelope.py +0 -0
  209. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_console.py +0 -0
  210. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_contents_contract.py +0 -0
  211. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_contents_live_matrix.py +0 -0
  212. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_coreweave.py +0 -0
  213. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_datalayer_sandbox.py +0 -0
  214. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_daytona.py +0 -0
  215. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_e2b.py +0 -0
  216. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_accounts.py +0 -0
  217. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_attest.py +0 -0
  218. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_breaker.py +0 -0
  219. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_build_secrets.py +0 -0
  220. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_builders.py +0 -0
  221. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_canonical.py +0 -0
  222. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_conformance.py +0 -0
  223. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_constraints.py +0 -0
  224. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_contract.py +0 -0
  225. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_cross_variant_report.py +0 -0
  226. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_datalayer_builder.py +0 -0
  227. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_dockerfile_source.py +0 -0
  228. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_doctor.py +0 -0
  229. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_e2b_builder.py +0 -0
  230. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_errors.py +0 -0
  231. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_image_import.py +0 -0
  232. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_lifecycle.py +0 -0
  233. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_live_matrix.py +0 -0
  234. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_managed_builders.py +0 -0
  235. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_modal_builder.py +0 -0
  236. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_organization_policy.py +0 -0
  237. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_redact.py +0 -0
  238. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_resolve.py +0 -0
  239. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_resolve_conda.py +0 -0
  240. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_spec.py +0 -0
  241. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_environment_spec_organization_policy.py +0 -0
  242. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_eval.py +0 -0
  243. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_every_variant_has_a_real_interrupt.py +0 -0
  244. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_factory.py +0 -0
  245. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_google_colab.py +0 -0
  246. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_integration.py +0 -0
  247. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_jupyter_ingress.py +0 -0
  248. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_jupyter_server.py +0 -0
  249. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_jupyter_server_streaming.py +0 -0
  250. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_kaggle.py +0 -0
  251. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_kaggle_execute.py +0 -0
  252. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_kaggle_live.py +0 -0
  253. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_kaggle_session.py +0 -0
  254. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_kernel_client_compatibility.py +0 -0
  255. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_lifecycle_vocabulary.py +0 -0
  256. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_manage.py +0 -0
  257. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_manage_datalayer.py +0 -0
  258. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_modal_google_colab_sandbox.py +0 -0
  259. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_modal_session.py +0 -0
  260. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_models.py +0 -0
  261. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_output_line_fidelity.py +0 -0
  262. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_provider_catalog_names.py +0 -0
  263. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_provider_ingress.py +0 -0
  264. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_providers.py +0 -0
  265. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_sandboxes.py +0 -0
  266. {code_sandboxes-1.9.32 → code_sandboxes-1.9.34}/tests/test_the_kill_relaunch_drill.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code_sandboxes
3
- Version: 1.9.32
3
+ Version: 1.9.34
4
4
  Project-URL: Home, https://github.com/datalayer/code-sandboxes
5
5
  Author-email: Datalayer <info@datalayer.io>
6
6
  License: BSD 3-Clause License
@@ -3,4 +3,4 @@
3
3
 
4
4
  """Code Sandboxes."""
5
5
 
6
- __version__ = "1.9.32"
6
+ __version__ = "1.9.34"
@@ -82,6 +82,7 @@ requires of every GPU sandbox (`DaytonaSandbox` reads the snapshot's `gpu`).
82
82
 
83
83
  from __future__ import annotations
84
84
 
85
+ import contextlib
85
86
  import shlex
86
87
  import tempfile
87
88
  import uuid
@@ -163,6 +164,11 @@ def daytona_gpu(accelerator_type: str) -> str | None:
163
164
  return name if name in DAYTONA_GPUS else None
164
165
 
165
166
 
167
+ def _snapshot_name(request: BuildRequest) -> str:
168
+ """The name a build gives its snapshot, unique to the build (its uid is in it)."""
169
+ return f"dl-{request.environment.metadata.name}-v{request.version}-{request.build_uid}"
170
+
171
+
166
172
  def _pip_lock_command(*, authored: bool) -> str:
167
173
  """Install the pip lock: `sync` to it, or `install` it over an authored Dockerfile.
168
174
 
@@ -245,6 +251,9 @@ class Builder(ManagedBuilder):
245
251
  self._daytona_sdk = daytona_sdk or _daytona_sdk
246
252
  self._registry_sdk = registry_sdk or _daytona_registry_sdk
247
253
  self._client_instance: Any = None
254
+ #: The builds `cancel` was asked to stop: one whose snapshot is only
255
+ #: finished after the cancel deletes it itself (E2-18).
256
+ self._cancelled: set[str] = set()
248
257
 
249
258
  def _provider_secrets(self) -> dict[str, str]:
250
259
  """The owner's Daytona secrets the build credential carries (D-8, E2-01).
@@ -339,7 +348,7 @@ class Builder(ManagedBuilder):
339
348
  spec = request.environment.spec
340
349
  sdk = self._daytona_sdk()
341
350
  client = self._client(sdk)
342
- name = f"dl-{request.environment.metadata.name}-v{request.version}-{request.build_uid}"
351
+ name = _snapshot_name(request)
343
352
 
344
353
  registry_id = self._register_base_pull(client, request.resolved_base)
345
354
  try:
@@ -459,6 +468,10 @@ class Builder(ManagedBuilder):
459
468
  timeout=self.max_build_seconds,
460
469
  )
461
470
  except Exception as error:
471
+ # Daytona keeps a snapshot that failed, in `error`, under
472
+ # the build's own name: one over its size limit was left
473
+ # there (E2-17, 2026-09-18). Nothing records it, so it goes.
474
+ self._discard_named(sdk, client, name)
462
475
  raise EnvironmentsError(
463
476
  BUILD_FAILED,
464
477
  f"The Daytona build failed: {error}",
@@ -469,6 +482,17 @@ class Builder(ManagedBuilder):
469
482
  # not control, whether the build above succeeded or not (D-18).
470
483
  self._unregister_base_pull(client, registry_id)
471
484
 
485
+ if request.build_uid in self._cancelled:
486
+ # Finished after the build was cancelled: nothing will record it,
487
+ # so it goes now rather than wait in the account for nobody.
488
+ self._log(f"The build was cancelled: deleting the snapshot {snapshot.id} it made")
489
+ with contextlib.suppress(EnvironmentsError):
490
+ self._delete_by_id(sdk, client, snapshot.id)
491
+ raise EnvironmentsError(
492
+ BUILD_FAILED,
493
+ "The build was cancelled, and the snapshot it made was deleted",
494
+ detail={"variant": self.variant, "name": name},
495
+ )
472
496
  return ArtifactReference(
473
497
  variant=self.variant,
474
498
  immutable_reference=snapshot.id,
@@ -635,8 +659,11 @@ class Builder(ManagedBuilder):
635
659
  a later build's snapshot that inherited it.
636
660
  """
637
661
  sdk = self._daytona_sdk()
638
- client = self._client(sdk)
639
- snapshot = artifact.provider_artifact_id or artifact.immutable_reference
662
+ self._delete_by_id(
663
+ sdk, self._client(sdk), artifact.provider_artifact_id or artifact.immutable_reference
664
+ )
665
+
666
+ def _delete_by_id(self, sdk: Any, client: Any, snapshot: str) -> None:
640
667
  try:
641
668
  client.snapshot.delete(snapshot)
642
669
  except sdk.DaytonaNotFoundError:
@@ -646,6 +673,38 @@ class Builder(ManagedBuilder):
646
673
  raise self._provider_error("delete the snapshot", error) from error
647
674
  self._log(f"Deleted the Daytona snapshot {snapshot}")
648
675
 
676
+ def cancel(self, request: BuildRequest) -> None:
677
+ """Stop a build: delete the snapshot it is making, now or once it is made (E2-18).
678
+
679
+ The build step calls this when the build is cancelled, and then lets
680
+ the build's own thread finish unheard, so a snapshot Daytona goes on
681
+ building is recorded by nobody. It is found by the name this build
682
+ gave it, which is unique to the build (the build uid is in it), and
683
+ deleted by its id. One not made yet is deleted by `build` itself, the
684
+ moment Daytona hands it back.
685
+ """
686
+ self._cancelled.add(request.build_uid)
687
+ sdk = self._daytona_sdk()
688
+ client = self._client(sdk)
689
+ self._discard_named(sdk, client, _snapshot_name(request))
690
+
691
+ def _discard_named(self, sdk: Any, client: Any, name: str) -> None:
692
+ """Delete, by its id, the snapshot this build named, when Daytona has one.
693
+
694
+ A build's name is its own (the build uid is in it), so looking it up
695
+ by name cannot find another build's. Never a second reason to fail:
696
+ what could not be deleted is said in the log.
697
+ """
698
+ try:
699
+ snapshot = client.snapshot.get(name)
700
+ except Exception:
701
+ return
702
+ self._log(f"Deleting the snapshot {snapshot.id} this build made, which nothing records")
703
+ try:
704
+ self._delete_by_id(sdk, client, snapshot.id)
705
+ except EnvironmentsError as error:
706
+ self._log(f"The snapshot {snapshot.id} could not be deleted: {error.message}")
707
+
649
708
  def smoke_test(
650
709
  self,
651
710
  artifact: ArtifactReference,
@@ -143,10 +143,13 @@ APPROVED_BASES: dict[str, ApprovedBase] = {
143
143
  },
144
144
  snapshots={"2026.09": "20260916T120000Z"},
145
145
  ),
146
- # E2-17: jupyter-python-cuda:0.3.1 (jupyter-python 0.2.2 and the CUDA
147
- # 12.8 toolkit, pinned) plus the same layer, released 2026-09-18 to
148
- # environments/base/python-cuda as `2026.09-bceb272088e4`. The doctor
149
- # passes all fifteen checks and `nvcc` answers 12.8 without a GPU.
146
+ # E2-17: jupyter-python-cuda:0.3.2 (jupyter-python 0.2.2 and CUDA 12.8's
147
+ # compiler and runtime headers, pinned) plus the same layer, released
148
+ # 2026-09-18 to environments/base/python-cuda as `2026.09-a3baa7b80931`.
149
+ # 6.9 GB: the first release carried the whole toolkit (15.7 GB), and a
150
+ # PyTorch environment on it made a snapshot Daytona refused, over its
151
+ # 20 GB limit. The doctor passes all fifteen checks and `nvcc` answers
152
+ # 12.8 without a GPU.
150
153
  ApprovedBase(
151
154
  ref="datalayer/python-cuda",
152
155
  python_versions=("3.13",),
@@ -155,7 +158,7 @@ APPROVED_BASES: dict[str, ApprovedBase] = {
155
158
  channels={
156
159
  "2026.09": dict.fromkeys(
157
160
  ("datalayer", "e2b", "daytona", "modal"),
158
- "sha256:a6374a2d4ff07c8a8fe0a71ee605964f93319894cc4152c4e2a1af6258ac9e6a",
161
+ "sha256:dc8f0015b4f7dbca92a88d2d6a4a96714b76f9a1af9dddd86835812493e40f08",
159
162
  )
160
163
  },
161
164
  # After its CUDA layer's own `apt-get update`, which ran that day.
@@ -32,7 +32,7 @@ def test_the_2026_09_channel_of_python_cuda_resolves_the_digest_its_release_push
32
32
  carrying the CUDA 12.8 toolkit a spec's `accelerator.cuda` may ask for."""
33
33
  base = APPROVED_BASES["datalayer/python-cuda"]
34
34
  assert resolve_base(base.ref, "2026.09", variant) == (
35
- "sha256:a6374a2d4ff07c8a8fe0a71ee605964f93319894cc4152c4e2a1af6258ac9e6a"
35
+ "sha256:dc8f0015b4f7dbca92a88d2d6a4a96714b76f9a1af9dddd86835812493e40f08"
36
36
  )
37
37
  assert (base.accelerator, base.cuda) == (True, "12.8")
38
38
 
@@ -912,6 +912,69 @@ class TestReadingTheRegistry:
912
912
  assert len(daytona.daytona_calls) == 1
913
913
 
914
914
 
915
+ class TestCancellingABuild:
916
+ """E2-18: the build step lets a cancelled build's thread finish unheard, so
917
+ a snapshot Daytona goes on building would be recorded by nobody. Found by
918
+ E2-14's drill on 2026-09-18: `dl-backfill-drill-v2-…` kept building after
919
+ its build was cancelled."""
920
+
921
+ NAME = "dl-geospatial-analysis-v3-bld-1"
922
+
923
+ def test_a_snapshot_being_made_is_deleted_by_id(self) -> None:
924
+ service = FakeSnapshotService(
925
+ get_results={
926
+ self.NAME: FakeSnapshot(id="snp-9", name=self.NAME),
927
+ "snp-9": FakeSnapshot(id="snp-9", name=self.NAME),
928
+ }
929
+ )
930
+ builder = a_builder(
931
+ daytona=FakeDaytonaModule(client=FakeDaytonaClient(snapshot_service=service))
932
+ )
933
+ builder.cancel(a_request())
934
+ assert [call.args for call in service.get_calls] == [(self.NAME,)]
935
+ assert [call.args for call in service.delete_calls] == [("snp-9",)]
936
+
937
+ def test_one_made_after_the_cancel_is_deleted_by_the_build(self) -> None:
938
+ """Not made yet when the cancel came: the build deletes it the moment
939
+ Daytona hands it back, and does not answer with it."""
940
+ made = FakeSnapshot(id="snp-late", name=self.NAME)
941
+ service = FakeSnapshotService(create_result=made, get_results={"snp-late": made})
942
+ builder = a_builder(
943
+ daytona=FakeDaytonaModule(client=FakeDaytonaClient(snapshot_service=service))
944
+ )
945
+ builder.cancel(a_request())
946
+ assert service.delete_calls == []
947
+ with pytest.raises(EnvironmentsError) as raised:
948
+ builder.build(a_request())
949
+ assert raised.value.code.code == BUILD_FAILED.code
950
+ assert "cancelled" in raised.value.message
951
+ assert [call.args for call in service.delete_calls] == [("snp-late",)]
952
+
953
+ def test_a_snapshot_daytona_refused_is_deleted_by_the_build(self) -> None:
954
+ """Daytona keeps a failed snapshot, in `error`, under the build's name:
955
+ one over its 20 GB limit was left there (E2-17, 2026-09-18)."""
956
+ failed = FakeSnapshot(id="snp-err", name=self.NAME, state="error")
957
+ service = FakeSnapshotService(
958
+ create_error=RuntimeError(
959
+ "Snapshot size (28.66GB) exceeds maximum allowed size of 20GB"
960
+ ),
961
+ get_results={self.NAME: failed, "snp-err": failed},
962
+ )
963
+ builder = a_builder(
964
+ daytona=FakeDaytonaModule(client=FakeDaytonaClient(snapshot_service=service))
965
+ )
966
+ with pytest.raises(EnvironmentsError) as raised:
967
+ builder.build(a_request())
968
+ assert raised.value.code.code == BUILD_FAILED.code
969
+ assert "20GB" in raised.value.message
970
+ assert [call.args for call in service.delete_calls] == [("snp-err",)]
971
+
972
+ def test_another_build_of_the_same_builder_is_not_touched(self) -> None:
973
+ builder = a_builder()
974
+ builder.cancel(a_request(build_uid="bld-other"))
975
+ assert builder.build(a_request()).provider_artifact_id
976
+
977
+
915
978
  class TestDeletingASnapshot:
916
979
  """E2-18: retention and a failed build both need a snapshot to go."""
917
980
 
File without changes