code-sandboxes 1.4.6__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.
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/CHANGELOG.md +42 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/Makefile +18 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/PKG-INFO +3 -1
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/__version__.py +1 -1
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/base.py +20 -1
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/datalayer_sandbox.py +9 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/daytona_sandbox.py +30 -2
- code_sandboxes-1.8.0/code_sandboxes/environments/__init__.py +131 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/__main__.py +31 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/adapters/__init__.py +11 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/adapters/datalayer.py +618 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/attest.py +444 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/bases.py +194 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/builders.py +341 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/canonical.py +121 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/conformance.py +655 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/constraints/sandbox-contract-v1.txt +27 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/contract.py +559 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/doctor/__init__.py +13 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/doctor/build.py +47 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/doctor/datalayer_sandbox.py +441 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/doctor/report.schema.json +112 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/errors.py +316 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/files.py +73 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/lifecycle.py +237 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/policy.py +281 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/redact.py +424 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/resolve.py +908 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/schema.py +68 -0
- code_sandboxes-1.8.0/code_sandboxes/environments/spec.py +598 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/jupyter_server_sandbox.py +11 -5
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/manage.py +43 -6
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/modal_sandbox.py +9 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/models.py +8 -1
- code_sandboxes-1.8.0/docs/docs/environments/_category_.yml +2 -0
- code_sandboxes-1.8.0/docs/docs/environments/contract.mdx +57 -0
- code_sandboxes-1.8.0/docs/docs/environments/index.mdx +167 -0
- code_sandboxes-1.8.0/docs/docs/environments/specification.mdx +53 -0
- code_sandboxes-1.8.0/docs/docs/environments/spike-2026-09.mdx +114 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/pyproject.toml +13 -0
- code_sandboxes-1.8.0/schemas/environment-v1alpha1.json +497 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_contents_contract.py +7 -2
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_daytona.py +38 -0
- code_sandboxes-1.8.0/tests/test_environment_attest.py +404 -0
- code_sandboxes-1.8.0/tests/test_environment_bases.py +100 -0
- code_sandboxes-1.8.0/tests/test_environment_builders.py +367 -0
- code_sandboxes-1.8.0/tests/test_environment_canonical.py +121 -0
- code_sandboxes-1.8.0/tests/test_environment_conformance.py +357 -0
- code_sandboxes-1.8.0/tests/test_environment_constraints.py +64 -0
- code_sandboxes-1.8.0/tests/test_environment_contract.py +159 -0
- code_sandboxes-1.8.0/tests/test_environment_datalayer_builder.py +453 -0
- code_sandboxes-1.8.0/tests/test_environment_doctor.py +259 -0
- code_sandboxes-1.8.0/tests/test_environment_errors.py +184 -0
- code_sandboxes-1.8.0/tests/test_environment_lifecycle.py +170 -0
- code_sandboxes-1.8.0/tests/test_environment_redact.py +269 -0
- code_sandboxes-1.8.0/tests/test_environment_resolve.py +495 -0
- code_sandboxes-1.8.0/tests/test_environment_spec.py +345 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_jupyter_server.py +24 -0
- code_sandboxes-1.8.0/tests/test_manage_datalayer.py +102 -0
- code_sandboxes-1.8.0/tests/test_the_kill_relaunch_drill.py +131 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.github/workflows/build.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.github/workflows/py-code-style.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.github/workflows/py-tests.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.github/workflows/py-typing.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.github/workflows/reusable-python.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.gitignore +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.licenserc.yaml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.pre-commit-config.yaml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/.vscode/settings.json +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/Dockerfile +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/LICENSE +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/README.md +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/__init__.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/bridge_mount.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/builds.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/cli.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/client.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/cloudflare_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/commands.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/console.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/contents.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/coreweave_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/docker_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/e2b_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/eval_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/exceptions.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/filesystem.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/google_colab.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/google_colab_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/interfaces.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/jupyter_ingress.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/kaggle.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/kaggle_execute.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/kaggle_live.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/kaggle_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/lifecycle.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/monty_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/provider_ingress.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/code_sandboxes/providers.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docker/Dockerfile +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/.gitignore +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/LICENSE +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/Makefile +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/README.md +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/babel.config.js +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/api-reference/_category_.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/api-reference/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/cli/_category_.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/cli/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/contribute/_category_.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/contribute/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/examples/_category_.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/examples/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/guide/_category_.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/guide/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/install/_category_.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/install/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/provider-ingress.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/_category_.yml +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/cloudflare.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/coreweave.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/datalayer.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/daytona.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/docker.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/e2b.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/eval.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/google-colab.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/index.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/jupyter-server.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/kaggle.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/modal.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docs/providers/monty.mdx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/docusaurus.config.js +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/package.json +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/sidebars.js +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow1.js +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow1.module.css +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow2.js +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow2.module.css +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow3.js +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/components/HomepageRow3.module.css +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/css/custom.css +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/pages/index.module.css +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/pages/markdown-page.md +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/theme/CustomDocItem.tsx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/src/theme/IconsTitle.tsx +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/bricks.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/building-construction.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/cloud-sun.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/cloud.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/collaboration.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/copy-left.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/datalayer/logo.png +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/datalayer/logo.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/datalayer/personas/business.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/datalayer/personas/data-scientist.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/datalayer/personas/devops.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/datalayer/project/project-line.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/favicon.ico +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/jupyter.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/open-source.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/react-js.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/react-js2.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/ringed-planet.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/robot.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/rocket.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/shield.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/sparkles.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/streamlit.gif +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/super-hero.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/target.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/docs/static/img/thumbs-up.svg +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/README.md +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/Makefile +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/cloudflare_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/coreweave_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/datalayer_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/daytona_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/docker_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/e2b_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/eval_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/google_colab_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/jupyter_server_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/kaggle_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/modal_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/exec/monty_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/Makefile +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/cloudflare_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/coreweave_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/datalayer_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/daytona_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/docker_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/e2b_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/eval_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/google_colab_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/jupyter_server_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/kaggle_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/modal_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/examples/repl/monty_sandbox_example.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/__init__.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/conftest.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_a_datalayer_sandbox_can_be_interrupted.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_bridge_mount.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_builds.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_cli_exec.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_cli_repl.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_client.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_client_contents.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_client_files.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_client_outcome_error_output.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_cloudflare.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_commands_envelope.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_console.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_contents_live_matrix.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_coreweave.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_datalayer_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_e2b.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_eval.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_every_variant_has_a_real_interrupt.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_factory.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_google_colab.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_integration.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_jupyter_ingress.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_jupyter_server_streaming.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_kaggle.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_kaggle_execute.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_kaggle_live.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_kaggle_session.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_kernel_client_compatibility.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_lifecycle_vocabulary.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_manage.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_modal_google_colab_sandbox.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_modal_session.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_models.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_output_line_fidelity.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_provider_catalog_names.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_provider_ingress.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_providers.py +0 -0
- {code_sandboxes-1.4.6 → code_sandboxes-1.8.0}/tests/test_sandboxes.py +0 -0
|
@@ -8,6 +8,48 @@
|
|
|
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
|
+
|
|
35
|
+
## 1.7.0
|
|
36
|
+
|
|
37
|
+
- **A version is resolved into one lock** (`code_sandboxes.environments.resolve`,
|
|
38
|
+
PLAN_ENV.md E1-04, D-9). Datalayer's protected constraints are merged over the
|
|
39
|
+
user's requirements — a requirement that agrees with a pin is dropped for it,
|
|
40
|
+
one that contradicts it is `DL_ENV_PROTECTED_PACKAGE` with the supported range
|
|
41
|
+
— the base is resolved to a digest per requested variant, and uv's refusals
|
|
42
|
+
are read into the error taxonomy: a conflict with the pair that cannot hold, a
|
|
43
|
+
package no index has, a protected pin, and `DL_ENV_PROVIDER_ERROR`, which is
|
|
44
|
+
retryable, for a failure that is not about the version.
|
|
45
|
+
|
|
46
|
+
The lock is uv's hashed output with the apt pins and the protected pins above
|
|
47
|
+
it as comments: one document that says everything a build installs, and still
|
|
48
|
+
a requirements file. `BuildkitResolveRunner` is D-9's solve, `FROM` the
|
|
49
|
+
resolved base digest; `LocalResolveRunner` runs `uv` where it is called, for
|
|
50
|
+
`plane local`, and refuses to pin apt rather than lock another
|
|
51
|
+
distribution's versions.
|
|
52
|
+
|
|
11
53
|
- **Every variant has a real interrupt now, and can be reached to give it.**
|
|
12
54
|
`Sandbox.interrupt` is two gates — `_executing_event` must be set, then
|
|
13
55
|
`_do_interrupt` must answer — and seven variants failed one of them, each in
|
|
@@ -32,10 +32,28 @@ build:
|
|
|
32
32
|
test:
|
|
33
33
|
pytest -q
|
|
34
34
|
|
|
35
|
+
## Build the datalayer-sandbox doctor as a single-file zipapp.
|
|
36
|
+
doctor-zipapp:
|
|
37
|
+
python -m code_sandboxes.environments.doctor.build dist/datalayer-sandbox
|
|
38
|
+
|
|
39
|
+
## Regenerate the Environment JSON Schema and the sandbox contract page.
|
|
40
|
+
environments-generate:
|
|
41
|
+
python -m code_sandboxes.environments schema --write
|
|
42
|
+
python -m code_sandboxes.environments contract --markdown docs/docs/environments/contract.mdx
|
|
43
|
+
|
|
44
|
+
## Fail when the Environment JSON Schema or the sandbox contract page has drifted.
|
|
45
|
+
environments-check:
|
|
46
|
+
python -m code_sandboxes.environments schema --check
|
|
47
|
+
python -m code_sandboxes.environments contract --check docs/docs/environments/contract.mdx
|
|
48
|
+
|
|
35
49
|
## The Contents provider matrix against the real providers (skips those without credentials).
|
|
36
50
|
live-matrix:
|
|
37
51
|
CODE_SANDBOXES_LIVE=1 pytest -q -m live tests/test_contents_live_matrix.py
|
|
38
52
|
|
|
53
|
+
## Lose a sandbox on each live provider and check the harness says so.
|
|
54
|
+
kill-relaunch:
|
|
55
|
+
CODE_SANDBOXES_LIVE=1 pytest -q -m live tests/test_the_kill_relaunch_drill.py
|
|
56
|
+
|
|
39
57
|
clean: ## clean
|
|
40
58
|
git clean -fdx
|
|
41
59
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: code_sandboxes
|
|
3
|
-
Version: 1.
|
|
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'
|
|
@@ -499,6 +499,7 @@ class Sandbox(ABC):
|
|
|
499
499
|
timeout: float | None = None,
|
|
500
500
|
name: str | None = None,
|
|
501
501
|
environment: str | None = None,
|
|
502
|
+
environment_version: str | int | None = None,
|
|
502
503
|
gpu: str | None = None,
|
|
503
504
|
cpu: float | None = None,
|
|
504
505
|
memory: int | None = None,
|
|
@@ -507,6 +508,7 @@ class Sandbox(ABC):
|
|
|
507
508
|
allowed_hosts: list[str] | None = None,
|
|
508
509
|
tags: dict[str, str] | None = None,
|
|
509
510
|
examples: list[tuple[str, str]] | None = None,
|
|
511
|
+
artifact: Any = None,
|
|
510
512
|
**kwargs,
|
|
511
513
|
) -> Sandbox:
|
|
512
514
|
"""Factory method to create a sandbox of the specified variant.
|
|
@@ -525,7 +527,12 @@ class Sandbox(ABC):
|
|
|
525
527
|
config: Optional full configuration object (overrides individual params).
|
|
526
528
|
timeout: Default timeout for code execution in seconds.
|
|
527
529
|
name: Optional name for the sandbox.
|
|
528
|
-
environment: Runtime environment (e.g., "ai-agents-env")
|
|
530
|
+
environment: Runtime environment (e.g., "ai-agents-env"), or a user
|
|
531
|
+
environment as "<account-handle>/<name>" or by its uid.
|
|
532
|
+
environment_version: Which version of a user environment to launch:
|
|
533
|
+
its number, or a version uid. Without one the promoted version
|
|
534
|
+
launches, which is what a platform environment always does.
|
|
535
|
+
Only the datalayer variant has versions (PLAN_ENV.md, E1-19).
|
|
529
536
|
gpu: GPU type to use (e.g., "T4", "A100", "H100"). Only for datalayer.
|
|
530
537
|
cpu: CPU cores to allocate.
|
|
531
538
|
memory: Memory limit in MB.
|
|
@@ -559,6 +566,7 @@ class Sandbox(ABC):
|
|
|
559
566
|
config = SandboxConfig(
|
|
560
567
|
timeout=timeout or 30.0,
|
|
561
568
|
environment=environment or DEFAULT_ENVIRONMENT,
|
|
569
|
+
environment_version=environment_version,
|
|
562
570
|
memory_limit=memory * 1024 * 1024 if memory else None,
|
|
563
571
|
cpu_limit=cpu,
|
|
564
572
|
env_vars=env or {},
|
|
@@ -582,6 +590,17 @@ class Sandbox(ABC):
|
|
|
582
590
|
|
|
583
591
|
variant_value = normalize_variant(variant)
|
|
584
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
|
+
|
|
585
604
|
if variant_value == "eval":
|
|
586
605
|
sandbox = EvalSandbox(config=config, **kwargs)
|
|
587
606
|
elif variant_value == "docker":
|
|
@@ -475,11 +475,19 @@ class DatalayerSandbox(Sandbox):
|
|
|
475
475
|
# Build sandbox name
|
|
476
476
|
sandbox_name = self.config.name or f"sandbox-{self._sandbox_id[:8]}"
|
|
477
477
|
|
|
478
|
+
# Which VERSION of that environment, passed through as the
|
|
479
|
+
# environment is (PLAN_ENV.md, E1-19). `None` means the promoted
|
|
480
|
+
# version, which is what every platform environment launches — and
|
|
481
|
+
# what every sandbox launched before there were versions asked for.
|
|
482
|
+
# The GPU rewrite above is left exactly as it is until E4-11 (D-20).
|
|
483
|
+
environment_version = self.config.environment_version
|
|
484
|
+
|
|
478
485
|
# Create the runtime (optionally from snapshot)
|
|
479
486
|
if self._snapshot_name:
|
|
480
487
|
self._runtime = self._client.create_runtime(
|
|
481
488
|
name=sandbox_name,
|
|
482
489
|
environment=environment,
|
|
490
|
+
version=environment_version,
|
|
483
491
|
time_reservation=time_reservation,
|
|
484
492
|
snapshot_name=self._snapshot_name,
|
|
485
493
|
)
|
|
@@ -487,6 +495,7 @@ class DatalayerSandbox(Sandbox):
|
|
|
487
495
|
self._runtime = self._client.create_runtime(
|
|
488
496
|
name=sandbox_name,
|
|
489
497
|
environment=environment,
|
|
498
|
+
version=environment_version,
|
|
490
499
|
time_reservation=time_reservation,
|
|
491
500
|
)
|
|
492
501
|
|
|
@@ -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]:
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026 Datalayer, Inc.
|
|
2
|
+
#
|
|
3
|
+
# BSD 3-Clause License
|
|
4
|
+
|
|
5
|
+
"""Environments: define once, resolve once, build an immutable artifact per variant.
|
|
6
|
+
|
|
7
|
+
An **Environment** is the stable object a person names. An **Environment
|
|
8
|
+
Version** is immutable once it leaves draft: its spec, the lock resolved from
|
|
9
|
+
it, and its build outcome. An **Environment Artifact** is the build output of
|
|
10
|
+
one version on one variant — an OCI digest for Datalayer, a build id for E2B,
|
|
11
|
+
a snapshot id for Daytona, an image id for Modal.
|
|
12
|
+
|
|
13
|
+
This package holds what every party to that life shares, and nothing
|
|
14
|
+
provider-specific:
|
|
15
|
+
|
|
16
|
+
- :mod:`.spec` — the canonical specification and its rules;
|
|
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;
|
|
20
|
+
- :mod:`.contract` — ``sandbox-contract/v1`` and the Dockerfile validator;
|
|
21
|
+
- :mod:`.lifecycle` — the version states and their legal moves;
|
|
22
|
+
- :mod:`.errors` — the error taxonomy every provider error maps into;
|
|
23
|
+
- :mod:`.builders` — the builder interface and its neutral types;
|
|
24
|
+
- :mod:`.conformance` — the checks an artifact passes before it is ready;
|
|
25
|
+
- :mod:`.redact` — a build's log with its secrets taken out before it is stored;
|
|
26
|
+
- :mod:`.doctor` — the in-sandbox contract checker.
|
|
27
|
+
|
|
28
|
+
The builders themselves are in :mod:`.adapters`, loaded by variant.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
from .attest import Attestor, attest_artifact, signature_tag
|
|
34
|
+
from .bases import APPROVED_BASES, ApprovedBase
|
|
35
|
+
from .builders import (
|
|
36
|
+
ArtifactReference,
|
|
37
|
+
BuildRequest,
|
|
38
|
+
CapabilityReport,
|
|
39
|
+
CapabilitySet,
|
|
40
|
+
CheckResult,
|
|
41
|
+
EnvironmentBuilder,
|
|
42
|
+
ValidationResult,
|
|
43
|
+
get_builder,
|
|
44
|
+
)
|
|
45
|
+
from .canonical import canonical_digest, canonical_json
|
|
46
|
+
from .contract import (
|
|
47
|
+
CONTRACT_V1,
|
|
48
|
+
SANDBOX_CONTRACT_V1,
|
|
49
|
+
SUPPORTED_CONTRACTS,
|
|
50
|
+
SandboxContract,
|
|
51
|
+
check_dockerfile,
|
|
52
|
+
validate_dockerfile,
|
|
53
|
+
)
|
|
54
|
+
from .errors import ERROR_CODES, EnvironmentsError, ErrorCode, map_provider_error
|
|
55
|
+
from .lifecycle import VersionState, build_outcome, can_transition, transition
|
|
56
|
+
from .policy import DEFAULT_POLICY, PolicyDecision, ScanPolicy, decide, refuse_if_blocked
|
|
57
|
+
from .resolve import (
|
|
58
|
+
LOCK_FORMAT,
|
|
59
|
+
BuildkitResolveRunner,
|
|
60
|
+
LocalResolveRunner,
|
|
61
|
+
ResolveRunner,
|
|
62
|
+
locked_versions,
|
|
63
|
+
merge_requirements,
|
|
64
|
+
parse_resolver_failure,
|
|
65
|
+
protected_pins,
|
|
66
|
+
resolve_environment,
|
|
67
|
+
)
|
|
68
|
+
from .spec import (
|
|
69
|
+
API_VERSION,
|
|
70
|
+
VARIANTS,
|
|
71
|
+
Environment,
|
|
72
|
+
EnvironmentSpec,
|
|
73
|
+
parse_environment,
|
|
74
|
+
spec_digest,
|
|
75
|
+
spec_findings,
|
|
76
|
+
validate_environment,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
__all__ = [
|
|
80
|
+
"API_VERSION",
|
|
81
|
+
"APPROVED_BASES",
|
|
82
|
+
"CONTRACT_V1",
|
|
83
|
+
"DEFAULT_POLICY",
|
|
84
|
+
"ERROR_CODES",
|
|
85
|
+
"LOCK_FORMAT",
|
|
86
|
+
"SANDBOX_CONTRACT_V1",
|
|
87
|
+
"SUPPORTED_CONTRACTS",
|
|
88
|
+
"VARIANTS",
|
|
89
|
+
"ApprovedBase",
|
|
90
|
+
"ArtifactReference",
|
|
91
|
+
"Attestor",
|
|
92
|
+
"BuildRequest",
|
|
93
|
+
"BuildkitResolveRunner",
|
|
94
|
+
"CapabilityReport",
|
|
95
|
+
"CapabilitySet",
|
|
96
|
+
"CheckResult",
|
|
97
|
+
"Environment",
|
|
98
|
+
"EnvironmentBuilder",
|
|
99
|
+
"EnvironmentSpec",
|
|
100
|
+
"EnvironmentsError",
|
|
101
|
+
"ErrorCode",
|
|
102
|
+
"LocalResolveRunner",
|
|
103
|
+
"PolicyDecision",
|
|
104
|
+
"ResolveRunner",
|
|
105
|
+
"SandboxContract",
|
|
106
|
+
"ScanPolicy",
|
|
107
|
+
"ValidationResult",
|
|
108
|
+
"VersionState",
|
|
109
|
+
"attest_artifact",
|
|
110
|
+
"build_outcome",
|
|
111
|
+
"can_transition",
|
|
112
|
+
"canonical_digest",
|
|
113
|
+
"canonical_json",
|
|
114
|
+
"check_dockerfile",
|
|
115
|
+
"decide",
|
|
116
|
+
"get_builder",
|
|
117
|
+
"locked_versions",
|
|
118
|
+
"map_provider_error",
|
|
119
|
+
"merge_requirements",
|
|
120
|
+
"parse_environment",
|
|
121
|
+
"parse_resolver_failure",
|
|
122
|
+
"protected_pins",
|
|
123
|
+
"refuse_if_blocked",
|
|
124
|
+
"resolve_environment",
|
|
125
|
+
"signature_tag",
|
|
126
|
+
"spec_digest",
|
|
127
|
+
"spec_findings",
|
|
128
|
+
"transition",
|
|
129
|
+
"validate_dockerfile",
|
|
130
|
+
"validate_environment",
|
|
131
|
+
]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026 Datalayer, Inc.
|
|
2
|
+
#
|
|
3
|
+
# BSD 3-Clause License
|
|
4
|
+
|
|
5
|
+
"""Generate what is generated from the Environment models.
|
|
6
|
+
|
|
7
|
+
python -m code_sandboxes.environments schema --write [PATH]
|
|
8
|
+
python -m code_sandboxes.environments schema --check [PATH]
|
|
9
|
+
python -m code_sandboxes.environments contract --markdown docs/docs/environments/contract.mdx
|
|
10
|
+
python -m code_sandboxes.environments contract --check docs/docs/environments/contract.mdx
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import sys
|
|
16
|
+
|
|
17
|
+
from . import contract, schema
|
|
18
|
+
|
|
19
|
+
_COMMANDS = {"schema": schema.main, "contract": contract.main}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def main(argv: list[str] | None = None) -> int:
|
|
23
|
+
arguments = list(sys.argv[1:] if argv is None else argv)
|
|
24
|
+
if not arguments or arguments[0] not in _COMMANDS:
|
|
25
|
+
print(__doc__.strip(), file=sys.stderr) # noqa: T201 - a command's own output
|
|
26
|
+
return 2
|
|
27
|
+
return _COMMANDS[arguments[0]](arguments[1:])
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if __name__ == "__main__":
|
|
31
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Copyright (c) 2025-2026 Datalayer, Inc.
|
|
2
|
+
#
|
|
3
|
+
# BSD 3-Clause License
|
|
4
|
+
|
|
5
|
+
"""The provider-specific Environment builders, one module per variant.
|
|
6
|
+
|
|
7
|
+
Not neutral: each module speaks its provider's SDK. They are loaded only by
|
|
8
|
+
:func:`code_sandboxes.environments.builders.get_builder`, and only where the
|
|
9
|
+
build runs — the durable worker — never by a service that merely describes
|
|
10
|
+
or launches an Environment.
|
|
11
|
+
"""
|