code-sandboxes 1.9.8__tar.gz → 1.9.10__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 (262) hide show
  1. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/CHANGELOG.md +25 -0
  2. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/PKG-INFO +1 -1
  3. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/__version__.py +1 -1
  4. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/attest.py +30 -1
  5. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_attest.py +38 -2
  6. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.github/workflows/build.yml +0 -0
  7. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.github/workflows/environments-live.yml +0 -0
  8. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.github/workflows/py-code-style.yml +0 -0
  9. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.github/workflows/py-tests.yml +0 -0
  10. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.github/workflows/py-typing.yml +0 -0
  11. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.github/workflows/reusable-python.yml +0 -0
  12. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.gitignore +0 -0
  13. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.licenserc.yaml +0 -0
  14. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.pre-commit-config.yaml +0 -0
  15. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/.vscode/settings.json +0 -0
  16. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/Dockerfile +0 -0
  17. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/LICENSE +0 -0
  18. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/Makefile +0 -0
  19. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/README.md +0 -0
  20. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/build.log +0 -0
  21. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/__init__.py +0 -0
  22. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/base.py +0 -0
  23. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/bridge_mount.py +0 -0
  24. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/builds.py +0 -0
  25. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/cli.py +0 -0
  26. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/client.py +0 -0
  27. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/cloudflare_sandbox.py +0 -0
  28. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/commands.py +0 -0
  29. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/console.py +0 -0
  30. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/contents.py +0 -0
  31. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/coreweave_sandbox.py +0 -0
  32. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/datalayer_sandbox.py +0 -0
  33. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/daytona_sandbox.py +0 -0
  34. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/docker_sandbox.py +0 -0
  35. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/e2b_sandbox.py +0 -0
  36. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/__init__.py +0 -0
  37. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/__main__.py +0 -0
  38. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/accounts.py +0 -0
  39. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/adapters/__init__.py +0 -0
  40. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/adapters/datalayer.py +0 -0
  41. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/adapters/daytona.py +0 -0
  42. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/adapters/e2b.py +0 -0
  43. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/adapters/managed.py +0 -0
  44. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/adapters/modal.py +0 -0
  45. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/bases.py +0 -0
  46. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/breaker.py +0 -0
  47. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/build_secrets.py +0 -0
  48. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/builders.py +0 -0
  49. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/canonical.py +0 -0
  50. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/conformance.py +0 -0
  51. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/constraints/sandbox-contract-v1.txt +0 -0
  52. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/constraints/wheelhouse/README.md +0 -0
  53. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/constraints/wheelhouse/jupyter_server-2.21.0+datalayer.1-py3-none-any.whl +0 -0
  54. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/contract.py +0 -0
  55. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/doctor/__init__.py +0 -0
  56. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/doctor/build.py +0 -0
  57. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/doctor/datalayer_sandbox.py +0 -0
  58. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/doctor/report.schema.json +0 -0
  59. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/errors.py +0 -0
  60. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/files.py +0 -0
  61. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/image_import.py +0 -0
  62. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/lifecycle.py +0 -0
  63. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/policy.py +0 -0
  64. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/redact.py +0 -0
  65. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/resolve.py +0 -0
  66. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/schema.py +0 -0
  67. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/environments/spec.py +0 -0
  68. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/eval_sandbox.py +0 -0
  69. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/exceptions.py +0 -0
  70. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/filesystem.py +0 -0
  71. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/google_colab.py +0 -0
  72. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/google_colab_sandbox.py +0 -0
  73. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/interfaces.py +0 -0
  74. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/jupyter_ingress.py +0 -0
  75. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/jupyter_server_sandbox.py +0 -0
  76. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/kaggle.py +0 -0
  77. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/kaggle_execute.py +0 -0
  78. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/kaggle_live.py +0 -0
  79. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/kaggle_sandbox.py +0 -0
  80. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/lifecycle.py +0 -0
  81. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/manage.py +0 -0
  82. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/modal_sandbox.py +0 -0
  83. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/models.py +0 -0
  84. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/monty_sandbox.py +0 -0
  85. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/provider_ingress.py +0 -0
  86. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/code_sandboxes/providers.py +0 -0
  87. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docker/Dockerfile +0 -0
  88. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/.gitignore +0 -0
  89. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/LICENSE +0 -0
  90. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/Makefile +0 -0
  91. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/README.md +0 -0
  92. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/babel.config.js +0 -0
  93. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/api-reference/_category_.yml +0 -0
  94. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/api-reference/index.mdx +0 -0
  95. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/cli/_category_.yml +0 -0
  96. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/cli/index.mdx +0 -0
  97. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/contribute/_category_.yml +0 -0
  98. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/contribute/index.mdx +0 -0
  99. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/environments/_category_.yml +0 -0
  100. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/environments/contract.mdx +0 -0
  101. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/environments/index.mdx +0 -0
  102. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/environments/specification.mdx +0 -0
  103. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/environments/spike-2026-09.mdx +0 -0
  104. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/examples/_category_.yml +0 -0
  105. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/examples/index.mdx +0 -0
  106. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/guide/_category_.yml +0 -0
  107. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/guide/index.mdx +0 -0
  108. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/index.mdx +0 -0
  109. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/install/_category_.yml +0 -0
  110. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/install/index.mdx +0 -0
  111. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/provider-ingress.mdx +0 -0
  112. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/_category_.yml +0 -0
  113. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/cloudflare.mdx +0 -0
  114. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/coreweave.mdx +0 -0
  115. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/datalayer.mdx +0 -0
  116. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/daytona.mdx +0 -0
  117. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/docker.mdx +0 -0
  118. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/e2b.mdx +0 -0
  119. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/eval.mdx +0 -0
  120. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/google-colab.mdx +0 -0
  121. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/index.mdx +0 -0
  122. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/jupyter-server.mdx +0 -0
  123. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/kaggle.mdx +0 -0
  124. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/modal.mdx +0 -0
  125. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docs/providers/monty.mdx +0 -0
  126. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/docusaurus.config.js +0 -0
  127. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/package.json +0 -0
  128. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/sidebars.js +0 -0
  129. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/components/HomepageRow1.js +0 -0
  130. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/components/HomepageRow1.module.css +0 -0
  131. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/components/HomepageRow2.js +0 -0
  132. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/components/HomepageRow2.module.css +0 -0
  133. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/components/HomepageRow3.js +0 -0
  134. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/components/HomepageRow3.module.css +0 -0
  135. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/css/custom.css +0 -0
  136. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/pages/index.module.css +0 -0
  137. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/pages/markdown-page.md +0 -0
  138. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/theme/CustomDocItem.tsx +0 -0
  139. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/src/theme/IconsTitle.tsx +0 -0
  140. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/bricks.svg +0 -0
  141. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/building-construction.svg +0 -0
  142. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/cloud-sun.svg +0 -0
  143. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/cloud.svg +0 -0
  144. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/collaboration.svg +0 -0
  145. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/copy-left.svg +0 -0
  146. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/datalayer/logo.png +0 -0
  147. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/datalayer/logo.svg +0 -0
  148. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/datalayer/personas/business.svg +0 -0
  149. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/datalayer/personas/data-scientist.svg +0 -0
  150. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/datalayer/personas/devops.svg +0 -0
  151. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/datalayer/project/project-line.svg +0 -0
  152. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/favicon.ico +0 -0
  153. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/jupyter.svg +0 -0
  154. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/open-source.svg +0 -0
  155. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/react-js.svg +0 -0
  156. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/react-js2.svg +0 -0
  157. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/ringed-planet.svg +0 -0
  158. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/robot.svg +0 -0
  159. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/rocket.svg +0 -0
  160. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/shield.svg +0 -0
  161. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/sparkles.svg +0 -0
  162. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/streamlit.gif +0 -0
  163. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/super-hero.svg +0 -0
  164. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/target.svg +0 -0
  165. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/docs/static/img/thumbs-up.svg +0 -0
  166. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/README.md +0 -0
  167. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/Makefile +0 -0
  168. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/cloudflare_sandbox_example.py +0 -0
  169. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/coreweave_sandbox_example.py +0 -0
  170. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/datalayer_sandbox_example.py +0 -0
  171. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/daytona_sandbox_example.py +0 -0
  172. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/docker_sandbox_example.py +0 -0
  173. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/e2b_sandbox_example.py +0 -0
  174. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/eval_sandbox_example.py +0 -0
  175. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/google_colab_sandbox_example.py +0 -0
  176. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/jupyter_server_sandbox_example.py +0 -0
  177. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/kaggle_sandbox_example.py +0 -0
  178. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/modal_sandbox_example.py +0 -0
  179. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/exec/monty_sandbox_example.py +0 -0
  180. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/Makefile +0 -0
  181. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/cloudflare_sandbox_example.py +0 -0
  182. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/coreweave_sandbox_example.py +0 -0
  183. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/datalayer_sandbox_example.py +0 -0
  184. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/daytona_sandbox_example.py +0 -0
  185. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/docker_sandbox_example.py +0 -0
  186. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/e2b_sandbox_example.py +0 -0
  187. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/eval_sandbox_example.py +0 -0
  188. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/google_colab_sandbox_example.py +0 -0
  189. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/jupyter_server_sandbox_example.py +0 -0
  190. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/kaggle_sandbox_example.py +0 -0
  191. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/modal_sandbox_example.py +0 -0
  192. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/examples/repl/monty_sandbox_example.py +0 -0
  193. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/pyproject.toml +0 -0
  194. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/schemas/environment-v1alpha1.json +0 -0
  195. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/__init__.py +0 -0
  196. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/conftest.py +0 -0
  197. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_a_datalayer_sandbox_can_be_interrupted.py +0 -0
  198. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_bridge_mount.py +0 -0
  199. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_builds.py +0 -0
  200. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_cli_exec.py +0 -0
  201. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_cli_repl.py +0 -0
  202. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_client.py +0 -0
  203. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_client_contents.py +0 -0
  204. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_client_files.py +0 -0
  205. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_client_outcome_error_output.py +0 -0
  206. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_cloudflare.py +0 -0
  207. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_commands_envelope.py +0 -0
  208. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_console.py +0 -0
  209. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_contents_contract.py +0 -0
  210. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_contents_live_matrix.py +0 -0
  211. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_coreweave.py +0 -0
  212. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_datalayer_sandbox.py +0 -0
  213. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_daytona.py +0 -0
  214. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_e2b.py +0 -0
  215. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_accounts.py +0 -0
  216. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_bases.py +0 -0
  217. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_breaker.py +0 -0
  218. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_build_secrets.py +0 -0
  219. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_builders.py +0 -0
  220. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_canonical.py +0 -0
  221. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_conformance.py +0 -0
  222. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_constraints.py +0 -0
  223. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_contract.py +0 -0
  224. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_cross_variant_report.py +0 -0
  225. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_datalayer_builder.py +0 -0
  226. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_daytona_builder.py +0 -0
  227. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_doctor.py +0 -0
  228. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_e2b_builder.py +0 -0
  229. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_errors.py +0 -0
  230. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_image_import.py +0 -0
  231. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_lifecycle.py +0 -0
  232. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_live_matrix.py +0 -0
  233. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_managed_builders.py +0 -0
  234. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_modal_builder.py +0 -0
  235. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_redact.py +0 -0
  236. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_resolve.py +0 -0
  237. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_environment_spec.py +0 -0
  238. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_eval.py +0 -0
  239. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_every_variant_has_a_real_interrupt.py +0 -0
  240. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_factory.py +0 -0
  241. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_google_colab.py +0 -0
  242. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_integration.py +0 -0
  243. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_jupyter_ingress.py +0 -0
  244. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_jupyter_server.py +0 -0
  245. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_jupyter_server_streaming.py +0 -0
  246. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_kaggle.py +0 -0
  247. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_kaggle_execute.py +0 -0
  248. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_kaggle_live.py +0 -0
  249. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_kaggle_session.py +0 -0
  250. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_kernel_client_compatibility.py +0 -0
  251. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_lifecycle_vocabulary.py +0 -0
  252. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_manage.py +0 -0
  253. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_manage_datalayer.py +0 -0
  254. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_modal_google_colab_sandbox.py +0 -0
  255. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_modal_session.py +0 -0
  256. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_models.py +0 -0
  257. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_output_line_fidelity.py +0 -0
  258. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_provider_catalog_names.py +0 -0
  259. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_provider_ingress.py +0 -0
  260. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_providers.py +0 -0
  261. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_sandboxes.py +0 -0
  262. {code_sandboxes-1.9.8 → code_sandboxes-1.9.10}/tests/test_the_kill_relaunch_drill.py +0 -0
@@ -8,6 +8,31 @@
8
8
 
9
9
  ## Unreleased
10
10
 
11
+ ## 1.9.10
12
+
13
+ - **cosign signs the legacy tag again, not just an OCI referrer**
14
+ (`environments.attest`; PLAN_ENV.md E1-09). cosign 3.1.3 defaults to the
15
+ OCI 1.1 referrers API for a signature's own storage, not the classic
16
+ `sha256-<hex>.sig` sidecar tag. Found live on r1, 2026-09-14: `cosign
17
+ sign` reported success — the first artifact this pipeline ever actually
18
+ signed — but pushed no such tag; `_signature_exists`'s own replay check
19
+ and the `signature_ref` this workflow records both assume one exists.
20
+ `--registry-referrers-mode=legacy` restores it. `cosign verify` needs no
21
+ matching flag: it already looks for the tag by default.
22
+
23
+ ## 1.9.9
24
+
25
+ - **cosign gets the same registry credential the build pushed with**
26
+ (`environments.attest`; PLAN_ENV.md D-17, E1-09). cosign has no AWS
27
+ credential chain of its own for ECR, unlike the boto3 client the scan is
28
+ read with. Found live on r1, 2026-09-14: `cosign sign` reached the
29
+ repository anonymously and was refused, plain `401 Unauthorized`, on
30
+ every real artifact this pipeline ever tried to sign. `Attestor` takes a
31
+ `registry_auth` — the same `{"DOCKER_CONFIG": <dir>}` shape the resolver
32
+ and the builder already read off a `BuildCredential` — and sets it on
33
+ cosign's own subprocess, added to this process's own environment rather
34
+ than replacing it.
35
+
11
36
  ## 1.9.8
12
37
 
13
38
  - **Every page of a scan's findings is read before deciding**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code_sandboxes
3
- Version: 1.9.8
3
+ Version: 1.9.10
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.8"
6
+ __version__ = "1.9.10"
@@ -150,6 +150,15 @@ class Attestor:
150
150
  policy
151
151
  What the findings have to say. The owner's default unless an
152
152
  organization tightened it (E3-06).
153
+ registry_auth
154
+ What cosign reads the repository with, to sign it (D-17): the same
155
+ `{"DOCKER_CONFIG": <dir>}` shape the resolver and the builder already
156
+ take off a `BuildCredential`, the one attribute name every caller
157
+ reads regardless of what kind of credential it holds. cosign has no
158
+ AWS credential chain of its own for ECR, unlike the boto3 client the
159
+ scan is read with — found live, 2026-09-14: with none, `cosign sign`
160
+ reached the registry anonymously and was refused, `401 Unauthorized`,
161
+ on every real artifact this pipeline ever tried to sign.
153
162
  """
154
163
 
155
164
  def __init__(
@@ -166,6 +175,7 @@ class Attestor:
166
175
  scan_timeout_seconds: float = DEFAULT_SCAN_TIMEOUT_SECONDS,
167
176
  scan_interval_seconds: float = DEFAULT_SCAN_INTERVAL_SECONDS,
168
177
  log: Callable[[str], None] | None = None,
178
+ registry_auth: Mapping[str, str] | None = None,
169
179
  ) -> None:
170
180
  self._ecr = ecr
171
181
  self._cosign = (shutil.which("cosign") or "") if cosign is None else cosign
@@ -178,6 +188,7 @@ class Attestor:
178
188
  self._timeout = scan_timeout_seconds
179
189
  self._interval = scan_interval_seconds
180
190
  self._log = log or (lambda _line: None)
191
+ self._registry_auth = dict(registry_auth or {})
181
192
 
182
193
  # -- the scan -------------------------------------------------------------
183
194
 
@@ -429,6 +440,13 @@ class Attestor:
429
440
  # `--tlog-upload=false` already asks for, and needs no network
430
441
  # call of its own to fetch one.
431
442
  "--use-signing-config=false",
443
+ # cosign 3.1.3 defaults to the OCI 1.1 referrers API instead of
444
+ # the classic `sha256-<hex>.sig` sidecar tag — found live,
445
+ # 2026-09-14: `cosign sign` reported success, but no such tag
446
+ # ever existed, so `_signature_exists`'s own replay check (below)
447
+ # never found it and `signature_ref` named a tag nothing could
448
+ # pull. `legacy` restores the tag both of those already assume.
449
+ "--registry-referrers-mode=legacy",
432
450
  "--key",
433
451
  self._key,
434
452
  reference,
@@ -459,9 +477,19 @@ class Attestor:
459
477
  return bool(answer.get("imageDetails"))
460
478
 
461
479
  def _invoke(self, command: Sequence[str]) -> subprocess.CompletedProcess[str]:
480
+ # `registry_auth` — same shape as the resolver's own — puts cosign's
481
+ # `DOCKER_CONFIG` beside the rest of this process's environment,
482
+ # never replacing it: `--key` alone still needs AWS's own chain to
483
+ # reach the KMS key, which this does not touch.
484
+ env = {**os.environ, **self._registry_auth} if self._registry_auth else None
462
485
  try:
463
486
  finished = self._run(
464
- list(command), capture_output=True, text=True, check=False, timeout=self._timeout
487
+ list(command),
488
+ capture_output=True,
489
+ text=True,
490
+ check=False,
491
+ timeout=self._timeout,
492
+ env=env,
465
493
  )
466
494
  except subprocess.TimeoutExpired as expired:
467
495
  raise EnvironmentsError(
@@ -552,6 +580,7 @@ def attest_artifact(
552
580
  key=str(getattr(credential, "signing_key", "") or ""),
553
581
  policy=policy,
554
582
  log=log,
583
+ registry_auth=getattr(credential, "registry_auth", None),
555
584
  )
556
585
  return use.attest(
557
586
  registry=registry,
@@ -168,14 +168,16 @@ class FakeEcr:
168
168
 
169
169
 
170
170
  class Cosign:
171
- """A cosign whose argv is read, and which can refuse."""
171
+ """A cosign whose argv and env are read, and which can refuse."""
172
172
 
173
173
  def __init__(self, returncode: int = 0) -> None:
174
174
  self.returncode = returncode
175
175
  self.argv: list[str] = []
176
+ self.env: dict[str, str] | None = None
176
177
 
177
- def __call__(self, argv, **_kwargs) -> subprocess.CompletedProcess[str]:
178
+ def __call__(self, argv, *, env=None, **_kwargs) -> subprocess.CompletedProcess[str]:
178
179
  self.argv = list(argv)
180
+ self.env = env
179
181
  return subprocess.CompletedProcess(self.argv, self.returncode, "", "Pushing signature\n")
180
182
 
181
183
 
@@ -464,6 +466,11 @@ class TestTheSignature:
464
466
  # `--tlog-upload=false` alone can no longer override (found live
465
467
  # 2026-09-14): turned off so the plain flag is honored again.
466
468
  "--use-signing-config=false",
469
+ # cosign 3.1.3 defaults to the OCI 1.1 referrers API rather than
470
+ # the classic sidecar tag: found live 2026-09-14, `cosign sign`
471
+ # reported success but pushed no tag `_signature_exists` or
472
+ # `signature_ref` could ever find. `legacy` restores it.
473
+ "--registry-referrers-mode=legacy",
467
474
  "--key",
468
475
  KEY,
469
476
  f"{REGISTRY}/{REPOSITORY}@{DIGEST}",
@@ -471,6 +478,35 @@ class TestTheSignature:
471
478
  assert reference == f"{REGISTRY}/{REPOSITORY}:{signature_tag(DIGEST)}"
472
479
  assert signed_now is True
473
480
 
481
+ def test_no_registry_auth_leaves_cosigns_own_environment_untouched(self) -> None:
482
+ """The common case — nothing to add — inherits this process's own
483
+ environment rather than replacing it with an empty one."""
484
+ cosign = Cosign()
485
+ an_attestor(run=cosign).sign(registry=REGISTRY, repository=REPOSITORY, digest=DIGEST)
486
+ assert cosign.env is None
487
+
488
+ def test_registry_auth_reaches_cosign_as_docker_config(self) -> None:
489
+ """cosign has no AWS credential chain of its own for ECR, unlike the
490
+ boto3 client the scan is read with: found live, 2026-09-14, `cosign
491
+ sign` reached the registry anonymously and was refused with a plain
492
+ `401 Unauthorized` on every real artifact this pipeline tried to
493
+ sign. The same `{"DOCKER_CONFIG": <dir>}` the resolver and the
494
+ builder already take off a `BuildCredential` fixes it here too."""
495
+ docker_config = "/tmp/dl-docker-abc" # noqa: S108 - a build's own dir, never touched by this test
496
+ cosign = Cosign()
497
+ an_attestor(run=cosign, registry_auth={"DOCKER_CONFIG": docker_config}).sign(
498
+ registry=REGISTRY, repository=REPOSITORY, digest=DIGEST
499
+ )
500
+ assert cosign.env is not None
501
+ assert cosign.env["DOCKER_CONFIG"] == docker_config
502
+ # Added to this process's own environment, not instead of it — cosign
503
+ # still needs AWS's own chain to reach the KMS key with `--key`.
504
+ import os
505
+
506
+ for name in ("PATH", "HOME"):
507
+ if name in os.environ:
508
+ assert cosign.env[name] == os.environ[name]
509
+
474
510
  def test_a_replay_finds_the_signature_instead_of_pushing_a_second(self) -> None:
475
511
  """Immutable tags would refuse the second, and two signatures are two words."""
476
512
  ecr = FakeEcr(signed={signature_tag(DIGEST)})
File without changes
File without changes