code-sandboxes 1.7.0__tar.gz → 1.8.0__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 (240) hide show
  1. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/CHANGELOG.md +24 -0
  2. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/PKG-INFO +3 -1
  3. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/__version__.py +1 -1
  4. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/base.py +12 -0
  5. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/daytona_sandbox.py +30 -2
  6. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/__init__.py +14 -2
  7. code_sandboxes-1.8.0/code_sandboxes/environments/adapters/datalayer.py +618 -0
  8. code_sandboxes-1.8.0/code_sandboxes/environments/attest.py +444 -0
  9. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/builders.py +71 -2
  10. code_sandboxes-1.8.0/code_sandboxes/environments/policy.py +281 -0
  11. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/resolve.py +21 -0
  12. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/modal_sandbox.py +9 -0
  13. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/pyproject.toml +4 -0
  14. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_contents_contract.py +7 -2
  15. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_daytona.py +38 -0
  16. code_sandboxes-1.8.0/tests/test_environment_attest.py +404 -0
  17. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_builders.py +87 -1
  18. code_sandboxes-1.8.0/tests/test_environment_datalayer_builder.py +453 -0
  19. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.github/workflows/build.yml +0 -0
  20. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.github/workflows/py-code-style.yml +0 -0
  21. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.github/workflows/py-tests.yml +0 -0
  22. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.github/workflows/py-typing.yml +0 -0
  23. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.github/workflows/reusable-python.yml +0 -0
  24. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.gitignore +0 -0
  25. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.licenserc.yaml +0 -0
  26. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.pre-commit-config.yaml +0 -0
  27. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/.vscode/settings.json +0 -0
  28. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/Dockerfile +0 -0
  29. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/LICENSE +0 -0
  30. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/Makefile +0 -0
  31. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/README.md +0 -0
  32. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/__init__.py +0 -0
  33. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/bridge_mount.py +0 -0
  34. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/builds.py +0 -0
  35. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/cli.py +0 -0
  36. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/client.py +0 -0
  37. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/cloudflare_sandbox.py +0 -0
  38. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/commands.py +0 -0
  39. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/console.py +0 -0
  40. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/contents.py +0 -0
  41. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/coreweave_sandbox.py +0 -0
  42. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/datalayer_sandbox.py +0 -0
  43. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/docker_sandbox.py +0 -0
  44. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/e2b_sandbox.py +0 -0
  45. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/__main__.py +0 -0
  46. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/adapters/__init__.py +0 -0
  47. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/bases.py +0 -0
  48. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/canonical.py +0 -0
  49. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/conformance.py +0 -0
  50. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/constraints/sandbox-contract-v1.txt +0 -0
  51. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/contract.py +0 -0
  52. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/doctor/__init__.py +0 -0
  53. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/doctor/build.py +0 -0
  54. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/doctor/datalayer_sandbox.py +0 -0
  55. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/doctor/report.schema.json +0 -0
  56. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/errors.py +0 -0
  57. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/files.py +0 -0
  58. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/lifecycle.py +0 -0
  59. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/redact.py +0 -0
  60. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/schema.py +0 -0
  61. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/environments/spec.py +0 -0
  62. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/eval_sandbox.py +0 -0
  63. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/exceptions.py +0 -0
  64. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/filesystem.py +0 -0
  65. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/google_colab.py +0 -0
  66. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/google_colab_sandbox.py +0 -0
  67. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/interfaces.py +0 -0
  68. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/jupyter_ingress.py +0 -0
  69. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/jupyter_server_sandbox.py +0 -0
  70. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/kaggle.py +0 -0
  71. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/kaggle_execute.py +0 -0
  72. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/kaggle_live.py +0 -0
  73. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/kaggle_sandbox.py +0 -0
  74. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/lifecycle.py +0 -0
  75. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/manage.py +0 -0
  76. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/models.py +0 -0
  77. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/monty_sandbox.py +0 -0
  78. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/provider_ingress.py +0 -0
  79. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/code_sandboxes/providers.py +0 -0
  80. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docker/Dockerfile +0 -0
  81. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/.gitignore +0 -0
  82. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/LICENSE +0 -0
  83. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/Makefile +0 -0
  84. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/README.md +0 -0
  85. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/babel.config.js +0 -0
  86. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/api-reference/_category_.yml +0 -0
  87. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/api-reference/index.mdx +0 -0
  88. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/cli/_category_.yml +0 -0
  89. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/cli/index.mdx +0 -0
  90. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/contribute/_category_.yml +0 -0
  91. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/contribute/index.mdx +0 -0
  92. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/environments/_category_.yml +0 -0
  93. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/environments/contract.mdx +0 -0
  94. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/environments/index.mdx +0 -0
  95. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/environments/specification.mdx +0 -0
  96. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/environments/spike-2026-09.mdx +0 -0
  97. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/examples/_category_.yml +0 -0
  98. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/examples/index.mdx +0 -0
  99. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/guide/_category_.yml +0 -0
  100. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/guide/index.mdx +0 -0
  101. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/index.mdx +0 -0
  102. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/install/_category_.yml +0 -0
  103. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/install/index.mdx +0 -0
  104. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/provider-ingress.mdx +0 -0
  105. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/_category_.yml +0 -0
  106. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/cloudflare.mdx +0 -0
  107. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/coreweave.mdx +0 -0
  108. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/datalayer.mdx +0 -0
  109. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/daytona.mdx +0 -0
  110. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/docker.mdx +0 -0
  111. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/e2b.mdx +0 -0
  112. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/eval.mdx +0 -0
  113. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/google-colab.mdx +0 -0
  114. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/index.mdx +0 -0
  115. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/jupyter-server.mdx +0 -0
  116. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/kaggle.mdx +0 -0
  117. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/modal.mdx +0 -0
  118. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docs/providers/monty.mdx +0 -0
  119. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/docusaurus.config.js +0 -0
  120. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/package.json +0 -0
  121. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/sidebars.js +0 -0
  122. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow1.js +0 -0
  123. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow1.module.css +0 -0
  124. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow2.js +0 -0
  125. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow2.module.css +0 -0
  126. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow3.js +0 -0
  127. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow3.module.css +0 -0
  128. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/css/custom.css +0 -0
  129. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/pages/index.module.css +0 -0
  130. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/pages/markdown-page.md +0 -0
  131. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/theme/CustomDocItem.tsx +0 -0
  132. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/src/theme/IconsTitle.tsx +0 -0
  133. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/bricks.svg +0 -0
  134. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/building-construction.svg +0 -0
  135. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/cloud-sun.svg +0 -0
  136. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/cloud.svg +0 -0
  137. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/collaboration.svg +0 -0
  138. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/copy-left.svg +0 -0
  139. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/datalayer/logo.png +0 -0
  140. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/datalayer/logo.svg +0 -0
  141. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/datalayer/personas/business.svg +0 -0
  142. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/datalayer/personas/data-scientist.svg +0 -0
  143. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/datalayer/personas/devops.svg +0 -0
  144. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/datalayer/project/project-line.svg +0 -0
  145. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/favicon.ico +0 -0
  146. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/jupyter.svg +0 -0
  147. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/open-source.svg +0 -0
  148. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/react-js.svg +0 -0
  149. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/react-js2.svg +0 -0
  150. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/ringed-planet.svg +0 -0
  151. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/robot.svg +0 -0
  152. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/rocket.svg +0 -0
  153. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/shield.svg +0 -0
  154. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/sparkles.svg +0 -0
  155. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/streamlit.gif +0 -0
  156. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/super-hero.svg +0 -0
  157. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/target.svg +0 -0
  158. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/docs/static/img/thumbs-up.svg +0 -0
  159. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/README.md +0 -0
  160. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/Makefile +0 -0
  161. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/cloudflare_sandbox_example.py +0 -0
  162. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/coreweave_sandbox_example.py +0 -0
  163. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/datalayer_sandbox_example.py +0 -0
  164. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/daytona_sandbox_example.py +0 -0
  165. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/docker_sandbox_example.py +0 -0
  166. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/e2b_sandbox_example.py +0 -0
  167. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/eval_sandbox_example.py +0 -0
  168. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/google_colab_sandbox_example.py +0 -0
  169. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/jupyter_server_sandbox_example.py +0 -0
  170. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/kaggle_sandbox_example.py +0 -0
  171. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/modal_sandbox_example.py +0 -0
  172. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/exec/monty_sandbox_example.py +0 -0
  173. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/Makefile +0 -0
  174. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/cloudflare_sandbox_example.py +0 -0
  175. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/coreweave_sandbox_example.py +0 -0
  176. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/datalayer_sandbox_example.py +0 -0
  177. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/daytona_sandbox_example.py +0 -0
  178. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/docker_sandbox_example.py +0 -0
  179. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/e2b_sandbox_example.py +0 -0
  180. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/eval_sandbox_example.py +0 -0
  181. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/google_colab_sandbox_example.py +0 -0
  182. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/jupyter_server_sandbox_example.py +0 -0
  183. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/kaggle_sandbox_example.py +0 -0
  184. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/modal_sandbox_example.py +0 -0
  185. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/examples/repl/monty_sandbox_example.py +0 -0
  186. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/schemas/environment-v1alpha1.json +0 -0
  187. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/__init__.py +0 -0
  188. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/conftest.py +0 -0
  189. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_a_datalayer_sandbox_can_be_interrupted.py +0 -0
  190. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_bridge_mount.py +0 -0
  191. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_builds.py +0 -0
  192. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_cli_exec.py +0 -0
  193. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_cli_repl.py +0 -0
  194. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_client.py +0 -0
  195. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_client_contents.py +0 -0
  196. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_client_files.py +0 -0
  197. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_client_outcome_error_output.py +0 -0
  198. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_cloudflare.py +0 -0
  199. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_commands_envelope.py +0 -0
  200. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_console.py +0 -0
  201. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_contents_live_matrix.py +0 -0
  202. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_coreweave.py +0 -0
  203. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_datalayer_sandbox.py +0 -0
  204. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_e2b.py +0 -0
  205. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_bases.py +0 -0
  206. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_canonical.py +0 -0
  207. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_conformance.py +0 -0
  208. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_constraints.py +0 -0
  209. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_contract.py +0 -0
  210. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_doctor.py +0 -0
  211. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_errors.py +0 -0
  212. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_lifecycle.py +0 -0
  213. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_redact.py +0 -0
  214. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_resolve.py +0 -0
  215. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_environment_spec.py +0 -0
  216. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_eval.py +0 -0
  217. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_every_variant_has_a_real_interrupt.py +0 -0
  218. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_factory.py +0 -0
  219. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_google_colab.py +0 -0
  220. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_integration.py +0 -0
  221. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_jupyter_ingress.py +0 -0
  222. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_jupyter_server.py +0 -0
  223. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_jupyter_server_streaming.py +0 -0
  224. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_kaggle.py +0 -0
  225. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_kaggle_execute.py +0 -0
  226. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_kaggle_live.py +0 -0
  227. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_kaggle_session.py +0 -0
  228. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_kernel_client_compatibility.py +0 -0
  229. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_lifecycle_vocabulary.py +0 -0
  230. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_manage.py +0 -0
  231. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_manage_datalayer.py +0 -0
  232. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_modal_google_colab_sandbox.py +0 -0
  233. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_modal_session.py +0 -0
  234. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_models.py +0 -0
  235. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_output_line_fidelity.py +0 -0
  236. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_provider_catalog_names.py +0 -0
  237. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_provider_ingress.py +0 -0
  238. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_providers.py +0 -0
  239. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_sandboxes.py +0 -0
  240. {code_sandboxes-1.7.0 → code_sandboxes-1.8.0}/tests/test_the_kill_relaunch_drill.py +0 -0
@@ -8,6 +8,30 @@
8
8
 
9
9
  ## Unreleased
10
10
 
11
+ ## 1.8.0
12
+
13
+ - **The Datalayer builder** (`environments.adapters.datalayer`, PLAN_ENV.md
14
+ E1-07). The Dockerfile is generated from the lock — `uv pip sync
15
+ --require-hashes`, apt at the versions the lock recorded, `env` before
16
+ anything installs, `postInstall` as uid 1000 with no network — and the push
17
+ is by digest with an SBOM and provenance attestation, under the operability
18
+ tag `v<n>-<build_uid>` so a retried build cannot collide with the attempt
19
+ before it. `inspect`, `resolve`, `exists` and `delete` go through the ECR
20
+ API. Needs the `environments-builder` extra.
21
+ - **The scan and the signature** (`environments.policy`,
22
+ `environments.attest`, E1-08, E1-09). A critical finding with a fixed
23
+ version blocks and one nothing fixes is recorded; the decision record keeps
24
+ the threshold it was decided under, so what stopped a build reads a month
25
+ later. cosign signs only once the scan passed, and a replay finds the
26
+ signature rather than pushing a second.
27
+ - **A sandbox launches from an artifact** (E2-02): `Sandbox.create(artifact=…)`
28
+ hands each variant its own argument — an E2B template build, a Daytona
29
+ snapshot, a Modal image id through `Image.from_id`.
30
+ - **Fixed, and a live defect:** Daytona's adapter took the image branch
31
+ whenever resources were requested, so a snapshot asked for with `cpu=` came
32
+ up from a plain Debian image running none of the snapshot's content, with
33
+ nothing saying so. The combination is refused (correction 13).
34
+
11
35
  ## 1.7.0
12
36
 
13
37
  - **A version is resolved into one lock** (`code_sandboxes.environments.resolve`,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code_sandboxes
3
- Version: 1.7.0
3
+ Version: 1.8.0
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
@@ -73,6 +73,8 @@ Provides-Extra: docker
73
73
  Requires-Dist: docker>=6.0; extra == 'docker'
74
74
  Provides-Extra: e2b
75
75
  Requires-Dist: e2b-code-interpreter>=2.9.1; extra == 'e2b'
76
+ Provides-Extra: environments-builder
77
+ Requires-Dist: boto3>=1.34; extra == 'environments-builder'
76
78
  Provides-Extra: google-colab
77
79
  Provides-Extra: kaggle
78
80
  Requires-Dist: kaggle>=1.6; extra == 'kaggle'
@@ -3,4 +3,4 @@
3
3
 
4
4
  """Code Sandboxes."""
5
5
 
6
- __version__ = "1.7.0"
6
+ __version__ = "1.8.0"
@@ -508,6 +508,7 @@ class Sandbox(ABC):
508
508
  allowed_hosts: list[str] | None = None,
509
509
  tags: dict[str, str] | None = None,
510
510
  examples: list[tuple[str, str]] | None = None,
511
+ artifact: Any = None,
511
512
  **kwargs,
512
513
  ) -> Sandbox:
513
514
  """Factory method to create a sandbox of the specified variant.
@@ -589,6 +590,17 @@ class Sandbox(ABC):
589
590
 
590
591
  variant_value = normalize_variant(variant)
591
592
 
593
+ if artifact is not None:
594
+ # One neutral reference, translated into the argument its variant
595
+ # takes: a template build for E2B, a snapshot for Daytona, an
596
+ # image id for Modal (PLAN_ENV.md E2-02). A caller holding an
597
+ # Environment's artifact should not have to know which. What the
598
+ # caller passed itself wins, so naming both is not a surprise.
599
+ from .environments.builders import launch_arguments
600
+
601
+ for name_, value in launch_arguments(artifact).items():
602
+ kwargs.setdefault(name_, value)
603
+
592
604
  if variant_value == "eval":
593
605
  sandbox = EvalSandbox(config=config, **kwargs)
594
606
  elif variant_value == "docker":
@@ -510,8 +510,13 @@ class DaytonaSandbox(Sandbox):
510
510
  given = {key: value for key, value in settings.items() if value}
511
511
  return daytona.DaytonaConfig(**given) if given else None
512
512
 
513
- def _create_params(self, daytona: Any) -> Any:
514
- """What to ask Daytona for, from the configuration of this sandbox."""
513
+ def _create_params(self, daytona: Any) -> Any: # noqa: C901
514
+ """What to ask Daytona for, from the configuration of this sandbox.
515
+
516
+ Read top to bottom: what it refuses — a snapshot with resources, a
517
+ snapshot with an image — is the rule, and splitting the refusals
518
+ across helpers would hide them from the one place a reader looks.
519
+ """
515
520
  common: dict[str, Any] = {"labels": self._labels()}
516
521
  if self.config.env_vars:
517
522
  common["env_vars"] = dict(self.config.env_vars)
@@ -538,6 +543,27 @@ class DaytonaSandbox(Sandbox):
538
543
  common["auto_delete_interval"] = 0
539
544
  if self._spot:
540
545
  common.update(self._spot_params(resources))
546
+ if self._snapshot is not None:
547
+ # A snapshot carries the machine it was created for — Daytona bakes
548
+ # CPU, memory, disk and GPU into it, and it is region-scoped — so
549
+ # asking for resources beside one asks for two different machines.
550
+ # This used to take the image branch instead: the sandbox came up
551
+ # from a Debian image with the resources asked for, running none of
552
+ # the content the snapshot held, and nothing said so (PLAN_ENV.md
553
+ # correction 13, E2-02). A resource change is a new snapshot.
554
+ if resources is not None:
555
+ raise SandboxConfigurationError(
556
+ "A Daytona snapshot carries its own CPU, memory, disk and GPU, so "
557
+ "cpu=, memory= and gpu= cannot be passed with snapshot=: the sandbox "
558
+ "would have come up from a plain image instead, with none of the "
559
+ "snapshot's content. Create a snapshot for the machine you want, or "
560
+ "pass image= with the resources."
561
+ )
562
+ if self._image is not None:
563
+ raise SandboxConfigurationError(
564
+ "snapshot= and image= are two different things to start from; pass one. "
565
+ "A snapshot is what an Environment build records for this variant."
566
+ )
541
567
  if self._image is not None or resources is not None:
542
568
  image = self._image
543
569
  if image is None:
@@ -547,6 +573,8 @@ class DaytonaSandbox(Sandbox):
547
573
  else daytona.Image.debian_slim()
548
574
  )
549
575
  return daytona.CreateSandboxFromImageParams(image=image, resources=resources, **common)
576
+ # No snapshot named and nothing asked for: Daytona's own default, which
577
+ # is what `snapshot=None` means to it.
550
578
  return daytona.CreateSandboxFromSnapshotParams(snapshot=self._snapshot, **common)
551
579
 
552
580
  def _spot_params(self, resources: Any | None) -> dict[str, Any]:
@@ -15,6 +15,8 @@ provider-specific:
15
15
 
16
16
  - :mod:`.spec` — the canonical specification and its rules;
17
17
  - :mod:`.resolve` — the lock a version is resolved into, once (D-9);
18
+ - :mod:`.policy` — whether an artifact's scan lets it be used (D-11);
19
+ - :mod:`.attest` — the scan and the signature it needs before anything runs it;
18
20
  - :mod:`.contract` — ``sandbox-contract/v1`` and the Dockerfile validator;
19
21
  - :mod:`.lifecycle` — the version states and their legal moves;
20
22
  - :mod:`.errors` — the error taxonomy every provider error maps into;
@@ -28,6 +30,7 @@ The builders themselves are in :mod:`.adapters`, loaded by variant.
28
30
 
29
31
  from __future__ import annotations
30
32
 
33
+ from .attest import Attestor, attest_artifact, signature_tag
31
34
  from .bases import APPROVED_BASES, ApprovedBase
32
35
  from .builders import (
33
36
  ArtifactReference,
@@ -50,6 +53,7 @@ from .contract import (
50
53
  )
51
54
  from .errors import ERROR_CODES, EnvironmentsError, ErrorCode, map_provider_error
52
55
  from .lifecycle import VersionState, build_outcome, can_transition, transition
56
+ from .policy import DEFAULT_POLICY, PolicyDecision, ScanPolicy, decide, refuse_if_blocked
53
57
  from .resolve import (
54
58
  LOCK_FORMAT,
55
59
  BuildkitResolveRunner,
@@ -76,6 +80,7 @@ __all__ = [
76
80
  "API_VERSION",
77
81
  "APPROVED_BASES",
78
82
  "CONTRACT_V1",
83
+ "DEFAULT_POLICY",
79
84
  "ERROR_CODES",
80
85
  "LOCK_FORMAT",
81
86
  "SANDBOX_CONTRACT_V1",
@@ -83,8 +88,9 @@ __all__ = [
83
88
  "VARIANTS",
84
89
  "ApprovedBase",
85
90
  "ArtifactReference",
86
- "BuildkitResolveRunner",
91
+ "Attestor",
87
92
  "BuildRequest",
93
+ "BuildkitResolveRunner",
88
94
  "CapabilityReport",
89
95
  "CapabilitySet",
90
96
  "CheckResult",
@@ -94,23 +100,29 @@ __all__ = [
94
100
  "EnvironmentsError",
95
101
  "ErrorCode",
96
102
  "LocalResolveRunner",
103
+ "PolicyDecision",
97
104
  "ResolveRunner",
98
105
  "SandboxContract",
106
+ "ScanPolicy",
99
107
  "ValidationResult",
100
108
  "VersionState",
109
+ "attest_artifact",
101
110
  "build_outcome",
102
111
  "can_transition",
103
112
  "canonical_digest",
104
113
  "canonical_json",
105
114
  "check_dockerfile",
115
+ "decide",
106
116
  "get_builder",
107
117
  "locked_versions",
108
- "merge_requirements",
109
118
  "map_provider_error",
119
+ "merge_requirements",
110
120
  "parse_environment",
111
121
  "parse_resolver_failure",
112
122
  "protected_pins",
123
+ "refuse_if_blocked",
113
124
  "resolve_environment",
125
+ "signature_tag",
114
126
  "spec_digest",
115
127
  "spec_findings",
116
128
  "transition",