From 58a3c829311a0a43266d82757fc4300ea36879b3 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 15:19:17 -0800 Subject: [PATCH 01/12] refactor: build from src/ and run tests from tests/ Point packaging, ruff, pytest, and coverage at the new layout and write generated bindings to src/openshell/_proto. Exclude the bindings from ty explicitly, since they are about to be committed. Drop pyelftools, which only core's packaging tooling uses. Signed-off-by: Piotr Mlocek --- pyproject.toml | 19 +++++++++++-------- scripts/generate_python_proto.py | 10 +++++----- tests/generate_python_proto_test.py | 4 ++-- tests/wheel_verifier_test.py | 2 +- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 857a69b..b445434 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ classifiers = [ keywords = ["agent", "sandbox", "nvidia"] [project.urls] -source = "https://github.com/NVIDIA/OpenShell" +source = "https://github.com/ai-openshell/sdk-python" documentation = "https://docs.nvidia.com/openshell/latest/" [dependency-groups] @@ -51,7 +51,6 @@ dev = [ "ruff>=0.4", "ty>=0.0.94", "grpcio-tools>=1.60", - "pyelftools>=0.30", "pyyaml==6.0.2", "types-pyyaml>=6.0.12.20260518", "mypy-protobuf>=5.1", @@ -60,25 +59,29 @@ dev = [ ] [tool.setuptools] -package-dir = { "" = "python" } +package-dir = { "" = "src" } include-package-data = false [tool.setuptools.packages.find] -where = ["python"] +where = ["src"] include = ["openshell*"] namespaces = false [tool.setuptools.package-data] openshell = ["py.typed", "_proto/*.py", "_proto/*.pyi"] -# Ignore non-release tags such as sdk/go/vX.Y.Z, which share the release commit. [tool.setuptools_scm] git_describe_command = ["git", "describe", "--dirty", "--tags", "--long", "--match", "v[0-9]*"] [tool.ruff] target-version = "py311" line-length = 88 -exclude = ["python/openshell/_proto"] +exclude = ["src/openshell/_proto"] + +# The generated bindings are committed, so the tools no longer skip them as +# gitignored files. +[tool.ty.src] +exclude = ["src/openshell/_proto"] [tool.ruff.lint] select = [ @@ -109,7 +112,7 @@ skip-magic-trailing-comma = false line-ending = "auto" [tool.pytest.ini_options] -testpaths = ["python"] +testpaths = ["tests"] python_files = ["*_test.py"] python_functions = ["test_*"] addopts = "-v --tb=short" @@ -119,7 +122,7 @@ markers = [ ] [tool.coverage.run] -source = ["python"] +source = ["src"] branch = true [tool.coverage.report] diff --git a/scripts/generate_python_proto.py b/scripts/generate_python_proto.py index e0a1896..ead6c58 100644 --- a/scripts/generate_python_proto.py +++ b/scripts/generate_python_proto.py @@ -30,7 +30,7 @@ def main() -> None: ), ) args = parser.parse_args() - output_dir = Path("python/openshell/_proto") + output_dir = Path("src/openshell/_proto") subprocess.run( [ @@ -38,16 +38,16 @@ def main() -> None: "-m", "grpc_tools.protoc", "-Iproto", - "--python_out=python/openshell/_proto", + "--python_out=src/openshell/_proto", *( [] if args.no_pyi else [ - "--pyi_out=python/openshell/_proto", - "--mypy_grpc_out=generate_concrete_servicer_stubs:python/openshell/_proto", + "--pyi_out=src/openshell/_proto", + "--mypy_grpc_out=generate_concrete_servicer_stubs:src/openshell/_proto", ] ), - "--grpc_python_out=python/openshell/_proto", + "--grpc_python_out=src/openshell/_proto", *PROTO_FILES, ], check=True, diff --git a/tests/generate_python_proto_test.py b/tests/generate_python_proto_test.py index b242c37..5c4bfb0 100644 --- a/tests/generate_python_proto_test.py +++ b/tests/generate_python_proto_test.py @@ -16,11 +16,11 @@ def test_generate_package_relative_bindings(tmp_path: Path, no_pyi: bool) -> None: root = Path(__file__).resolve().parents[1] shutil.copytree(root / "proto", tmp_path / "proto") - output = tmp_path / "python/openshell/_proto" + output = tmp_path / "src/openshell/_proto" output.mkdir(parents=True) command = [ sys.executable, - str(root / "tasks/scripts/generate_python_proto.py"), + str(root / "scripts/generate_python_proto.py"), *(["--no-pyi"] if no_pyi else []), ] subprocess.run(command, cwd=tmp_path, check=True, capture_output=True, text=True) diff --git a/tests/wheel_verifier_test.py b/tests/wheel_verifier_test.py index 0ade8cd..d338463 100644 --- a/tests/wheel_verifier_test.py +++ b/tests/wheel_verifier_test.py @@ -12,7 +12,7 @@ def _load_verifier_module(): - path = Path(__file__).resolve().parents[1] / "tasks/scripts/verify-python-wheel.py" + path = Path(__file__).resolve().parents[1] / "scripts/verify-python-wheel.py" spec = importlib.util.spec_from_file_location("openshell_wheel_verifier", path) assert spec is not None assert spec.loader is not None From 6be1083dc9740376a01e24b52841ff10a4ab1205 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 15:19:17 -0800 Subject: [PATCH 02/12] test: vendor the OAuth conformance fixture sandbox_test.py read core's sdk/conformance/oauth-client-credentials.json through a path outside the package. Copy it to tests/fixtures. The conformance:check task added with the build tooling compares it with core at the pinned tag. Signed-off-by: Piotr Mlocek --- tests/fixtures/oauth-client-credentials.json | 44 +++++++++++++++++++ .../oauth-client-credentials.json.license | 2 + tests/sandbox_test.py | 4 +- 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 tests/fixtures/oauth-client-credentials.json create mode 100644 tests/fixtures/oauth-client-credentials.json.license diff --git a/tests/fixtures/oauth-client-credentials.json b/tests/fixtures/oauth-client-credentials.json new file mode 100644 index 0000000..f31d0fe --- /dev/null +++ b/tests/fixtures/oauth-client-credentials.json @@ -0,0 +1,44 @@ +{ + "request": { + "grant_type": "client_credentials", + "client_id": "service-client", + "client_secret": "conformance-secret", + "scopes": ["sandbox:read", "sandbox:write"], + "scope": "sandbox:read sandbox:write", + "audience": "openshell-gateway", + "forbidden_implicit_scopes": ["openid", "profile", "email"] + }, + "expiry": { + "leeway_seconds": 30, + "valid_expires_in": 120, + "invalid_expires_in": [0, -1, "NaN", null] + }, + "discovery": { + "configured_issuer": "https://issuer.example.com", + "matching_issuer": "https://issuer.example.com/", + "mismatched_issuer": "https://attacker.example.com", + "redirect_statuses": [301, 302, 307, 308] + }, + "limits": { + "max_response_bytes": 1048576 + }, + "urls": { + "allowed": [ + "https://issuer.example.com", + "http://localhost:8080", + "http://127.0.0.1:8080", + "http://127.42.0.1:8080", + "http://[::1]:8080" + ], + "rejected": [ + "http://issuer.example.com", + "https://user@issuer.example.com", + "https://issuer.example.com/#fragment" + ] + }, + "redaction": { + "secret": "conformance-secret", + "supplier_error": "supplier-sensitive-detail", + "provider_body": "provider-sensitive-detail" + } +} diff --git a/tests/fixtures/oauth-client-credentials.json.license b/tests/fixtures/oauth-client-credentials.json.license new file mode 100644 index 0000000..817df24 --- /dev/null +++ b/tests/fixtures/oauth-client-credentials.json.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 diff --git a/tests/sandbox_test.py b/tests/sandbox_test.py index 3fed317..d4537d2 100644 --- a/tests/sandbox_test.py +++ b/tests/sandbox_test.py @@ -76,9 +76,7 @@ def _request_sandbox(request: Any) -> str: def _client_credentials_fixture() -> dict[str, Any]: return json.loads( - ( - Path(__file__).parents[2] / "sdk/conformance/oauth-client-credentials.json" - ).read_text() + (Path(__file__).parent / "fixtures/oauth-client-credentials.json").read_text() ) From 614f4b5651788def81a1c2baaead258421ca299f Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 15:19:17 -0800 Subject: [PATCH 03/12] build: pin core at v0.1.7 and add standalone mise tasks scripts/fetch-core.sh fetches only the pinned NVIDIA/OpenShell ref. OPENSHELL_CORE_REF in mise.toml is the single pin. uv.lock starts from core's v0.1.7 lockfile, so the generator and runtime versions match core. proto:check and conformance:check catch drift from the pin, and build installs the wheel and sdist on the oldest supported Python. Signed-off-by: Piotr Mlocek --- .gitattributes | 7 + .gitignore | 14 + mise.toml | 121 ++++++++ scripts/fetch-core.sh | 36 +++ uv.lock | 663 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 841 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 mise.toml create mode 100755 scripts/fetch-core.sh create mode 100644 uv.lock diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..25d9e10 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +# Generated protobuf bindings (committed; see README). GitHub collapses them +# in diffs and leaves them out of language statistics. _proto/__init__.py is +# hand-written and stays visible. +src/openshell/_proto/*_pb2.py linguist-generated +src/openshell/_proto/*_pb2.pyi linguist-generated +src/openshell/_proto/*_pb2_grpc.py linguist-generated +src/openshell/_proto/*_pb2_grpc.pyi linguist-generated diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a918c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Python +__pycache__/ +*.py[cod] +.venv/ +.pytest_cache/ +.ruff_cache/ +.coverage +coverage.xml +dist/ +build/ +*.egg-info/ + +# Core protos fetched at the pinned ref by `mise run proto:fetch`. +/proto/ diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..4b1c71e --- /dev/null +++ b/mise.toml @@ -0,0 +1,121 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Python SDK tasks. Run `mise tasks` to list them and `mise run ci` for the +# full pipeline. Bindings are generated from core's proto/ at the ref pinned in +# OPENSHELL_CORE_REF and committed under src/openshell/_proto, so building the +# package needs no core checkout and no network. + +min_version = { soft = "2026.9.9" } + +[tools] +python = "3.14.5" +uv = "0.10.12" + +[env] +# The single core pin: a release tag (or a full commit SHA). +OPENSHELL_CORE_REF = "v0.1.7" +SETUPTOOLS_SCM_PRETEND_VERSION_FOR_OPENSHELL = "0.0.0" + +[vars] +python_paths = "src/ tests/ scripts/" + +[tasks."core:version"] +description = "Print the pinned core ref" +run = "echo $OPENSHELL_CORE_REF" + +[tasks.sync] +description = "Install the SDK and its development dependencies" +run = "uv sync --frozen --group dev" + +[tasks."proto:fetch"] +description = "Fetch core's proto/ at the pinned ref into proto/" +run = "scripts/fetch-core.sh $OPENSHELL_CORE_REF . proto" +sources = ["mise.toml"] +outputs = ["proto/openshell.proto"] + +[tasks."proto:gen"] +description = "Generate the Python bindings into src/openshell/_proto" +depends = ["sync", "proto:fetch"] +run = "uv run --frozen python scripts/generate_python_proto.py" + +[tasks."proto:check"] +description = "Fail if the committed bindings differ from the pinned protos" +depends = ["proto:gen"] +run = """ +#!/usr/bin/env bash +set -euo pipefail +if ! git diff --exit-code --stat -- src/openshell/_proto \ + || [ -n "$(git ls-files --others --exclude-standard -- src/openshell/_proto)" ]; then + echo "ERROR: src/openshell/_proto is stale; run 'mise run proto:gen' and commit." >&2 + exit 1 +fi +""" + +[tasks."conformance:check"] +description = "Fail if vendored fixtures differ from core at the pinned ref" +run = """ +#!/usr/bin/env bash +set -euo pipefail +core=$(mktemp -d) +trap 'rm -rf "$core"' EXIT +scripts/fetch-core.sh "$OPENSHELL_CORE_REF" "$core" sdk/conformance +for fixture in oauth-client-credentials.json oauth-client-credentials.json.license; do + diff -u "$core/sdk/conformance/$fixture" "tests/fixtures/$fixture" +done +""" + +[tasks.lint] +description = "Lint with ruff" +depends = ["sync"] +run = "uv run --frozen ruff check {{vars.python_paths}}" + +[tasks.format] +description = "Format with ruff" +depends = ["sync"] +run = "uv run --frozen ruff format {{vars.python_paths}}" + +[tasks."format:check"] +description = "Check formatting with ruff" +depends = ["sync"] +run = "uv run --frozen ruff format --check {{vars.python_paths}}" + +[tasks.typecheck] +description = "Type check with ty" +depends = ["sync"] +run = "uv run --frozen ty check {{vars.python_paths}}" + +[tasks.test] +description = "Run unit tests (set UV_PYTHON to pick the interpreter)" +depends = ["sync", "proto:fetch"] +run = "uv run --frozen pytest -n auto" + +[tasks.check] +description = "Run formatting, lint, type, and drift checks" +depends = ["format:check", "lint", "typecheck", "proto:check", "conformance:check"] + +[tasks.build] +description = "Build the wheel and sdist, verify the wheel, and install both on the oldest Python" +depends = ["sync"] +run = """ +#!/usr/bin/env bash +set -euo pipefail +rm -rf dist +uv build --out-dir dist +uv run --no-project python scripts/verify-python-wheel.py dist \ + --expected-version "$SETUPTOOLS_SCM_PRETEND_VERSION_FOR_OPENSHELL" + +# Install each artifact into a clean environment on the oldest supported +# Python and import the public API and the generated bindings. +smoke=$(mktemp -d) +trap 'rm -rf "$smoke"' EXIT +for artifact in dist/*.whl dist/*.tar.gz; do + uv venv --quiet --clear --python "${SMOKE_PYTHON:-3.11}" "$smoke/venv" + uv pip install --quiet --python "$smoke/venv/bin/python" "$artifact" + "$smoke/venv/bin/python" -I -c 'import openshell, openshell._proto.openshell_pb2_grpc; print(openshell.__version__, len(openshell.__all__))' +done +""" + +[tasks.ci] +description = "Run the full CI pipeline" +depends = ["check", "test", "build"] diff --git a/scripts/fetch-core.sh b/scripts/fetch-core.sh new file mode 100755 index 0000000..76d4070 --- /dev/null +++ b/scripts/fetch-core.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +# fetch-core.sh: copy files from NVIDIA/OpenShell at a pinned ref. +# +# Usage: fetch-core.sh ... +# +# Fetches only (a tag or a full commit SHA), without history or unneeded +# blobs, and copies each (a file or directory) into +# under the same relative path, replacing what was there. +set -euo pipefail + +if [ $# -lt 3 ]; then + echo "usage: $0 ..." >&2 + exit 2 +fi + +ref=$1 +out=$2 +shift 2 +remote=${OPENSHELL_CORE_REMOTE:-https://github.com/NVIDIA/OpenShell.git} +work=$(mktemp -d) +trap 'rm -rf "$work"' EXIT + +git -C "$work" init --quiet +git -C "$work" remote add origin "$remote" +git -C "$work" fetch --quiet --depth 1 --filter=blob:none --no-tags origin "$ref" +git -C "$work" sparse-checkout set --no-cone "$@" +git -C "$work" checkout --quiet FETCH_HEAD + +for path in "$@"; do + rm -rf "${out:?}/$path" + mkdir -p "$out/$(dirname "$path")" + cp -R "$work/$path" "$out/$path" +done diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..ce22549 --- /dev/null +++ b/uv.lock @@ -0,0 +1,663 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "certifi" +version = "2026.10.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/1436c50cc46699de0230fbaacc1d1de7bfec413176099949e9d5112e88f2/certifi-2026.10.19.tar.gz", hash = "sha256:035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae", size = 137598, upload-time = "2026-10-20T02:24:16.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/51/29046e48f693c54e5b7412216d447a1d8362c9653148d98c02cdf65fa733/certifi-2026.10.19-py3-none-any.whl", hash = "sha256:42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b", size = 136464, upload-time = "2026-10-20T02:24:15.072Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/01/abca50583a8975bb6e1c59eff67ed8e48bb127c07dad5c28d9e96ccc09ec/coverage-7.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:060ebf6f2c51aff5ba38e1f43a2095e087389b1c69d559fde6049a4b0001320e", size = 218971, upload-time = "2026-01-25T12:57:36.953Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0e/b6489f344d99cd1e5b4d5e1be52dfd3f8a3dc5112aa6c33948da8cabad4e/coverage-7.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1ea8ca9db5e7469cd364552985e15911548ea5b69c48a17291f0cac70484b2e", size = 219473, upload-time = "2026-01-25T12:57:38.934Z" }, + { url = "https://files.pythonhosted.org/packages/17/11/db2f414915a8e4ec53f60b17956c27f21fb68fcf20f8a455ce7c2ccec638/coverage-7.13.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b780090d15fd58f07cf2011943e25a5f0c1c894384b13a216b6c86c8a8a7c508", size = 249896, upload-time = "2026-01-25T12:57:40.365Z" }, + { url = "https://files.pythonhosted.org/packages/80/06/0823fe93913663c017e508e8810c998c8ebd3ec2a5a85d2c3754297bdede/coverage-7.13.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:88a800258d83acb803c38175b4495d293656d5fac48659c953c18e5f539a274b", size = 251810, upload-time = "2026-01-25T12:57:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/61/dc/b151c3cc41b28cdf7f0166c5fa1271cbc305a8ec0124cce4b04f74791a18/coverage-7.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6326e18e9a553e674d948536a04a80d850a5eeefe2aae2e6d7cf05d54046c01b", size = 253920, upload-time = "2026-01-25T12:57:44.026Z" }, + { url = "https://files.pythonhosted.org/packages/2d/35/e83de0556e54a4729a2b94ea816f74ce08732e81945024adee46851c2264/coverage-7.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:59562de3f797979e1ff07c587e2ac36ba60ca59d16c211eceaa579c266c5022f", size = 250025, upload-time = "2026-01-25T12:57:45.624Z" }, + { url = "https://files.pythonhosted.org/packages/39/67/af2eb9c3926ce3ea0d58a0d2516fcbdacf7a9fc9559fe63076beaf3f2596/coverage-7.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27ba1ed6f66b0e2d61bfa78874dffd4f8c3a12f8e2b5410e515ab345ba7bc9c3", size = 251612, upload-time = "2026-01-25T12:57:47.713Z" }, + { url = "https://files.pythonhosted.org/packages/26/62/5be2e25f3d6c711d23b71296f8b44c978d4c8b4e5b26871abfc164297502/coverage-7.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8be48da4d47cc68754ce643ea50b3234557cbefe47c2f120495e7bd0a2756f2b", size = 249670, upload-time = "2026-01-25T12:57:49.378Z" }, + { url = "https://files.pythonhosted.org/packages/b3/51/400d1b09a8344199f9b6a6fc1868005d766b7ea95e7882e494fa862ca69c/coverage-7.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2a47a4223d3361b91176aedd9d4e05844ca67d7188456227b6bf5e436630c9a1", size = 249395, upload-time = "2026-01-25T12:57:50.86Z" }, + { url = "https://files.pythonhosted.org/packages/e0/36/f02234bc6e5230e2f0a63fd125d0a2093c73ef20fdf681c7af62a140e4e7/coverage-7.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6f141b468740197d6bd38f2b26ade124363228cc3f9858bd9924ab059e00059", size = 250298, upload-time = "2026-01-25T12:57:52.287Z" }, + { url = "https://files.pythonhosted.org/packages/b0/06/713110d3dd3151b93611c9cbfc65c15b4156b44f927fced49ac0b20b32a4/coverage-7.13.2-cp311-cp311-win32.whl", hash = "sha256:89567798404af067604246e01a49ef907d112edf2b75ef814b1364d5ce267031", size = 221485, upload-time = "2026-01-25T12:57:53.876Z" }, + { url = "https://files.pythonhosted.org/packages/16/0c/3ae6255fa1ebcb7dec19c9a59e85ef5f34566d1265c70af5b2fc981da834/coverage-7.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:21dd57941804ae2ac7e921771a5e21bbf9aabec317a041d164853ad0a96ce31e", size = 222421, upload-time = "2026-01-25T12:57:55.433Z" }, + { url = "https://files.pythonhosted.org/packages/b5/37/fabc3179af4d61d89ea47bd04333fec735cd5e8b59baad44fed9fc4170d7/coverage-7.13.2-cp311-cp311-win_arm64.whl", hash = "sha256:10758e0586c134a0bafa28f2d37dd2cdb5e4a90de25c0fc0c77dabbad46eca28", size = 221088, upload-time = "2026-01-25T12:57:57.41Z" }, + { url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" }, + { url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" }, + { url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" }, + { url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" }, + { url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" }, + { url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" }, + { url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" }, + { url = "https://files.pythonhosted.org/packages/01/c9/0cf1a6a57a9968cc049a6b896693faa523c638a5314b1fc374eb2b2ac904/coverage-7.13.2-cp312-cp312-win32.whl", hash = "sha256:292250282cf9bcf206b543d7608bda17ca6fc151f4cbae949fc7e115112fbd41", size = 221696, upload-time = "2026-01-25T12:58:17.517Z" }, + { url = "https://files.pythonhosted.org/packages/4d/05/d7540bf983f09d32803911afed135524570f8c47bb394bf6206c1dc3a786/coverage-7.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:eeea10169fac01549a7921d27a3e517194ae254b542102267bef7a93ed38c40e", size = 222504, upload-time = "2026-01-25T12:58:19.115Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/1a9f037a736ced0a12aacf6330cdaad5008081142a7070bc58b0f7930cbc/coverage-7.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a5b567f0b635b592c917f96b9a9cb3dbd4c320d03f4bf94e9084e494f2e8894", size = 221120, upload-time = "2026-01-25T12:58:21.334Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f0/3d3eac7568ab6096ff23791a526b0048a1ff3f49d0e236b2af6fb6558e88/coverage-7.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed75de7d1217cf3b99365d110975f83af0528c849ef5180a12fd91b5064df9d6", size = 219168, upload-time = "2026-01-25T12:58:23.376Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a6/f8b5cfeddbab95fdef4dcd682d82e5dcff7a112ced57a959f89537ee9995/coverage-7.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97e596de8fa9bada4d88fde64a3f4d37f1b6131e4faa32bad7808abc79887ddc", size = 219537, upload-time = "2026-01-25T12:58:24.932Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e6/8d8e6e0c516c838229d1e41cadcec91745f4b1031d4db17ce0043a0423b4/coverage-7.13.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:68c86173562ed4413345410c9480a8d64864ac5e54a5cda236748031e094229f", size = 250528, upload-time = "2026-01-25T12:58:26.567Z" }, + { url = "https://files.pythonhosted.org/packages/8e/78/befa6640f74092b86961f957f26504c8fba3d7da57cc2ab7407391870495/coverage-7.13.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7be4d613638d678b2b3773b8f687537b284d7074695a43fe2fbbfc0e31ceaed1", size = 253132, upload-time = "2026-01-25T12:58:28.251Z" }, + { url = "https://files.pythonhosted.org/packages/9d/10/1630db1edd8ce675124a2ee0f7becc603d2bb7b345c2387b4b95c6907094/coverage-7.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7f63ce526a96acd0e16c4af8b50b64334239550402fb1607ce6a584a6d62ce9", size = 254374, upload-time = "2026-01-25T12:58:30.294Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/0d9381647b1e8e6d310ac4140be9c428a0277330991e0c35bdd751e338a4/coverage-7.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:406821f37f864f968e29ac14c3fccae0fec9fdeba48327f0341decf4daf92d7c", size = 250762, upload-time = "2026-01-25T12:58:32.036Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5636dfc9a7c871ee8776af83ee33b4c26bc508ad6cee1e89b6419a366582/coverage-7.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ee68e5a4e3e5443623406b905db447dceddffee0dceb39f4e0cd9ec2a35004b5", size = 252502, upload-time = "2026-01-25T12:58:33.961Z" }, + { url = "https://files.pythonhosted.org/packages/02/2a/7ff2884d79d420cbb2d12fed6fff727b6d0ef27253140d3cdbbd03187ee0/coverage-7.13.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2ee0e58cca0c17dd9c6c1cdde02bb705c7b3fbfa5f3b0b5afeda20d4ebff8ef4", size = 250463, upload-time = "2026-01-25T12:58:35.529Z" }, + { url = "https://files.pythonhosted.org/packages/91/c0/ba51087db645b6c7261570400fc62c89a16278763f36ba618dc8657a187b/coverage-7.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e5bbb5018bf76a56aabdb64246b5288d5ae1b7d0dd4d0534fe86df2c2992d1c", size = 250288, upload-time = "2026-01-25T12:58:37.226Z" }, + { url = "https://files.pythonhosted.org/packages/03/07/44e6f428551c4d9faf63ebcefe49b30e5c89d1be96f6a3abd86a52da9d15/coverage-7.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a55516c68ef3e08e134e818d5e308ffa6b1337cc8b092b69b24287bf07d38e31", size = 252063, upload-time = "2026-01-25T12:58:38.821Z" }, + { url = "https://files.pythonhosted.org/packages/c2/67/35b730ad7e1859dd57e834d1bc06080d22d2f87457d53f692fce3f24a5a9/coverage-7.13.2-cp313-cp313-win32.whl", hash = "sha256:5b20211c47a8abf4abc3319d8ce2464864fa9f30c5fcaf958a3eed92f4f1fef8", size = 221716, upload-time = "2026-01-25T12:58:40.484Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/e5fcf5a97c72f45fc14829237a6550bf49d0ab882ac90e04b12a69db76b4/coverage-7.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:14f500232e521201cf031549fb1ebdfc0a40f401cf519157f76c397e586c3beb", size = 222522, upload-time = "2026-01-25T12:58:43.247Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/25d7b2f946d239dd2d6644ca2cc060d24f97551e2af13b6c24c722ae5f97/coverage-7.13.2-cp313-cp313-win_arm64.whl", hash = "sha256:9779310cb5a9778a60c899f075a8514c89fa6d10131445c2207fc893e0b14557", size = 221145, upload-time = "2026-01-25T12:58:45Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f7/080376c029c8f76fadfe43911d0daffa0cbdc9f9418a0eead70c56fb7f4b/coverage-7.13.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e64fa5a1e41ce5df6b547cbc3d3699381c9e2c2c369c67837e716ed0f549d48e", size = 219861, upload-time = "2026-01-25T12:58:46.586Z" }, + { url = "https://files.pythonhosted.org/packages/42/11/0b5e315af5ab35f4c4a70e64d3314e4eec25eefc6dec13be3a7d5ffe8ac5/coverage-7.13.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b01899e82a04085b6561eb233fd688474f57455e8ad35cd82286463ba06332b7", size = 220207, upload-time = "2026-01-25T12:58:48.277Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0c/0874d0318fb1062117acbef06a09cf8b63f3060c22265adaad24b36306b7/coverage-7.13.2-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:838943bea48be0e2768b0cf7819544cdedc1bbb2f28427eabb6eb8c9eb2285d3", size = 261504, upload-time = "2026-01-25T12:58:49.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/5e/1cd72c22ecb30751e43a72f40ba50fcef1b7e93e3ea823bd9feda8e51f9a/coverage-7.13.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:93d1d25ec2b27e90bcfef7012992d1f5121b51161b8bffcda756a816cf13c2c3", size = 263582, upload-time = "2026-01-25T12:58:51.582Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/8acf356707c7a42df4d0657020308e23e5a07397e81492640c186268497c/coverage-7.13.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93b57142f9621b0d12349c43fc7741fe578e4bc914c1e5a54142856cfc0bf421", size = 266008, upload-time = "2026-01-25T12:58:53.234Z" }, + { url = "https://files.pythonhosted.org/packages/41/41/ea1730af99960309423c6ea8d6a4f1fa5564b2d97bd1d29dda4b42611f04/coverage-7.13.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f06799ae1bdfff7ccb8665d75f8291c69110ba9585253de254688aa8a1ccc6c5", size = 260762, upload-time = "2026-01-25T12:58:55.372Z" }, + { url = "https://files.pythonhosted.org/packages/22/fa/02884d2080ba71db64fdc127b311db60e01fe6ba797d9c8363725e39f4d5/coverage-7.13.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7f9405ab4f81d490811b1d91c7a20361135a2df4c170e7f0b747a794da5b7f23", size = 263571, upload-time = "2026-01-25T12:58:57.52Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6b/4083aaaeba9b3112f55ac57c2ce7001dc4d8fa3fcc228a39f09cc84ede27/coverage-7.13.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f9ab1d5b86f8fbc97a5b3cd6280a3fd85fef3b028689d8a2c00918f0d82c728c", size = 261200, upload-time = "2026-01-25T12:58:59.255Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d2/aea92fa36d61955e8c416ede9cf9bf142aa196f3aea214bb67f85235a050/coverage-7.13.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:f674f59712d67e841525b99e5e2b595250e39b529c3bda14764e4f625a3fa01f", size = 260095, upload-time = "2026-01-25T12:59:01.066Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ae/04ffe96a80f107ea21b22b2367175c621da920063260a1c22f9452fd7866/coverage-7.13.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c6cadac7b8ace1ba9144feb1ae3cb787a6065ba6d23ffc59a934b16406c26573", size = 262284, upload-time = "2026-01-25T12:59:02.802Z" }, + { url = "https://files.pythonhosted.org/packages/1c/7a/6f354dcd7dfc41297791d6fb4e0d618acb55810bde2c1fd14b3939e05c2b/coverage-7.13.2-cp313-cp313t-win32.whl", hash = "sha256:14ae4146465f8e6e6253eba0cccd57423e598a4cb925958b240c805300918343", size = 222389, upload-time = "2026-01-25T12:59:04.563Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d5/080ad292a4a3d3daf411574be0a1f56d6dee2c4fdf6b005342be9fac807f/coverage-7.13.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9074896edd705a05769e3de0eac0a8388484b503b68863dd06d5e473f874fd47", size = 223450, upload-time = "2026-01-25T12:59:06.677Z" }, + { url = "https://files.pythonhosted.org/packages/88/96/df576fbacc522e9fb8d1c4b7a7fc62eb734be56e2cba1d88d2eabe08ea3f/coverage-7.13.2-cp313-cp313t-win_arm64.whl", hash = "sha256:69e526e14f3f854eda573d3cf40cffd29a1a91c684743d904c33dbdcd0e0f3e7", size = 221707, upload-time = "2026-01-25T12:59:08.363Z" }, + { url = "https://files.pythonhosted.org/packages/55/53/1da9e51a0775634b04fcc11eb25c002fc58ee4f92ce2e8512f94ac5fc5bf/coverage-7.13.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:387a825f43d680e7310e6f325b2167dd093bc8ffd933b83e9aa0983cf6e0a2ef", size = 219213, upload-time = "2026-01-25T12:59:11.909Z" }, + { url = "https://files.pythonhosted.org/packages/46/35/b3caac3ebbd10230fea5a33012b27d19e999a17c9285c4228b4b2e35b7da/coverage-7.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f0d7fea9d8e5d778cd5a9e8fc38308ad688f02040e883cdc13311ef2748cb40f", size = 219549, upload-time = "2026-01-25T12:59:13.638Z" }, + { url = "https://files.pythonhosted.org/packages/76/9c/e1cf7def1bdc72c1907e60703983a588f9558434a2ff94615747bd73c192/coverage-7.13.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e080afb413be106c95c4ee96b4fffdc9e2fa56a8bbf90b5c0918e5c4449412f5", size = 250586, upload-time = "2026-01-25T12:59:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/ba/49/f54ec02ed12be66c8d8897270505759e057b0c68564a65c429ccdd1f139e/coverage-7.13.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a7fc042ba3c7ce25b8a9f097eb0f32a5ce1ccdb639d9eec114e26def98e1f8a4", size = 253093, upload-time = "2026-01-25T12:59:17.491Z" }, + { url = "https://files.pythonhosted.org/packages/fb/5e/aaf86be3e181d907e23c0f61fccaeb38de8e6f6b47aed92bf57d8fc9c034/coverage-7.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0ba505e021557f7f8173ee8cd6b926373d8653e5ff7581ae2efce1b11ef4c27", size = 254446, upload-time = "2026-01-25T12:59:19.752Z" }, + { url = "https://files.pythonhosted.org/packages/28/c8/a5fa01460e2d75b0c853b392080d6829d3ca8b5ab31e158fa0501bc7c708/coverage-7.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7de326f80e3451bd5cc7239ab46c73ddb658fe0b7649476bc7413572d36cd548", size = 250615, upload-time = "2026-01-25T12:59:21.928Z" }, + { url = "https://files.pythonhosted.org/packages/86/0b/6d56315a55f7062bb66410732c24879ccb2ec527ab6630246de5fe45a1df/coverage-7.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:abaea04f1e7e34841d4a7b343904a3f59481f62f9df39e2cd399d69a187a9660", size = 252452, upload-time = "2026-01-25T12:59:23.592Z" }, + { url = "https://files.pythonhosted.org/packages/30/19/9bc550363ebc6b0ea121977ee44d05ecd1e8bf79018b8444f1028701c563/coverage-7.13.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9f93959ee0c604bccd8e0697be21de0887b1f73efcc3aa73a3ec0fd13feace92", size = 250418, upload-time = "2026-01-25T12:59:25.392Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/580530a31ca2f0cc6f07a8f2ab5460785b02bb11bdf815d4c4d37a4c5169/coverage-7.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:13fe81ead04e34e105bf1b3c9f9cdf32ce31736ee5d90a8d2de02b9d3e1bcb82", size = 250231, upload-time = "2026-01-25T12:59:27.888Z" }, + { url = "https://files.pythonhosted.org/packages/e2/42/dd9093f919dc3088cb472893651884bd675e3df3d38a43f9053656dca9a2/coverage-7.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d6d16b0f71120e365741bca2cb473ca6fe38930bc5431c5e850ba949f708f892", size = 251888, upload-time = "2026-01-25T12:59:29.636Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a6/0af4053e6e819774626e133c3d6f70fae4d44884bfc4b126cb647baee8d3/coverage-7.13.2-cp314-cp314-win32.whl", hash = "sha256:9b2f4714bb7d99ba3790ee095b3b4ac94767e1347fe424278a0b10acb3ff04fe", size = 221968, upload-time = "2026-01-25T12:59:31.424Z" }, + { url = "https://files.pythonhosted.org/packages/c4/cc/5aff1e1f80d55862442855517bb8ad8ad3a68639441ff6287dde6a58558b/coverage-7.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:e4121a90823a063d717a96e0a0529c727fb31ea889369a0ee3ec00ed99bf6859", size = 222783, upload-time = "2026-01-25T12:59:33.118Z" }, + { url = "https://files.pythonhosted.org/packages/de/20/09abafb24f84b3292cc658728803416c15b79f9ee5e68d25238a895b07d9/coverage-7.13.2-cp314-cp314-win_arm64.whl", hash = "sha256:6873f0271b4a15a33e7590f338d823f6f66f91ed147a03938d7ce26efd04eee6", size = 221348, upload-time = "2026-01-25T12:59:34.939Z" }, + { url = "https://files.pythonhosted.org/packages/b6/60/a3820c7232db63be060e4019017cd3426751c2699dab3c62819cdbcea387/coverage-7.13.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f61d349f5b7cd95c34017f1927ee379bfbe9884300d74e07cf630ccf7a610c1b", size = 219950, upload-time = "2026-01-25T12:59:36.624Z" }, + { url = "https://files.pythonhosted.org/packages/fd/37/e4ef5975fdeb86b1e56db9a82f41b032e3d93a840ebaf4064f39e770d5c5/coverage-7.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a43d34ce714f4ca674c0d90beb760eb05aad906f2c47580ccee9da8fe8bfb417", size = 220209, upload-time = "2026-01-25T12:59:38.339Z" }, + { url = "https://files.pythonhosted.org/packages/54/df/d40e091d00c51adca1e251d3b60a8b464112efa3004949e96a74d7c19a64/coverage-7.13.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bff1b04cb9d4900ce5c56c4942f047dc7efe57e2608cb7c3c8936e9970ccdbee", size = 261576, upload-time = "2026-01-25T12:59:40.446Z" }, + { url = "https://files.pythonhosted.org/packages/c5/44/5259c4bed54e3392e5c176121af9f71919d96dde853386e7730e705f3520/coverage-7.13.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6ae99e4560963ad8e163e819e5d77d413d331fd00566c1e0856aa252303552c1", size = 263704, upload-time = "2026-01-25T12:59:42.346Z" }, + { url = "https://files.pythonhosted.org/packages/16/bd/ae9f005827abcbe2c70157459ae86053971c9fa14617b63903abbdce26d9/coverage-7.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e79a8c7d461820257d9aa43716c4efc55366d7b292e46b5b37165be1d377405d", size = 266109, upload-time = "2026-01-25T12:59:44.073Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c0/8e279c1c0f5b1eaa3ad9b0fb7a5637fc0379ea7d85a781c0fe0bb3cfc2ab/coverage-7.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:060ee84f6a769d40c492711911a76811b4befb6fba50abb450371abb720f5bd6", size = 260686, upload-time = "2026-01-25T12:59:45.804Z" }, + { url = "https://files.pythonhosted.org/packages/b2/47/3a8112627e9d863e7cddd72894171c929e94491a597811725befdcd76bce/coverage-7.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bca209d001fd03ea2d978f8a4985093240a355c93078aee3f799852c23f561a", size = 263568, upload-time = "2026-01-25T12:59:47.929Z" }, + { url = "https://files.pythonhosted.org/packages/92/bc/7ea367d84afa3120afc3ce6de294fd2dcd33b51e2e7fbe4bbfd200f2cb8c/coverage-7.13.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:6b8092aa38d72f091db61ef83cb66076f18f02da3e1a75039a4f218629600e04", size = 261174, upload-time = "2026-01-25T12:59:49.717Z" }, + { url = "https://files.pythonhosted.org/packages/33/b7/f1092dcecb6637e31cc2db099581ee5c61a17647849bae6b8261a2b78430/coverage-7.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4a3158dc2dcce5200d91ec28cd315c999eebff355437d2765840555d765a6e5f", size = 260017, upload-time = "2026-01-25T12:59:51.463Z" }, + { url = "https://files.pythonhosted.org/packages/2b/cd/f3d07d4b95fbe1a2ef0958c15da614f7e4f557720132de34d2dc3aa7e911/coverage-7.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3973f353b2d70bd9796cc12f532a05945232ccae966456c8ed7034cb96bbfd6f", size = 262337, upload-time = "2026-01-25T12:59:53.407Z" }, + { url = "https://files.pythonhosted.org/packages/e0/db/b0d5b2873a07cb1e06a55d998697c0a5a540dcefbf353774c99eb3874513/coverage-7.13.2-cp314-cp314t-win32.whl", hash = "sha256:79f6506a678a59d4ded048dc72f1859ebede8ec2b9a2d509ebe161f01c2879d3", size = 222749, upload-time = "2026-01-25T12:59:56.316Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2f/838a5394c082ac57d85f57f6aba53093b30d9089781df72412126505716f/coverage-7.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:196bfeabdccc5a020a57d5a368c681e3a6ceb0447d153aeccc1ab4d70a5032ba", size = 223857, upload-time = "2026-01-25T12:59:58.201Z" }, + { url = "https://files.pythonhosted.org/packages/44/d4/b608243e76ead3a4298824b50922b89ef793e50069ce30316a65c1b4d7ef/coverage-7.13.2-cp314-cp314t-win_arm64.whl", hash = "sha256:69269ab58783e090bfbf5b916ab3d188126e22d6070bbfc93098fdd474ef937c", size = 221881, upload-time = "2026-01-25T13:00:00.449Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "execnet" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.75.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/c5/4353a188e2c335aee33269e8b654af228278cca8e5f0b4b5f11e5d0e9adb/googleapis_common_protos-1.75.3.tar.gz", hash = "sha256:57c435ac2c68b108999b6db075d9053e4d7a936ba57b4a3d45667b1346f1738a", size = 153905, upload-time = "2026-09-03T22:31:21.869Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/7a/7d79170c6ce6f12e109df2b3879d6b934010cf4f99aea8de8b7e5408c174/googleapis_common_protos-1.75.3-py3-none-any.whl", hash = "sha256:a018d2bf098ca9fb6faa08d5bb780e2a2c2f73c566f069761331386c9596d3f2", size = 306984, upload-time = "2026-09-03T22:30:45.133Z" }, +] + +[[package]] +name = "grpcio" +version = "1.78.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/8a/3d098f35c143a89520e568e6539cc098fcd294495910e359889ce8741c84/grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5", size = 12852416, upload-time = "2026-02-06T09:57:18.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/c7/d0b780a29b0837bf4ca9580904dfb275c1fc321ded7897d620af7047ec57/grpcio-1.78.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2777b783f6c13b92bd7b716667452c329eefd646bfb3f2e9dabea2e05dbd34f6", size = 5951525, upload-time = "2026-02-06T09:55:01.989Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b1/96920bf2ee61df85a9503cb6f733fe711c0ff321a5a697d791b075673281/grpcio-1.78.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:9dca934f24c732750389ce49d638069c3892ad065df86cb465b3fa3012b70c9e", size = 11830418, upload-time = "2026-02-06T09:55:04.462Z" }, + { url = "https://files.pythonhosted.org/packages/83/0c/7c1528f098aeb75a97de2bae18c530f56959fb7ad6c882db45d9884d6edc/grpcio-1.78.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:459ab414b35f4496138d0ecd735fed26f1318af5e52cb1efbc82a09f0d5aa911", size = 6524477, upload-time = "2026-02-06T09:55:07.111Z" }, + { url = "https://files.pythonhosted.org/packages/8d/52/e7c1f3688f949058e19a011c4e0dec973da3d0ae5e033909677f967ae1f4/grpcio-1.78.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:082653eecbdf290e6e3e2c276ab2c54b9e7c299e07f4221872380312d8cf395e", size = 7198266, upload-time = "2026-02-06T09:55:10.016Z" }, + { url = "https://files.pythonhosted.org/packages/e5/61/8ac32517c1e856677282c34f2e7812d6c328fa02b8f4067ab80e77fdc9c9/grpcio-1.78.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85f93781028ec63f383f6bc90db785a016319c561cc11151fbb7b34e0d012303", size = 6730552, upload-time = "2026-02-06T09:55:12.207Z" }, + { url = "https://files.pythonhosted.org/packages/bd/98/b8ee0158199250220734f620b12e4a345955ac7329cfd908d0bf0fda77f0/grpcio-1.78.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f12857d24d98441af6a1d5c87442d624411db486f7ba12550b07788f74b67b04", size = 7304296, upload-time = "2026-02-06T09:55:15.044Z" }, + { url = "https://files.pythonhosted.org/packages/bd/0f/7b72762e0d8840b58032a56fdbd02b78fc645b9fa993d71abf04edbc54f4/grpcio-1.78.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5397fff416b79e4b284959642a4e95ac4b0f1ece82c9993658e0e477d40551ec", size = 8288298, upload-time = "2026-02-06T09:55:17.276Z" }, + { url = "https://files.pythonhosted.org/packages/24/ae/ae4ce56bc5bb5caa3a486d60f5f6083ac3469228faa734362487176c15c5/grpcio-1.78.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbe6e89c7ffb48518384068321621b2a69cab509f58e40e4399fdd378fa6d074", size = 7730953, upload-time = "2026-02-06T09:55:19.545Z" }, + { url = "https://files.pythonhosted.org/packages/b5/6e/8052e3a28eb6a820c372b2eb4b5e32d195c661e137d3eca94d534a4cfd8a/grpcio-1.78.0-cp311-cp311-win32.whl", hash = "sha256:6092beabe1966a3229f599d7088b38dfc8ffa1608b5b5cdda31e591e6500f856", size = 4076503, upload-time = "2026-02-06T09:55:21.521Z" }, + { url = "https://files.pythonhosted.org/packages/08/62/f22c98c5265dfad327251fa2f840b591b1df5f5e15d88b19c18c86965b27/grpcio-1.78.0-cp311-cp311-win_amd64.whl", hash = "sha256:1afa62af6e23f88629f2b29ec9e52ec7c65a7176c1e0a83292b93c76ca882558", size = 4799767, upload-time = "2026-02-06T09:55:24.107Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f4/7384ed0178203d6074446b3c4f46c90a22ddf7ae0b3aee521627f54cfc2a/grpcio-1.78.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f9ab915a267fc47c7e88c387a3a28325b58c898e23d4995f765728f4e3dedb97", size = 5913985, upload-time = "2026-02-06T09:55:26.832Z" }, + { url = "https://files.pythonhosted.org/packages/81/ed/be1caa25f06594463f685b3790b320f18aea49b33166f4141bfdc2bfb236/grpcio-1.78.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3f8904a8165ab21e07e58bf3e30a73f4dffc7a1e0dbc32d51c61b5360d26f43e", size = 11811853, upload-time = "2026-02-06T09:55:29.224Z" }, + { url = "https://files.pythonhosted.org/packages/24/a7/f06d151afc4e64b7e3cc3e872d331d011c279aaab02831e40a81c691fb65/grpcio-1.78.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:859b13906ce098c0b493af92142ad051bf64c7870fa58a123911c88606714996", size = 6475766, upload-time = "2026-02-06T09:55:31.825Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a8/4482922da832ec0082d0f2cc3a10976d84a7424707f25780b82814aafc0a/grpcio-1.78.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b2342d87af32790f934a79c3112641e7b27d63c261b8b4395350dad43eff1dc7", size = 7170027, upload-time = "2026-02-06T09:55:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/54/bf/f4a3b9693e35d25b24b0b39fa46d7d8a3c439e0a3036c3451764678fec20/grpcio-1.78.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12a771591ae40bc65ba67048fa52ef4f0e6db8279e595fd349f9dfddeef571f9", size = 6690766, upload-time = "2026-02-06T09:55:36.902Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b9/521875265cc99fe5ad4c5a17010018085cae2810a928bf15ebe7d8bcd9cc/grpcio-1.78.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:185dea0d5260cbb2d224c507bf2a5444d5abbb1fa3594c1ed7e4c709d5eb8383", size = 7266161, upload-time = "2026-02-06T09:55:39.824Z" }, + { url = "https://files.pythonhosted.org/packages/05/86/296a82844fd40a4ad4a95f100b55044b4f817dece732bf686aea1a284147/grpcio-1.78.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51b13f9aed9d59ee389ad666b8c2214cc87b5de258fa712f9ab05f922e3896c6", size = 8253303, upload-time = "2026-02-06T09:55:42.353Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e4/ea3c0caf5468537f27ad5aab92b681ed7cc0ef5f8c9196d3fd42c8c2286b/grpcio-1.78.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd5f135b1bd58ab088930b3c613455796dfa0393626a6972663ccdda5b4ac6ce", size = 7698222, upload-time = "2026-02-06T09:55:44.629Z" }, + { url = "https://files.pythonhosted.org/packages/d7/47/7f05f81e4bb6b831e93271fb12fd52ba7b319b5402cbc101d588f435df00/grpcio-1.78.0-cp312-cp312-win32.whl", hash = "sha256:94309f498bcc07e5a7d16089ab984d42ad96af1d94b5a4eb966a266d9fcabf68", size = 4066123, upload-time = "2026-02-06T09:55:47.644Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e7/d6914822c88aa2974dbbd10903d801a28a19ce9cd8bad7e694cbbcf61528/grpcio-1.78.0-cp312-cp312-win_amd64.whl", hash = "sha256:9566fe4ababbb2610c39190791e5b829869351d14369603702e890ef3ad2d06e", size = 4797657, upload-time = "2026-02-06T09:55:49.86Z" }, + { url = "https://files.pythonhosted.org/packages/05/a9/8f75894993895f361ed8636cd9237f4ab39ef87fd30db17467235ed1c045/grpcio-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ce3a90455492bf8bfa38e56fbbe1dbd4f872a3d8eeaf7337dc3b1c8aa28c271b", size = 5920143, upload-time = "2026-02-06T09:55:52.035Z" }, + { url = "https://files.pythonhosted.org/packages/55/06/0b78408e938ac424100100fd081189451b472236e8a3a1f6500390dc4954/grpcio-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2bf5e2e163b356978b23652c4818ce4759d40f4712ee9ec5a83c4be6f8c23a3a", size = 11803926, upload-time = "2026-02-06T09:55:55.494Z" }, + { url = "https://files.pythonhosted.org/packages/88/93/b59fe7832ff6ae3c78b813ea43dac60e295fa03606d14d89d2e0ec29f4f3/grpcio-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8f2ac84905d12918e4e55a16da17939eb63e433dc11b677267c35568aa63fc84", size = 6478628, upload-time = "2026-02-06T09:55:58.533Z" }, + { url = "https://files.pythonhosted.org/packages/ed/df/e67e3734527f9926b7d9c0dde6cd998d1d26850c3ed8eeec81297967ac67/grpcio-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b58f37edab4a3881bc6c9bca52670610e0c9ca14e2ea3cf9debf185b870457fb", size = 7173574, upload-time = "2026-02-06T09:56:01.786Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/cc03fffb07bfba982a9ec097b164e8835546980aec25ecfa5f9c1a47e022/grpcio-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:735e38e176a88ce41840c21bb49098ab66177c64c82426e24e0082500cc68af5", size = 6692639, upload-time = "2026-02-06T09:56:04.529Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/289c32e301b85bdb67d7ec68b752155e674ee3ba2173a1858f118e399ef3/grpcio-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2045397e63a7a0ee7957c25f7dbb36ddc110e0cfb418403d110c0a7a68a844e9", size = 7268838, upload-time = "2026-02-06T09:56:08.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/79/1be93f32add280461fa4773880196572563e9c8510861ac2da0ea0f892b6/grpcio-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9f136fbafe7ccf4ac7e8e0c28b31066e810be52d6e344ef954a3a70234e1702", size = 8251878, upload-time = "2026-02-06T09:56:10.914Z" }, + { url = "https://files.pythonhosted.org/packages/65/65/793f8e95296ab92e4164593674ae6291b204bb5f67f9d4a711489cd30ffa/grpcio-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:748b6138585379c737adc08aeffd21222abbda1a86a0dca2a39682feb9196c20", size = 7695412, upload-time = "2026-02-06T09:56:13.593Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9f/1e233fe697ecc82845942c2822ed06bb522e70d6771c28d5528e4c50f6a4/grpcio-1.78.0-cp313-cp313-win32.whl", hash = "sha256:271c73e6e5676afe4fc52907686670c7cea22ab2310b76a59b678403ed40d670", size = 4064899, upload-time = "2026-02-06T09:56:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/4d/27/d86b89e36de8a951501fb06a0f38df19853210f341d0b28f83f4aa0ffa08/grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4", size = 4797393, upload-time = "2026-02-06T09:56:17.882Z" }, + { url = "https://files.pythonhosted.org/packages/29/f2/b56e43e3c968bfe822fa6ce5bca10d5c723aa40875b48791ce1029bb78c7/grpcio-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:e87cbc002b6f440482b3519e36e1313eb5443e9e9e73d6a52d43bd2004fcfd8e", size = 5920591, upload-time = "2026-02-06T09:56:20.758Z" }, + { url = "https://files.pythonhosted.org/packages/5d/81/1f3b65bd30c334167bfa8b0d23300a44e2725ce39bba5b76a2460d85f745/grpcio-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:c41bc64626db62e72afec66b0c8a0da76491510015417c127bfc53b2fe6d7f7f", size = 11813685, upload-time = "2026-02-06T09:56:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1c/bbe2f8216a5bd3036119c544d63c2e592bdf4a8ec6e4a1867592f4586b26/grpcio-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8dfffba826efcf366b1e3ccc37e67afe676f290e13a3b48d31a46739f80a8724", size = 6487803, upload-time = "2026-02-06T09:56:27.367Z" }, + { url = "https://files.pythonhosted.org/packages/16/5c/a6b2419723ea7ddce6308259a55e8e7593d88464ce8db9f4aa857aba96fa/grpcio-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74be1268d1439eaaf552c698cdb11cd594f0c49295ae6bb72c34ee31abbe611b", size = 7173206, upload-time = "2026-02-06T09:56:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/df/1e/b8801345629a415ea7e26c83d75eb5dbe91b07ffe5210cc517348a8d4218/grpcio-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be63c88b32e6c0f1429f1398ca5c09bc64b0d80950c8bb7807d7d7fb36fb84c7", size = 6693826, upload-time = "2026-02-06T09:56:32.305Z" }, + { url = "https://files.pythonhosted.org/packages/34/84/0de28eac0377742679a510784f049738a80424b17287739fc47d63c2439e/grpcio-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c586ac70e855c721bda8f548d38c3ca66ac791dc49b66a8281a1f99db85e452", size = 7277897, upload-time = "2026-02-06T09:56:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9c/ad8685cfe20559a9edb66f735afdcb2b7d3de69b13666fdfc542e1916ebd/grpcio-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:35eb275bf1751d2ffbd8f57cdbc46058e857cf3971041521b78b7db94bdaf127", size = 8252404, upload-time = "2026-02-06T09:56:37.553Z" }, + { url = "https://files.pythonhosted.org/packages/3c/05/33a7a4985586f27e1de4803887c417ec7ced145ebd069bc38a9607059e2b/grpcio-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:207db540302c884b8848036b80db352a832b99dfdf41db1eb554c2c2c7800f65", size = 7696837, upload-time = "2026-02-06T09:56:40.173Z" }, + { url = "https://files.pythonhosted.org/packages/73/77/7382241caf88729b106e49e7d18e3116216c778e6a7e833826eb96de22f7/grpcio-1.78.0-cp314-cp314-win32.whl", hash = "sha256:57bab6deef2f4f1ca76cc04565df38dc5713ae6c17de690721bdf30cb1e0545c", size = 4142439, upload-time = "2026-02-06T09:56:43.258Z" }, + { url = "https://files.pythonhosted.org/packages/48/b2/b096ccce418882fbfda4f7496f9357aaa9a5af1896a9a7f60d9f2b275a06/grpcio-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:dce09d6116df20a96acfdbf85e4866258c3758180e8c49845d6ba8248b6d0bbb", size = 4929852, upload-time = "2026-02-06T09:56:45.885Z" }, +] + +[[package]] +name = "grpcio-tools" +version = "1.78.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "grpcio" }, + { name = "protobuf" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/d1/cbefe328653f746fd319c4377836a25ba64226e41c6a1d7d5cdbc87a459f/grpcio_tools-1.78.0.tar.gz", hash = "sha256:4b0dd86560274316e155d925158276f8564508193088bc43e20d3f5dff956b2b", size = 5393026, upload-time = "2026-02-06T09:59:59.53Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/78/280184d19242ed6762bf453c47a70b869b3c5c72a24dc5bf2bf43909faa3/grpcio_tools-1.78.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:6a8b8b7b49f319d29dbcf507f62984fa382d1d10437d75c3f26db5f09c4ac0af", size = 2545904, upload-time = "2026-02-06T09:57:52.769Z" }, + { url = "https://files.pythonhosted.org/packages/5b/51/3c46dea5113f68fe879961cae62d34bb7a3c308a774301b45d614952ee98/grpcio_tools-1.78.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d62cf3b68372b0c6d722a6165db41b976869811abeabc19c8522182978d8db10", size = 5709078, upload-time = "2026-02-06T09:57:56.389Z" }, + { url = "https://files.pythonhosted.org/packages/e0/2c/dc1ae9ec53182c96d56dfcbf3bcd3e55a8952ad508b188c75bf5fc8993d4/grpcio_tools-1.78.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fa9056742efeaf89d5fe14198af71e5cbc4fbf155d547b89507e19d6025906c6", size = 2591744, upload-time = "2026-02-06T09:57:58.341Z" }, + { url = "https://files.pythonhosted.org/packages/04/63/9b53fc9a9151dd24386785171a4191ee7cb5afb4d983b6a6a87408f41b28/grpcio_tools-1.78.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e3191af125dcb705aa6bc3856ba81ba99b94121c1b6ebee152e66ea084672831", size = 2905113, upload-time = "2026-02-06T09:58:00.38Z" }, + { url = "https://files.pythonhosted.org/packages/96/b2/0ad8d789f3a2a00893131c140865605fa91671a6e6fcf9da659e1fabba10/grpcio_tools-1.78.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:283239ddbb67ae83fac111c61b25d8527a1dbd355b377cbc8383b79f1329944d", size = 2656436, upload-time = "2026-02-06T09:58:03.038Z" }, + { url = "https://files.pythonhosted.org/packages/09/4d/580f47ce2fc61b093ade747b378595f51b4f59972dd39949f7444b464a03/grpcio_tools-1.78.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac977508c0db15301ef36d6c79769ec1a6cc4e3bc75735afca7fe7e360cead3a", size = 3106128, upload-time = "2026-02-06T09:58:05.064Z" }, + { url = "https://files.pythonhosted.org/packages/c9/29/d83b2d89f8d10e438bad36b1eb29356510fb97e81e6a608b22ae1890e8e6/grpcio_tools-1.78.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4ff605e25652a0bd13aa8a73a09bc48669c68170902f5d2bf1468a57d5e78771", size = 3654953, upload-time = "2026-02-06T09:58:07.15Z" }, + { url = "https://files.pythonhosted.org/packages/08/71/917ce85633311e54fefd7e6eb1224fb780ef317a4d092766f5630c3fc419/grpcio_tools-1.78.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0197d7b561c79be78ab93d0fe2836c8def470683df594bae3ac89dd8e5c821b2", size = 3322630, upload-time = "2026-02-06T09:58:10.305Z" }, + { url = "https://files.pythonhosted.org/packages/b2/55/3fbf6b26ab46fc79e1e6f7f4e0993cf540263dad639290299fad374a0829/grpcio_tools-1.78.0-cp311-cp311-win32.whl", hash = "sha256:28f71f591f7f39555863ced84fcc209cbf4454e85ef957232f43271ee99af577", size = 993804, upload-time = "2026-02-06T09:58:13.698Z" }, + { url = "https://files.pythonhosted.org/packages/73/86/4affe006d9e1e9e1c6653d6aafe2f8b9188acb2b563cd8ed3a2c7c0e8aec/grpcio_tools-1.78.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a6de495dabf86a3b40b9a7492994e1232b077af9d63080811838b781abbe4e8", size = 1158566, upload-time = "2026-02-06T09:58:15.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ae/5b1fa5dd8d560a6925aa52de0de8731d319f121c276e35b9b2af7cc220a2/grpcio_tools-1.78.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:9eb122da57d4cad7d339fc75483116f0113af99e8d2c67f3ef9cae7501d806e4", size = 2546823, upload-time = "2026-02-06T09:58:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ed/d33ccf7fa701512efea7e7e23333b748848a123e9d3bbafde4e126784546/grpcio_tools-1.78.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d0c501b8249940b886420e6935045c44cb818fa6f265f4c2b97d5cff9cb5e796", size = 5706776, upload-time = "2026-02-06T09:58:20.944Z" }, + { url = "https://files.pythonhosted.org/packages/c6/69/4285583f40b37af28277fc6b867d636e3b10e1b6a7ebd29391a856e1279b/grpcio_tools-1.78.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:77e5aa2d2a7268d55b1b113f958264681ef1994c970f69d48db7d4683d040f57", size = 2593972, upload-time = "2026-02-06T09:58:23.29Z" }, + { url = "https://files.pythonhosted.org/packages/d7/eb/ecc1885bd6b3147f0a1b7dff5565cab72f01c8f8aa458f682a1c77a9fb08/grpcio_tools-1.78.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8e3c0b0e6ba5275322ba29a97bf890565a55f129f99a21b121145e9e93a22525", size = 2905531, upload-time = "2026-02-06T09:58:25.406Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a9/511d0040ced66960ca10ba0f082d6b2d2ee6dd61837b1709636fdd8e23b4/grpcio_tools-1.78.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975d4cb48694e20ebd78e1643e5f1cd94cdb6a3d38e677a8e84ae43665aa4790", size = 2656909, upload-time = "2026-02-06T09:58:28.022Z" }, + { url = "https://files.pythonhosted.org/packages/06/a3/3d2c707e7dee8df842c96fbb24feb2747e506e39f4a81b661def7fed107c/grpcio_tools-1.78.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:553ff18c5d52807dedecf25045ae70bad7a3dbba0b27a9a3cdd9bcf0a1b7baec", size = 3109778, upload-time = "2026-02-06T09:58:30.091Z" }, + { url = "https://files.pythonhosted.org/packages/1f/4b/646811ba241bf05da1f0dc6f25764f1c837f78f75b4485a4210c84b79eae/grpcio_tools-1.78.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8c7f5e4af5a84d2e96c862b1a65e958a538237e268d5f8203a3a784340975b51", size = 3658763, upload-time = "2026-02-06T09:58:32.875Z" }, + { url = "https://files.pythonhosted.org/packages/45/de/0a5ef3b3e79d1011375f5580dfee3a9c1ccb96c5f5d1c74c8cee777a2483/grpcio_tools-1.78.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96183e2b44afc3f9a761e9d0f985c3b44e03e8bb98e626241a6cbfb3b6f7e88f", size = 3325116, upload-time = "2026-02-06T09:58:34.894Z" }, + { url = "https://files.pythonhosted.org/packages/95/d2/6391b241ad571bc3e71d63f957c0b1860f0c47932d03c7f300028880f9b8/grpcio_tools-1.78.0-cp312-cp312-win32.whl", hash = "sha256:2250e8424c565a88573f7dc10659a0b92802e68c2a1d57e41872c9b88ccea7a6", size = 993493, upload-time = "2026-02-06T09:58:37.242Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8f/7d0d3a39ecad76ccc136be28274daa660569b244fa7d7d0bbb24d68e5ece/grpcio_tools-1.78.0-cp312-cp312-win_amd64.whl", hash = "sha256:217d1fa29de14d9c567d616ead7cb0fef33cde36010edff5a9390b00d52e5094", size = 1158423, upload-time = "2026-02-06T09:58:40.072Z" }, + { url = "https://files.pythonhosted.org/packages/53/ce/17311fb77530420e2f441e916b347515133e83d21cd6cc77be04ce093d5b/grpcio_tools-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:2d6de1cc23bdc1baafc23e201b1e48c617b8c1418b4d8e34cebf72141676e5fb", size = 2546284, upload-time = "2026-02-06T09:58:43.073Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d3/79e101483115f0e78223397daef71751b75eba7e92a32060c10aae11ca64/grpcio_tools-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2afeaad88040894c76656202ff832cb151bceb05c0e6907e539d129188b1e456", size = 5705653, upload-time = "2026-02-06T09:58:45.533Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a7/52fa3ccb39ceeee6adc010056eadfbca8198651c113e418dafebbdf2b306/grpcio_tools-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:33cc593735c93c03d63efe7a8ba25f3c66f16c52f0651910712490244facad72", size = 2592788, upload-time = "2026-02-06T09:58:48.918Z" }, + { url = "https://files.pythonhosted.org/packages/68/08/682ff6bb548225513d73dc9403742d8975439d7469c673bc534b9bbc83a7/grpcio_tools-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:2921d7989c4d83b71f03130ab415fa4d66e6693b8b8a1fcbb7a1c67cff19b812", size = 2905157, upload-time = "2026-02-06T09:58:51.478Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/264f3836a96423b7018e5ada79d62576a6401f6da4e1f4975b18b2be1265/grpcio_tools-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6a0df438e82c804c7b95e3f311c97c2f876dcc36376488d5b736b7bcf5a9b45", size = 2656166, upload-time = "2026-02-06T09:58:54.117Z" }, + { url = "https://files.pythonhosted.org/packages/f3/6b/f108276611522e03e98386b668cc7e575eff6952f2db9caa15b2a3b3e883/grpcio_tools-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9c6070a9500798225191ef25d0055a15d2c01c9c8f2ee7b681fffa99c98c822", size = 3109110, upload-time = "2026-02-06T09:58:56.891Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c7/cf048dbcd64b3396b3c860a2ffbcc67a8f8c87e736aaa74c2e505a7eee4c/grpcio_tools-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:394e8b57d85370a62e5b0a4d64c96fcf7568345c345d8590c821814d227ecf1d", size = 3657863, upload-time = "2026-02-06T09:58:59.176Z" }, + { url = "https://files.pythonhosted.org/packages/b6/37/e2736912c8fda57e2e57a66ea5e0bc8eb9a5fb7ded00e866ad22d50afb08/grpcio_tools-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3ef700293ab375e111a2909d87434ed0a0b086adf0ce67a8d9cf12ea7765e63", size = 3324748, upload-time = "2026-02-06T09:59:01.242Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/726abc75bb5bfc2841e88ea05896e42f51ca7c30cb56da5c5b63058b3867/grpcio_tools-1.78.0-cp313-cp313-win32.whl", hash = "sha256:6993b960fec43a8d840ee5dc20247ef206c1a19587ea49fe5e6cc3d2a09c1585", size = 993074, upload-time = "2026-02-06T09:59:03.085Z" }, + { url = "https://files.pythonhosted.org/packages/c5/68/91b400bb360faf9b177ffb5540ec1c4d06ca923691ddf0f79e2c9683f4da/grpcio_tools-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:275ce3c2978842a8cf9dd88dce954e836e590cf7029649ad5d1145b779039ed5", size = 1158185, upload-time = "2026-02-06T09:59:05.036Z" }, + { url = "https://files.pythonhosted.org/packages/cf/5e/278f3831c8d56bae02e3acc570465648eccf0a6bbedcb1733789ac966803/grpcio_tools-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:8b080d0d072e6032708a3a91731b808074d7ab02ca8fb9847b6a011fdce64cd9", size = 2546270, upload-time = "2026-02-06T09:59:07.426Z" }, + { url = "https://files.pythonhosted.org/packages/a3/d9/68582f2952b914b60dddc18a2e3f9c6f09af9372b6f6120d6cf3ec7f8b4e/grpcio_tools-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8c0ad8f8f133145cd7008b49cb611a5c6a9d89ab276c28afa17050516e801f79", size = 5705731, upload-time = "2026-02-06T09:59:09.856Z" }, + { url = "https://files.pythonhosted.org/packages/70/68/feb0f9a48818ee1df1e8b644069379a1e6ef5447b9b347c24e96fd258e5d/grpcio_tools-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2f8ea092a7de74c6359335d36f0674d939a3c7e1a550f4c2c9e80e0226de8fe4", size = 2593896, upload-time = "2026-02-06T09:59:12.23Z" }, + { url = "https://files.pythonhosted.org/packages/1f/08/a430d8d06e1b8d33f3e48d3f0cc28236723af2f35e37bd5c8db05df6c3aa/grpcio_tools-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:da422985e0cac822b41822f43429c19ecb27c81ffe3126d0b74e77edec452608", size = 2905298, upload-time = "2026-02-06T09:59:14.458Z" }, + { url = "https://files.pythonhosted.org/packages/71/0a/348c36a3eae101ca0c090c9c3bc96f2179adf59ee0c9262d11cdc7bfe7db/grpcio_tools-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4fab1faa3fbcb246263e68da7a8177d73772283f9db063fb8008517480888d26", size = 2656186, upload-time = "2026-02-06T09:59:16.949Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3f/18219f331536fad4af6207ade04142292faa77b5cb4f4463787988963df8/grpcio_tools-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dd9c094f73f734becae3f20f27d4944d3cd8fb68db7338ee6c58e62fc5c3d99f", size = 3109859, upload-time = "2026-02-06T09:59:19.202Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d9/341ea20a44c8e5a3a18acc820b65014c2e3ea5b4f32a53d14864bcd236bc/grpcio_tools-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2ed51ce6b833068f6c580b73193fc2ec16468e6bc18354bc2f83a58721195a58", size = 3657915, upload-time = "2026-02-06T09:59:21.839Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f4/5978b0f91611a64371424c109dd0027b247e5b39260abad2eaee66b6aa37/grpcio_tools-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:05803a5cdafe77c8bdf36aa660ad7a6a1d9e49bc59ce45c1bade2a4698826599", size = 3324724, upload-time = "2026-02-06T09:59:24.402Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/96a324dba99cfbd20e291baf0b0ae719dbb62b76178c5ce6c788e7331cb1/grpcio_tools-1.78.0-cp314-cp314-win32.whl", hash = "sha256:f7c722e9ce6f11149ac5bddd5056e70aaccfd8168e74e9d34d8b8b588c3f5c7c", size = 1015505, upload-time = "2026-02-06T09:59:26.3Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d1/909e6a05bfd44d46327dc4b8a78beb2bae4fb245ffab2772e350081aaf7e/grpcio_tools-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d58ade518b546120ec8f0a8e006fc8076ae5df151250ebd7e82e9b5e152c229", size = 1190196, upload-time = "2026-02-06T09:59:28.359Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/28/99c51f664567218d824af024c0251650fb27e4ca066df188dab0769c5b91/idna-3.17.tar.gz", hash = "sha256:5eb0cb53bc467c12eadcf6de83163ad8527cec9416f44b9b61b19caedad2b87f", size = 196048, upload-time = "2026-05-28T14:32:38.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/a7/f76514cc40ad6234098ecdebda08732d75964776c51a42845b7da10649e2/idna-3.17-py3-none-any.whl", hash = "sha256:466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c", size = 65316, upload-time = "2026-05-28T14:32:37.035Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "mypy-protobuf" +version = "5.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, + { name = "types-protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/07/7ffb897eee5c01e816e037f51a6720bf1a0a8c17cca1a2382ae554f43044/mypy_protobuf-5.1.0.tar.gz", hash = "sha256:8493758852a9cdc075a11dbe96c6e37ea2feba5fd5f33ef7442b9a275322a94c", size = 37529, upload-time = "2026-04-28T15:56:40.356Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/ec/5ffcf8f5f53757e01afdece10c664e694ac60d2f17c2036811b85b842a5b/mypy_protobuf-5.1.0-py3-none-any.whl", hash = "sha256:d7031f563f806b8bcd448a3e86768bf0994c0af5b0017b344a4fbbba4191f43c", size = 26313, upload-time = "2026-04-28T15:56:39.096Z" }, +] + +[[package]] +name = "openshell" +source = { editable = "." } +dependencies = [ + { name = "cloudpickle" }, + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "httpx" }, + { name = "protobuf" }, +] + +[package.dev-dependencies] +dev = [ + { name = "grpcio-tools" }, + { name = "mypy-protobuf" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "pytest-xdist" }, + { name = "pyyaml" }, + { name = "ruff" }, + { name = "ty" }, + { name = "types-grpcio" }, + { name = "types-protobuf" }, + { name = "types-pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "cloudpickle", specifier = ">=3.0" }, + { name = "googleapis-common-protos", specifier = ">=1.63" }, + { name = "grpcio", specifier = ">=1.60" }, + { name = "httpx", specifier = ">=0.27" }, + { name = "protobuf", specifier = ">=4.25" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "grpcio-tools", specifier = ">=1.60" }, + { name = "mypy-protobuf", specifier = ">=5.1" }, + { name = "pytest", specifier = ">=9.0.3" }, + { name = "pytest-asyncio", specifier = ">=0.23" }, + { name = "pytest-cov", specifier = ">=4.0" }, + { name = "pytest-xdist", specifier = ">=3.0" }, + { name = "pyyaml", specifier = "==6.0.2" }, + { name = "ruff", specifier = ">=0.4" }, + { name = "ty", specifier = ">=0.0.94" }, + { name = "types-grpcio", specifier = ">=1.0.0.20251009" }, + { name = "types-protobuf", specifier = ">=6.32,<7" }, + { name = "types-pyyaml", specifier = ">=6.0.12.20260518" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" }, + { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" }, + { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, +] + +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, +] + +[[package]] +name = "ruff" +version = "0.14.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +] + +[[package]] +name = "setuptools" +version = "84.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/eb/7e5f628ee2eb168fecbf8026de7856b2543d6d609cc85f086b9a91ac93d6/setuptools-84.1.0.tar.gz", hash = "sha256:23657205b63d4d31395ab917815247f694aafad28cd21316bf5fd45a51048ea0", size = 1171783, upload-time = "2026-10-19T20:11:43.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/02/b4bbb90f8f29e334898ff45c6d9b1fffaa6f378017052b3023a06262b5f7/setuptools-84.1.0-py3-none-any.whl", hash = "sha256:5231689c6ac8156cd155cfb98c3fd6fb252c3e7e9bd3d78b64d3c55f132624c9", size = 819380, upload-time = "2026-10-19T20:11:41.684Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "ty" +version = "0.0.94" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/c7/1257c8c70e46274664db1eaf2b8aba99a1277470daaa39c65e7decd67c8f/ty-0.0.94.tar.gz", hash = "sha256:933d2feca6057742d04af00c090621c139e7be2c059aa38b040a70532fd5104b", size = 8106769, upload-time = "2026-10-28T18:06:09.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/bd/5145d91cf196cb20fc3b005515b21266a419ea7336d3d7891a1769439259/ty-0.0.94-py3-none-linux_armv6l.whl", hash = "sha256:c6463c045880ad17df911a53d367eb2554b17538ca54911bea6ccb20ec95ee11", size = 14528574, upload-time = "2026-10-28T18:05:19.423Z" }, + { url = "https://files.pythonhosted.org/packages/29/0e/2b563132429b5fc6044095061fde4584548cb55abf0d6d9f2829c41ab226/ty-0.0.94-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ec3a3892f4290306c674586149668097cf44f13e8b381ba388662f5a440b459b", size = 14067146, upload-time = "2026-10-28T18:05:23.014Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/3a458362ea33ca9756cd6b914f905b3dec007d329b21d83e859ecee65a63/ty-0.0.94-py3-none-macosx_11_0_arm64.whl", hash = "sha256:74ddc6eeecd3251cf8980c9abb960d7eeab649dac5cdb7504910d99c479f84ab", size = 13148266, upload-time = "2026-10-28T18:05:25.769Z" }, + { url = "https://files.pythonhosted.org/packages/cd/38/5380bdaad2745a4e191deacce96403af74d1992ed8782d5766c301c32b50/ty-0.0.94-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31bdc3aace142400d7e22b4d32676c063ec42f0437d77940012c3dc60587ecdd", size = 13973583, upload-time = "2026-10-28T18:05:28.731Z" }, + { url = "https://files.pythonhosted.org/packages/1d/bc/7e1dc4f2594010aff6d1e2e34d0ff9003736210983be5720a04d69c27e03/ty-0.0.94-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fecacfe9c41ed1109aa503ed172d84b1b0fc283ee49aaf078d298dbe1c62e75f", size = 14269235, upload-time = "2026-10-28T18:05:31.697Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/43041f1c53164d6be21ace55047feffeaa8a9709782b01b06c951412b900/ty-0.0.94-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a49762bbc97a732847da8350ad0227c99ce2675fa32e3f58aa9f9ff4a81e4c14", size = 15191720, upload-time = "2026-10-28T18:05:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/f425d48b13cbf12b92e4f837a5866e9788e9ef4d5a071e2b12f54ee94da4/ty-0.0.94-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76a7b3aea839dfafb4bc068af918e0292b06ac26ea2a43f7ab3dd65548c0ed50", size = 15596604, upload-time = "2026-10-28T18:05:37.377Z" }, + { url = "https://files.pythonhosted.org/packages/13/ea/bd2da666ad4af596886833b095098fa9ff93685285f48bebc4d3865126e0/ty-0.0.94-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f032ce5a9c0c7033a5a8e748f952ece2e22afe2b148d211d05dca2cba8b28000", size = 15572711, upload-time = "2026-10-28T18:05:40.499Z" }, + { url = "https://files.pythonhosted.org/packages/44/f8/4f07eac57e9b60f49cc222d5048d9a61ac7f0902964ec8ac8d4ea8bc521d/ty-0.0.94-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc5e780c2107c1b83a21a394076da328e05a293ce06298df40ecab1ddc31d371", size = 16309102, upload-time = "2026-10-28T18:05:43.539Z" }, + { url = "https://files.pythonhosted.org/packages/22/39/c2ac7e14eb8ca59bd3c71b8c3055294524df84c476ba88545f59c11ceaf9/ty-0.0.94-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5bc969cdabf85aa66987c9b4818072e3af17ce5f2b7bc93550ab896c904c6c40", size = 15073645, upload-time = "2026-10-28T18:05:46.65Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7d/dd4935abf50a97ccc1f46cf6c921a7acdab30f102c3c56aa4e8d6cbc3fa9/ty-0.0.94-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:27bbaff0d7bbcb3e92ed7cab07d6b26dc7ed7fa28ff69910324e5cc347c7b256", size = 13936242, upload-time = "2026-10-28T18:05:49.726Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f0/b65fa6ccde2d629e25031bf2cc2d21ac7b50ee6e0e3d29a5f471c4686c54/ty-0.0.94-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d0960eb71220300655d67db91073fd180f385186b1d186e76faa2fd3ae5bd10f", size = 14280351, upload-time = "2026-10-28T18:05:52.521Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d2/5c901ad5e4f5444852b002b1f4dd3a0b470039305c688facc0483bfccd1a/ty-0.0.94-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab04c14bca92ab92106ceaa19a962a80998389700cf7938576ba3936a304355d", size = 14611163, upload-time = "2026-10-28T18:05:55.208Z" }, + { url = "https://files.pythonhosted.org/packages/6d/99/37d8633e9b5d1dcf1b06f12466825ff0c4028664994e573c352546ee9cbd/ty-0.0.94-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a92ebefa092e6bd58cb5719626858df744575473e2de0cd1c44abd44b9b84b57", size = 14938978, upload-time = "2026-10-28T18:05:58.17Z" }, + { url = "https://files.pythonhosted.org/packages/51/13/804b1f993bf84a819385f8b440fbc4b894499e2c20d865cd74d69327e7b8/ty-0.0.94-py3-none-win32.whl", hash = "sha256:3212dcf30b7567f2bb65a83cdfc4818a5385f82e7afddd83548b0d84e759057e", size = 13448009, upload-time = "2026-10-28T18:06:01.111Z" }, + { url = "https://files.pythonhosted.org/packages/a1/23/81850750cda0ea781ba9d6e08cea1a1039361cb3474c7dd03765bbc4b51f/ty-0.0.94-py3-none-win_amd64.whl", hash = "sha256:daf5bafe8e7d21b8a99a56fc8518f2342a2dbcaa370a5c25cfaedc684088d158", size = 14010576, upload-time = "2026-10-28T18:06:03.773Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/ac3a759556493230823abd31e149c95401f96b9cac36567bd403a8454ea3/ty-0.0.94-py3-none-win_arm64.whl", hash = "sha256:ce344353ccdc542cfcfd6abe1481cf23c005f483411ea79652b78ce0beae36f2", size = 13547398, upload-time = "2026-10-28T18:06:06.379Z" }, +] + +[[package]] +name = "types-grpcio" +version = "1.85.0.20261028" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/6b/5248f1b10df2c02ffbd99f3c913259bf73cabd2bee0ca1c28d6f3e66c3f4/types_grpcio-1.85.0.20261028.tar.gz", hash = "sha256:4ea4f36a54cf9a62fcb09515f7305e89c01f4edca54b32de24f6b1204b84522c", size = 16127, upload-time = "2026-10-28T07:38:58.025Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/ee/e2b2f2d677478456869ca922c1d5bb68f64052c9dfd9ad6c2a91a1122269/types_grpcio-1.85.0.20261028-py3-none-any.whl", hash = "sha256:2c2684330ae57ab64ffb43183ac652e73d2609024e6076e3e9d2b8ae06816207", size = 16076, upload-time = "2026-10-28T07:38:57.193Z" }, +] + +[[package]] +name = "types-protobuf" +version = "6.32.1.20260221" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/e2/9aa4a3b2469508bd7b4e2ae11cbedaf419222a09a1b94daffcd5efca4023/types_protobuf-6.32.1.20260221.tar.gz", hash = "sha256:6d5fb060a616bfb076cbb61b4b3c3969f5fc8bec5810f9a2f7e648ee5cbcbf6e", size = 64408, upload-time = "2026-02-21T03:55:13.916Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/e8/1fd38926f9cf031188fbc5a96694203ea6f24b0e34bd64a225ec6f6291ba/types_protobuf-6.32.1.20260221-py3-none-any.whl", hash = "sha256:da7cdd947975964a93c30bfbcc2c6841ee646b318d3816b033adc2c4eb6448e4", size = 77956, upload-time = "2026-02-21T03:55:12.894Z" }, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.20260518" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/83/4a1afc3fbfcf5b8d46fc390cd95ed6b0dc9010a265f4e9f46314efffa37a/types_pyyaml-6.0.12.20260518.tar.gz", hash = "sha256:d917f83fb38462550338c1297faedd860b3ec83912b96b1e3d73255f7473e466", size = 17850, upload-time = "2026-05-18T06:01:58.675Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/a2/c01db32be2ae7d6a1689972f3c492b149ee4e164b12fdfd9f64b50888215/types_pyyaml-6.0.12.20260518-py3-none-any.whl", hash = "sha256:d2150f75a231c9fe9c7463bd29487d93e60bac90400287351384bc2284eba7cd", size = 20312, upload-time = "2026-05-18T06:01:57.368Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] From d01926db75e89b661edf28e7d4fd216ec706d31f Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 15:19:17 -0800 Subject: [PATCH 04/12] build: commit the generated bindings for core v0.1.7 Output of mise run proto:gen. The files are byte-identical to openshell/_proto in the openshell 0.1.7 wheel on PyPI. .gitattributes marks them as generated. Signed-off-by: Piotr Mlocek --- src/openshell/_proto/credential_driver_pb2.py | 69 + .../_proto/credential_driver_pb2.pyi | 141 + .../_proto/credential_driver_pb2_grpc.py | 292 ++ .../_proto/credential_driver_pb2_grpc.pyi | 121 + src/openshell/_proto/datamodel_pb2.py | 82 + src/openshell/_proto/datamodel_pb2.pyi | 144 + src/openshell/_proto/datamodel_pb2_grpc.py | 24 + src/openshell/_proto/datamodel_pb2_grpc.pyi | 22 + src/openshell/_proto/extension_pb2.py | 38 + src/openshell/_proto/extension_pb2.pyi | 29 + src/openshell/_proto/extension_pb2_grpc.py | 24 + src/openshell/_proto/extension_pb2_grpc.pyi | 22 + src/openshell/_proto/openshell_pb2.py | 906 ++++ src/openshell/_proto/openshell_pb2.pyi | 3414 ++++++++++++++ src/openshell/_proto/openshell_pb2_grpc.py | 4014 +++++++++++++++++ src/openshell/_proto/openshell_pb2_grpc.pyi | 1328 ++++++ src/openshell/_proto/options_pb2.py | 37 + src/openshell/_proto/options_pb2.pyi | 22 + src/openshell/_proto/options_pb2_grpc.py | 24 + src/openshell/_proto/options_pb2_grpc.pyi | 22 + src/openshell/_proto/sandbox_pb2.py | 145 + src/openshell/_proto/sandbox_pb2.pyi | 528 +++ src/openshell/_proto/sandbox_pb2_grpc.py | 24 + src/openshell/_proto/sandbox_pb2_grpc.pyi | 22 + 24 files changed, 11494 insertions(+) create mode 100644 src/openshell/_proto/credential_driver_pb2.py create mode 100644 src/openshell/_proto/credential_driver_pb2.pyi create mode 100644 src/openshell/_proto/credential_driver_pb2_grpc.py create mode 100644 src/openshell/_proto/credential_driver_pb2_grpc.pyi create mode 100644 src/openshell/_proto/datamodel_pb2.py create mode 100644 src/openshell/_proto/datamodel_pb2.pyi create mode 100644 src/openshell/_proto/datamodel_pb2_grpc.py create mode 100644 src/openshell/_proto/datamodel_pb2_grpc.pyi create mode 100644 src/openshell/_proto/extension_pb2.py create mode 100644 src/openshell/_proto/extension_pb2.pyi create mode 100644 src/openshell/_proto/extension_pb2_grpc.py create mode 100644 src/openshell/_proto/extension_pb2_grpc.pyi create mode 100644 src/openshell/_proto/openshell_pb2.py create mode 100644 src/openshell/_proto/openshell_pb2.pyi create mode 100644 src/openshell/_proto/openshell_pb2_grpc.py create mode 100644 src/openshell/_proto/openshell_pb2_grpc.pyi create mode 100644 src/openshell/_proto/options_pb2.py create mode 100644 src/openshell/_proto/options_pb2.pyi create mode 100644 src/openshell/_proto/options_pb2_grpc.py create mode 100644 src/openshell/_proto/options_pb2_grpc.pyi create mode 100644 src/openshell/_proto/sandbox_pb2.py create mode 100644 src/openshell/_proto/sandbox_pb2.pyi create mode 100644 src/openshell/_proto/sandbox_pb2_grpc.py create mode 100644 src/openshell/_proto/sandbox_pb2_grpc.pyi diff --git a/src/openshell/_proto/credential_driver_pb2.py b/src/openshell/_proto/credential_driver_pb2.py new file mode 100644 index 0000000..3b2011a --- /dev/null +++ b/src/openshell/_proto/credential_driver_pb2.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: credential_driver.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'credential_driver.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from . import datamodel_pb2 as datamodel__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from . import extension_pb2 as extension__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x63redential_driver.proto\x12\x18openshell.credentials.v1\x1a\x0f\x64\x61tamodel.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x0f\x65xtension.proto\"_\n&GetCredentialDriverCapabilitiesRequest\x12\x35\n\x07gateway\x18\x01 \x01(\x0b\x32$.openshell.extension.v1.PeerMetadata\"\xd9\x01\n\'GetCredentialDriverCapabilitiesResponse\x12\x13\n\x0b\x64river_name\x18\x01 \x01(\t\x12\x16\n\x0e\x64river_version\x18\x02 \x01(\t\x12\x14\n\x0c\x62\x61\x63kend_kind\x18\x03 \x01(\t\x12\x15\n\rsupports_list\x18\x04 \x01(\x08\x12\x1b\n\x13supports_expires_at\x18\x05 \x01(\x08\x12\x37\n\textension\x18\x06 \x01(\x0b\x32$.openshell.extension.v1.PeerMetadata\"\xcf\x01\n\x16StoreCredentialRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\x12\x41\n\x0f\x65xisting_handle\x18\x04 \x01(\x0b\x32(.openshell.datamodel.v1.CredentialHandle\x12\x11\n\tworkspace\x18\x05 \x01(\t\x12\x13\n\x0bprovider_id\x18\x06 \x01(\t\x12\x11\n\tobject_id\x18\x07 \x01(\t\"S\n\x17StoreCredentialResponse\x12\x38\n\x06handle\x18\x01 \x01(\x0b\x32(.openshell.datamodel.v1.CredentialHandle\"\xa5\x01\n\x17\x44\x65leteCredentialRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x02 \x01(\t\x12\x38\n\x06handle\x18\x03 \x01(\x0b\x32(.openshell.datamodel.v1.CredentialHandle\x12\x11\n\tworkspace\x18\x04 \x01(\t\x12\x13\n\x0bprovider_id\x18\x05 \x01(\t\"\x1a\n\x18\x44\x65leteCredentialResponse\"d\n\x19ResolveCredentialsRequest\x12G\n\x0b\x63redentials\x18\x01 \x03(\x0b\x32\x32.openshell.credentials.v1.ResolveCredentialRequest\"\xba\x01\n\x18ResolveCredentialRequest\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\x10\n\x08provider\x18\x02 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x03 \x01(\t\x12\x38\n\x06handle\x18\x04 \x01(\x0b\x32(.openshell.datamodel.v1.CredentialHandle\x12\x11\n\tworkspace\x18\x05 \x01(\t\x12\x13\n\x0bprovider_id\x18\x06 \x01(\t\"_\n\x1aResolveCredentialsResponse\x12\x41\n\x0b\x63redentials\x18\x01 \x03(\x0b\x32,.openshell.credentials.v1.ResolvedCredential\"\x81\x01\n\x12ResolvedCredential\x12\x12\n\nrequest_id\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x33\n\x0f\x65xpiration_time\x18g \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x03\x10\x04R\rexpires_at_ms\"\x18\n\x16ListCredentialsRequest\"Z\n\x17ListCredentialsResponse\x12?\n\x0b\x63redentials\x18\x01 \x03(\x0b\x32*.openshell.credentials.v1.ListedCredential\"\xad\x01\n\x10ListedCredential\x12\x0e\n\x06handle\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12J\n\x08metadata\x18\x03 \x03(\x0b\x32\x38.openshell.credentials.v1.ListedCredential.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x32\x97\x05\n\x10\x43redentialDriver\x12\x96\x01\n\x0fGetCapabilities\x12@.openshell.credentials.v1.GetCredentialDriverCapabilitiesRequest\x1a\x41.openshell.credentials.v1.GetCredentialDriverCapabilitiesResponse\x12v\n\x0fStoreCredential\x12\x30.openshell.credentials.v1.StoreCredentialRequest\x1a\x31.openshell.credentials.v1.StoreCredentialResponse\x12y\n\x10\x44\x65leteCredential\x12\x31.openshell.credentials.v1.DeleteCredentialRequest\x1a\x32.openshell.credentials.v1.DeleteCredentialResponse\x12\x7f\n\x12ResolveCredentials\x12\x33.openshell.credentials.v1.ResolveCredentialsRequest\x1a\x34.openshell.credentials.v1.ResolveCredentialsResponse\x12v\n\x0fListCredentials\x12\x30.openshell.credentials.v1.ListCredentialsRequest\x1a\x31.openshell.credentials.v1.ListCredentialsResponseb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'credential_driver_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_LISTEDCREDENTIAL_METADATAENTRY']._loaded_options = None + _globals['_LISTEDCREDENTIAL_METADATAENTRY']._serialized_options = b'8\001' + _globals['_GETCREDENTIALDRIVERCAPABILITIESREQUEST']._serialized_start=120 + _globals['_GETCREDENTIALDRIVERCAPABILITIESREQUEST']._serialized_end=215 + _globals['_GETCREDENTIALDRIVERCAPABILITIESRESPONSE']._serialized_start=218 + _globals['_GETCREDENTIALDRIVERCAPABILITIESRESPONSE']._serialized_end=435 + _globals['_STORECREDENTIALREQUEST']._serialized_start=438 + _globals['_STORECREDENTIALREQUEST']._serialized_end=645 + _globals['_STORECREDENTIALRESPONSE']._serialized_start=647 + _globals['_STORECREDENTIALRESPONSE']._serialized_end=730 + _globals['_DELETECREDENTIALREQUEST']._serialized_start=733 + _globals['_DELETECREDENTIALREQUEST']._serialized_end=898 + _globals['_DELETECREDENTIALRESPONSE']._serialized_start=900 + _globals['_DELETECREDENTIALRESPONSE']._serialized_end=926 + _globals['_RESOLVECREDENTIALSREQUEST']._serialized_start=928 + _globals['_RESOLVECREDENTIALSREQUEST']._serialized_end=1028 + _globals['_RESOLVECREDENTIALREQUEST']._serialized_start=1031 + _globals['_RESOLVECREDENTIALREQUEST']._serialized_end=1217 + _globals['_RESOLVECREDENTIALSRESPONSE']._serialized_start=1219 + _globals['_RESOLVECREDENTIALSRESPONSE']._serialized_end=1314 + _globals['_RESOLVEDCREDENTIAL']._serialized_start=1317 + _globals['_RESOLVEDCREDENTIAL']._serialized_end=1446 + _globals['_LISTCREDENTIALSREQUEST']._serialized_start=1448 + _globals['_LISTCREDENTIALSREQUEST']._serialized_end=1472 + _globals['_LISTCREDENTIALSRESPONSE']._serialized_start=1474 + _globals['_LISTCREDENTIALSRESPONSE']._serialized_end=1564 + _globals['_LISTEDCREDENTIAL']._serialized_start=1567 + _globals['_LISTEDCREDENTIAL']._serialized_end=1740 + _globals['_LISTEDCREDENTIAL_METADATAENTRY']._serialized_start=1693 + _globals['_LISTEDCREDENTIAL_METADATAENTRY']._serialized_end=1740 + _globals['_CREDENTIALDRIVER']._serialized_start=1743 + _globals['_CREDENTIALDRIVER']._serialized_end=2406 +# @@protoc_insertion_point(module_scope) diff --git a/src/openshell/_proto/credential_driver_pb2.pyi b/src/openshell/_proto/credential_driver_pb2.pyi new file mode 100644 index 0000000..0aba0a8 --- /dev/null +++ b/src/openshell/_proto/credential_driver_pb2.pyi @@ -0,0 +1,141 @@ +import datetime + +from . import datamodel_pb2 as _datamodel_pb2 +from google.protobuf import timestamp_pb2 as _timestamp_pb2 +from . import extension_pb2 as _extension_pb2 +from google.protobuf.internal import containers as _containers +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class GetCredentialDriverCapabilitiesRequest(_message.Message): + __slots__ = ("gateway",) + GATEWAY_FIELD_NUMBER: _ClassVar[int] + gateway: _extension_pb2.PeerMetadata + def __init__(self, gateway: _Optional[_Union[_extension_pb2.PeerMetadata, _Mapping]] = ...) -> None: ... + +class GetCredentialDriverCapabilitiesResponse(_message.Message): + __slots__ = ("driver_name", "driver_version", "backend_kind", "supports_list", "supports_expires_at", "extension") + DRIVER_NAME_FIELD_NUMBER: _ClassVar[int] + DRIVER_VERSION_FIELD_NUMBER: _ClassVar[int] + BACKEND_KIND_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_LIST_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_EXPIRES_AT_FIELD_NUMBER: _ClassVar[int] + EXTENSION_FIELD_NUMBER: _ClassVar[int] + driver_name: str + driver_version: str + backend_kind: str + supports_list: bool + supports_expires_at: bool + extension: _extension_pb2.PeerMetadata + def __init__(self, driver_name: _Optional[str] = ..., driver_version: _Optional[str] = ..., backend_kind: _Optional[str] = ..., supports_list: bool = ..., supports_expires_at: bool = ..., extension: _Optional[_Union[_extension_pb2.PeerMetadata, _Mapping]] = ...) -> None: ... + +class StoreCredentialRequest(_message.Message): + __slots__ = ("provider", "credential_key", "value", "existing_handle", "workspace", "provider_id", "object_id") + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + EXISTING_HANDLE_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] + OBJECT_ID_FIELD_NUMBER: _ClassVar[int] + provider: str + credential_key: str + value: str + existing_handle: _datamodel_pb2.CredentialHandle + workspace: str + provider_id: str + object_id: str + def __init__(self, provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., value: _Optional[str] = ..., existing_handle: _Optional[_Union[_datamodel_pb2.CredentialHandle, _Mapping]] = ..., workspace: _Optional[str] = ..., provider_id: _Optional[str] = ..., object_id: _Optional[str] = ...) -> None: ... + +class StoreCredentialResponse(_message.Message): + __slots__ = ("handle",) + HANDLE_FIELD_NUMBER: _ClassVar[int] + handle: _datamodel_pb2.CredentialHandle + def __init__(self, handle: _Optional[_Union[_datamodel_pb2.CredentialHandle, _Mapping]] = ...) -> None: ... + +class DeleteCredentialRequest(_message.Message): + __slots__ = ("provider", "credential_key", "handle", "workspace", "provider_id") + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + HANDLE_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] + provider: str + credential_key: str + handle: _datamodel_pb2.CredentialHandle + workspace: str + provider_id: str + def __init__(self, provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., handle: _Optional[_Union[_datamodel_pb2.CredentialHandle, _Mapping]] = ..., workspace: _Optional[str] = ..., provider_id: _Optional[str] = ...) -> None: ... + +class DeleteCredentialResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class ResolveCredentialsRequest(_message.Message): + __slots__ = ("credentials",) + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + credentials: _containers.RepeatedCompositeFieldContainer[ResolveCredentialRequest] + def __init__(self, credentials: _Optional[_Iterable[_Union[ResolveCredentialRequest, _Mapping]]] = ...) -> None: ... + +class ResolveCredentialRequest(_message.Message): + __slots__ = ("request_id", "provider", "credential_key", "handle", "workspace", "provider_id") + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + HANDLE_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] + request_id: str + provider: str + credential_key: str + handle: _datamodel_pb2.CredentialHandle + workspace: str + provider_id: str + def __init__(self, request_id: _Optional[str] = ..., provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., handle: _Optional[_Union[_datamodel_pb2.CredentialHandle, _Mapping]] = ..., workspace: _Optional[str] = ..., provider_id: _Optional[str] = ...) -> None: ... + +class ResolveCredentialsResponse(_message.Message): + __slots__ = ("credentials",) + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + credentials: _containers.RepeatedCompositeFieldContainer[ResolvedCredential] + def __init__(self, credentials: _Optional[_Iterable[_Union[ResolvedCredential, _Mapping]]] = ...) -> None: ... + +class ResolvedCredential(_message.Message): + __slots__ = ("request_id", "value", "expiration_time") + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + request_id: str + value: str + expiration_time: _timestamp_pb2.Timestamp + def __init__(self, request_id: _Optional[str] = ..., value: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ListCredentialsRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class ListCredentialsResponse(_message.Message): + __slots__ = ("credentials",) + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + credentials: _containers.RepeatedCompositeFieldContainer[ListedCredential] + def __init__(self, credentials: _Optional[_Iterable[_Union[ListedCredential, _Mapping]]] = ...) -> None: ... + +class ListedCredential(_message.Message): + __slots__ = ("handle", "keys", "metadata") + class MetadataEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + HANDLE_FIELD_NUMBER: _ClassVar[int] + KEYS_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + handle: str + keys: _containers.RepeatedScalarFieldContainer[str] + metadata: _containers.ScalarMap[str, str] + def __init__(self, handle: _Optional[str] = ..., keys: _Optional[_Iterable[str]] = ..., metadata: _Optional[_Mapping[str, str]] = ...) -> None: ... diff --git a/src/openshell/_proto/credential_driver_pb2_grpc.py b/src/openshell/_proto/credential_driver_pb2_grpc.py new file mode 100644 index 0000000..37c1f05 --- /dev/null +++ b/src/openshell/_proto/credential_driver_pb2_grpc.py @@ -0,0 +1,292 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +from . import credential_driver_pb2 as credential__driver__pb2 + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in credential_driver_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class CredentialDriverStub(object): + """Internal credential-driver contract used by the gateway. + + The gateway owns provider semantics and sandbox delivery. Credential drivers + own backend-specific storage, deletion, authentication, and lookup for + gateway-managed provider-secret handles. Secrets include injectable provider + credentials and gateway-only refresh material. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetCapabilities = channel.unary_unary( + '/openshell.credentials.v1.CredentialDriver/GetCapabilities', + request_serializer=credential__driver__pb2.GetCredentialDriverCapabilitiesRequest.SerializeToString, + response_deserializer=credential__driver__pb2.GetCredentialDriverCapabilitiesResponse.FromString, + _registered_method=True) + self.StoreCredential = channel.unary_unary( + '/openshell.credentials.v1.CredentialDriver/StoreCredential', + request_serializer=credential__driver__pb2.StoreCredentialRequest.SerializeToString, + response_deserializer=credential__driver__pb2.StoreCredentialResponse.FromString, + _registered_method=True) + self.DeleteCredential = channel.unary_unary( + '/openshell.credentials.v1.CredentialDriver/DeleteCredential', + request_serializer=credential__driver__pb2.DeleteCredentialRequest.SerializeToString, + response_deserializer=credential__driver__pb2.DeleteCredentialResponse.FromString, + _registered_method=True) + self.ResolveCredentials = channel.unary_unary( + '/openshell.credentials.v1.CredentialDriver/ResolveCredentials', + request_serializer=credential__driver__pb2.ResolveCredentialsRequest.SerializeToString, + response_deserializer=credential__driver__pb2.ResolveCredentialsResponse.FromString, + _registered_method=True) + self.ListCredentials = channel.unary_unary( + '/openshell.credentials.v1.CredentialDriver/ListCredentials', + request_serializer=credential__driver__pb2.ListCredentialsRequest.SerializeToString, + response_deserializer=credential__driver__pb2.ListCredentialsResponse.FromString, + _registered_method=True) + + +class CredentialDriverServicer(object): + """Internal credential-driver contract used by the gateway. + + The gateway owns provider semantics and sandbox delivery. Credential drivers + own backend-specific storage, deletion, authentication, and lookup for + gateway-managed provider-secret handles. Secrets include injectable provider + credentials and gateway-only refresh material. + """ + + def GetCapabilities(self, request, context): + """Report driver identity and feature support. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StoreCredential(self, request, context): + """Store or overwrite one gateway-managed provider secret and return an opaque handle. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteCredential(self, request, context): + """Delete one provider credential handle. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ResolveCredentials(self, request, context): + """Resolve a batch of credential handles into string secret values. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListCredentials(self, request, context): + """Optionally list discoverable credentials. Drivers may return UNIMPLEMENTED. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_CredentialDriverServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetCapabilities': grpc.unary_unary_rpc_method_handler( + servicer.GetCapabilities, + request_deserializer=credential__driver__pb2.GetCredentialDriverCapabilitiesRequest.FromString, + response_serializer=credential__driver__pb2.GetCredentialDriverCapabilitiesResponse.SerializeToString, + ), + 'StoreCredential': grpc.unary_unary_rpc_method_handler( + servicer.StoreCredential, + request_deserializer=credential__driver__pb2.StoreCredentialRequest.FromString, + response_serializer=credential__driver__pb2.StoreCredentialResponse.SerializeToString, + ), + 'DeleteCredential': grpc.unary_unary_rpc_method_handler( + servicer.DeleteCredential, + request_deserializer=credential__driver__pb2.DeleteCredentialRequest.FromString, + response_serializer=credential__driver__pb2.DeleteCredentialResponse.SerializeToString, + ), + 'ResolveCredentials': grpc.unary_unary_rpc_method_handler( + servicer.ResolveCredentials, + request_deserializer=credential__driver__pb2.ResolveCredentialsRequest.FromString, + response_serializer=credential__driver__pb2.ResolveCredentialsResponse.SerializeToString, + ), + 'ListCredentials': grpc.unary_unary_rpc_method_handler( + servicer.ListCredentials, + request_deserializer=credential__driver__pb2.ListCredentialsRequest.FromString, + response_serializer=credential__driver__pb2.ListCredentialsResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'openshell.credentials.v1.CredentialDriver', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('openshell.credentials.v1.CredentialDriver', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class CredentialDriver(object): + """Internal credential-driver contract used by the gateway. + + The gateway owns provider semantics and sandbox delivery. Credential drivers + own backend-specific storage, deletion, authentication, and lookup for + gateway-managed provider-secret handles. Secrets include injectable provider + credentials and gateway-only refresh material. + """ + + @staticmethod + def GetCapabilities(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.credentials.v1.CredentialDriver/GetCapabilities', + credential__driver__pb2.GetCredentialDriverCapabilitiesRequest.SerializeToString, + credential__driver__pb2.GetCredentialDriverCapabilitiesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StoreCredential(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.credentials.v1.CredentialDriver/StoreCredential', + credential__driver__pb2.StoreCredentialRequest.SerializeToString, + credential__driver__pb2.StoreCredentialResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteCredential(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.credentials.v1.CredentialDriver/DeleteCredential', + credential__driver__pb2.DeleteCredentialRequest.SerializeToString, + credential__driver__pb2.DeleteCredentialResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ResolveCredentials(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.credentials.v1.CredentialDriver/ResolveCredentials', + credential__driver__pb2.ResolveCredentialsRequest.SerializeToString, + credential__driver__pb2.ResolveCredentialsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListCredentials(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.credentials.v1.CredentialDriver/ListCredentials', + credential__driver__pb2.ListCredentialsRequest.SerializeToString, + credential__driver__pb2.ListCredentialsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/src/openshell/_proto/credential_driver_pb2_grpc.pyi b/src/openshell/_proto/credential_driver_pb2_grpc.pyi new file mode 100644 index 0000000..0451f94 --- /dev/null +++ b/src/openshell/_proto/credential_driver_pb2_grpc.pyi @@ -0,0 +1,121 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 +""" + +from collections import abc as _abc +from grpc import aio as _aio +import abc as _abc_1 +from . import credential_driver_pb2 as _credential_driver_pb2 +import grpc as _grpc +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import Self as _Self +else: + from typing_extensions import Self as _Self + +_T = _typing.TypeVar("_T") + +class _MaybeAsyncIterator(_abc.AsyncIterator[_T], _abc.Iterator[_T], metaclass=_abc_1.ABCMeta): ... + +class _ServicerContext(_grpc.ServicerContext, _aio.ServicerContext): # type: ignore[misc, type-arg] + ... + +GRPC_GENERATED_VERSION: str +GRPC_VERSION: str + +class CredentialDriverStub: + """Internal credential-driver contract used by the gateway. + + The gateway owns provider semantics and sandbox delivery. Credential drivers + own backend-specific storage, deletion, authentication, and lookup for + gateway-managed provider-secret handles. Secrets include injectable provider + credentials and gateway-only refresh material. + """ + + @_typing.overload + def __new__(cls, channel: _grpc.Channel) -> _Self: ... + @_typing.overload + def __new__(cls, channel: _aio.Channel) -> CredentialDriverAsyncStub: ... + GetCapabilities: _grpc.UnaryUnaryMultiCallable[_credential_driver_pb2.GetCredentialDriverCapabilitiesRequest, _credential_driver_pb2.GetCredentialDriverCapabilitiesResponse] + """Report driver identity and feature support.""" + StoreCredential: _grpc.UnaryUnaryMultiCallable[_credential_driver_pb2.StoreCredentialRequest, _credential_driver_pb2.StoreCredentialResponse] + """Store or overwrite one gateway-managed provider secret and return an opaque handle.""" + DeleteCredential: _grpc.UnaryUnaryMultiCallable[_credential_driver_pb2.DeleteCredentialRequest, _credential_driver_pb2.DeleteCredentialResponse] + """Delete one provider credential handle.""" + ResolveCredentials: _grpc.UnaryUnaryMultiCallable[_credential_driver_pb2.ResolveCredentialsRequest, _credential_driver_pb2.ResolveCredentialsResponse] + """Resolve a batch of credential handles into string secret values.""" + ListCredentials: _grpc.UnaryUnaryMultiCallable[_credential_driver_pb2.ListCredentialsRequest, _credential_driver_pb2.ListCredentialsResponse] + """Optionally list discoverable credentials. Drivers may return UNIMPLEMENTED.""" + +@_typing.type_check_only +class CredentialDriverAsyncStub(CredentialDriverStub): + """Internal credential-driver contract used by the gateway. + + The gateway owns provider semantics and sandbox delivery. Credential drivers + own backend-specific storage, deletion, authentication, and lookup for + gateway-managed provider-secret handles. Secrets include injectable provider + credentials and gateway-only refresh material. + """ + + def __init__(self, channel: _aio.Channel) -> None: ... + GetCapabilities: _aio.UnaryUnaryMultiCallable[_credential_driver_pb2.GetCredentialDriverCapabilitiesRequest, _credential_driver_pb2.GetCredentialDriverCapabilitiesResponse] # type: ignore[assignment] + """Report driver identity and feature support.""" + StoreCredential: _aio.UnaryUnaryMultiCallable[_credential_driver_pb2.StoreCredentialRequest, _credential_driver_pb2.StoreCredentialResponse] # type: ignore[assignment] + """Store or overwrite one gateway-managed provider secret and return an opaque handle.""" + DeleteCredential: _aio.UnaryUnaryMultiCallable[_credential_driver_pb2.DeleteCredentialRequest, _credential_driver_pb2.DeleteCredentialResponse] # type: ignore[assignment] + """Delete one provider credential handle.""" + ResolveCredentials: _aio.UnaryUnaryMultiCallable[_credential_driver_pb2.ResolveCredentialsRequest, _credential_driver_pb2.ResolveCredentialsResponse] # type: ignore[assignment] + """Resolve a batch of credential handles into string secret values.""" + ListCredentials: _aio.UnaryUnaryMultiCallable[_credential_driver_pb2.ListCredentialsRequest, _credential_driver_pb2.ListCredentialsResponse] # type: ignore[assignment] + """Optionally list discoverable credentials. Drivers may return UNIMPLEMENTED.""" + +class CredentialDriverServicer: + """Internal credential-driver contract used by the gateway. + + The gateway owns provider semantics and sandbox delivery. Credential drivers + own backend-specific storage, deletion, authentication, and lookup for + gateway-managed provider-secret handles. Secrets include injectable provider + credentials and gateway-only refresh material. + """ + + def GetCapabilities( + self, + request: _credential_driver_pb2.GetCredentialDriverCapabilitiesRequest, + context: _ServicerContext, + ) -> _typing.Union[_credential_driver_pb2.GetCredentialDriverCapabilitiesResponse, _abc.Awaitable[_credential_driver_pb2.GetCredentialDriverCapabilitiesResponse]]: + """Report driver identity and feature support.""" + + def StoreCredential( + self, + request: _credential_driver_pb2.StoreCredentialRequest, + context: _ServicerContext, + ) -> _typing.Union[_credential_driver_pb2.StoreCredentialResponse, _abc.Awaitable[_credential_driver_pb2.StoreCredentialResponse]]: + """Store or overwrite one gateway-managed provider secret and return an opaque handle.""" + + def DeleteCredential( + self, + request: _credential_driver_pb2.DeleteCredentialRequest, + context: _ServicerContext, + ) -> _typing.Union[_credential_driver_pb2.DeleteCredentialResponse, _abc.Awaitable[_credential_driver_pb2.DeleteCredentialResponse]]: + """Delete one provider credential handle.""" + + def ResolveCredentials( + self, + request: _credential_driver_pb2.ResolveCredentialsRequest, + context: _ServicerContext, + ) -> _typing.Union[_credential_driver_pb2.ResolveCredentialsResponse, _abc.Awaitable[_credential_driver_pb2.ResolveCredentialsResponse]]: + """Resolve a batch of credential handles into string secret values.""" + + def ListCredentials( + self, + request: _credential_driver_pb2.ListCredentialsRequest, + context: _ServicerContext, + ) -> _typing.Union[_credential_driver_pb2.ListCredentialsResponse, _abc.Awaitable[_credential_driver_pb2.ListCredentialsResponse]]: + """Optionally list discoverable credentials. Drivers may return UNIMPLEMENTED.""" + +def add_CredentialDriverServicer_to_server(servicer: CredentialDriverServicer, server: _typing.Union[_grpc.Server, _aio.Server]) -> None: ... diff --git a/src/openshell/_proto/datamodel_pb2.py b/src/openshell/_proto/datamodel_pb2.py new file mode 100644 index 0000000..c877346 --- /dev/null +++ b/src/openshell/_proto/datamodel_pb2.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: datamodel.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'datamodel.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from . import options_pb2 as options__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0f\x64\x61tamodel.proto\x12\x16openshell.datamodel.v1\x1a\roptions.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"v\n\x11WorkspaceSelector\x12\x13\n\tworkspace\x18\x01 \x01(\tH\x00\x12?\n\x0e\x61ll_workspaces\x18\x02 \x01(\x0b\x32%.openshell.datamodel.v1.AllWorkspacesH\x00\x42\x0b\n\tselection\"\x0f\n\rAllWorkspaces\"\xd7\x03\n\nObjectMeta\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x30\n\x0c\x63reated_time\x18g \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x06labels\x18\x04 \x03(\x0b\x32..openshell.datamodel.v1.ObjectMeta.LabelsEntry\x12\x18\n\x10resource_version\x18\x05 \x01(\x04\x12H\n\x0b\x61nnotations\x18\x06 \x03(\x0b\x32\x33.openshell.datamodel.v1.ObjectMeta.AnnotationsEntry\x12\x11\n\tworkspace\x18\x07 \x01(\t\x12\x31\n\rdeletion_time\x18l \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x32\n\x10\x41nnotationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\x03\x10\x04J\x04\x08\x08\x10\tR\rcreated_at_msR\x15\x64\x65letion_timestamp_ms\"H\n\x0fWorkspaceStatus\x12\x35\n\x05phase\x18\x01 \x01(\x0e\x32&.openshell.datamodel.v1.WorkspacePhase\"z\n\tWorkspace\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".openshell.datamodel.v1.ObjectMeta\x12\x37\n\x06status\x18\x02 \x01(\x0b\x32\'.openshell.datamodel.v1.WorkspaceStatus\"\xad\x01\n\x10\x43redentialHandle\x12\x0e\n\x06\x64river\x18\x01 \x01(\t\x12\x0e\n\x06handle\x18\x02 \x01(\t\x12H\n\x08metadata\x18\x03 \x03(\x0b\x32\x36.openshell.datamodel.v1.CredentialHandle.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf5\x05\n\x08Provider\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".openshell.datamodel.v1.ObjectMeta\x12\x0c\n\x04type\x18\x02 \x01(\t\x12L\n\x0b\x63redentials\x18\x03 \x03(\x0b\x32\x31.openshell.datamodel.v1.Provider.CredentialsEntryB\x04\x88\xb5\x18\x01\x12<\n\x06\x63onfig\x18\x04 \x03(\x0b\x32,.openshell.datamodel.v1.Provider.ConfigEntry\x12\x64\n\x1b\x63redential_expiration_times\x18i \x03(\x0b\x32?.openshell.datamodel.v1.Provider.CredentialExpirationTimesEntry\x12\x19\n\x11profile_workspace\x18\x06 \x01(\t\x12S\n\x12\x63redential_handles\x18\x07 \x03(\x0b\x32\x37.openshell.datamodel.v1.Provider.CredentialHandlesEntry\x1a\x32\n\x10\x43redentialsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a-\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\\\n\x1e\x43redentialExpirationTimesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp:\x02\x38\x01\x1a\x62\n\x16\x43redentialHandlesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x37\n\x05value\x18\x02 \x01(\x0b\x32(.openshell.datamodel.v1.CredentialHandle:\x02\x38\x01J\x04\x08\x05\x10\x06R\x18\x63redential_expires_at_ms*n\n\x0eWorkspacePhase\x12\x1f\n\x1bWORKSPACE_PHASE_UNSPECIFIED\x10\x00\x12\x1a\n\x16WORKSPACE_PHASE_ACTIVE\x10\x01\x12\x1f\n\x1bWORKSPACE_PHASE_TERMINATING\x10\x02\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'datamodel_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_OBJECTMETA_LABELSENTRY']._loaded_options = None + _globals['_OBJECTMETA_LABELSENTRY']._serialized_options = b'8\001' + _globals['_OBJECTMETA_ANNOTATIONSENTRY']._loaded_options = None + _globals['_OBJECTMETA_ANNOTATIONSENTRY']._serialized_options = b'8\001' + _globals['_CREDENTIALHANDLE_METADATAENTRY']._loaded_options = None + _globals['_CREDENTIALHANDLE_METADATAENTRY']._serialized_options = b'8\001' + _globals['_PROVIDER_CREDENTIALSENTRY']._loaded_options = None + _globals['_PROVIDER_CREDENTIALSENTRY']._serialized_options = b'8\001' + _globals['_PROVIDER_CONFIGENTRY']._loaded_options = None + _globals['_PROVIDER_CONFIGENTRY']._serialized_options = b'8\001' + _globals['_PROVIDER_CREDENTIALEXPIRATIONTIMESENTRY']._loaded_options = None + _globals['_PROVIDER_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_options = b'8\001' + _globals['_PROVIDER_CREDENTIALHANDLESENTRY']._loaded_options = None + _globals['_PROVIDER_CREDENTIALHANDLESENTRY']._serialized_options = b'8\001' + _globals['_PROVIDER'].fields_by_name['credentials']._loaded_options = None + _globals['_PROVIDER'].fields_by_name['credentials']._serialized_options = b'\210\265\030\001' + _globals['_WORKSPACEPHASE']._serialized_start=1836 + _globals['_WORKSPACEPHASE']._serialized_end=1946 + _globals['_WORKSPACESELECTOR']._serialized_start=91 + _globals['_WORKSPACESELECTOR']._serialized_end=209 + _globals['_ALLWORKSPACES']._serialized_start=211 + _globals['_ALLWORKSPACES']._serialized_end=226 + _globals['_OBJECTMETA']._serialized_start=229 + _globals['_OBJECTMETA']._serialized_end=700 + _globals['_OBJECTMETA_LABELSENTRY']._serialized_start=553 + _globals['_OBJECTMETA_LABELSENTRY']._serialized_end=598 + _globals['_OBJECTMETA_ANNOTATIONSENTRY']._serialized_start=600 + _globals['_OBJECTMETA_ANNOTATIONSENTRY']._serialized_end=650 + _globals['_WORKSPACESTATUS']._serialized_start=702 + _globals['_WORKSPACESTATUS']._serialized_end=774 + _globals['_WORKSPACE']._serialized_start=776 + _globals['_WORKSPACE']._serialized_end=898 + _globals['_CREDENTIALHANDLE']._serialized_start=901 + _globals['_CREDENTIALHANDLE']._serialized_end=1074 + _globals['_CREDENTIALHANDLE_METADATAENTRY']._serialized_start=1027 + _globals['_CREDENTIALHANDLE_METADATAENTRY']._serialized_end=1074 + _globals['_PROVIDER']._serialized_start=1077 + _globals['_PROVIDER']._serialized_end=1834 + _globals['_PROVIDER_CREDENTIALSENTRY']._serialized_start=1511 + _globals['_PROVIDER_CREDENTIALSENTRY']._serialized_end=1561 + _globals['_PROVIDER_CONFIGENTRY']._serialized_start=1563 + _globals['_PROVIDER_CONFIGENTRY']._serialized_end=1608 + _globals['_PROVIDER_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_start=1610 + _globals['_PROVIDER_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_end=1702 + _globals['_PROVIDER_CREDENTIALHANDLESENTRY']._serialized_start=1704 + _globals['_PROVIDER_CREDENTIALHANDLESENTRY']._serialized_end=1802 +# @@protoc_insertion_point(module_scope) diff --git a/src/openshell/_proto/datamodel_pb2.pyi b/src/openshell/_proto/datamodel_pb2.pyi new file mode 100644 index 0000000..4c7d301 --- /dev/null +++ b/src/openshell/_proto/datamodel_pb2.pyi @@ -0,0 +1,144 @@ +import datetime + +from . import options_pb2 as _options_pb2 +from google.protobuf import timestamp_pb2 as _timestamp_pb2 +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class WorkspacePhase(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + WORKSPACE_PHASE_UNSPECIFIED: _ClassVar[WorkspacePhase] + WORKSPACE_PHASE_ACTIVE: _ClassVar[WorkspacePhase] + WORKSPACE_PHASE_TERMINATING: _ClassVar[WorkspacePhase] +WORKSPACE_PHASE_UNSPECIFIED: WorkspacePhase +WORKSPACE_PHASE_ACTIVE: WorkspacePhase +WORKSPACE_PHASE_TERMINATING: WorkspacePhase + +class WorkspaceSelector(_message.Message): + __slots__ = ("workspace", "all_workspaces") + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + ALL_WORKSPACES_FIELD_NUMBER: _ClassVar[int] + workspace: str + all_workspaces: AllWorkspaces + def __init__(self, workspace: _Optional[str] = ..., all_workspaces: _Optional[_Union[AllWorkspaces, _Mapping]] = ...) -> None: ... + +class AllWorkspaces(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class ObjectMeta(_message.Message): + __slots__ = ("id", "name", "created_time", "labels", "resource_version", "annotations", "workspace", "deletion_time") + class LabelsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + class AnnotationsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + ID_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + CREATED_TIME_FIELD_NUMBER: _ClassVar[int] + LABELS_FIELD_NUMBER: _ClassVar[int] + RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + DELETION_TIME_FIELD_NUMBER: _ClassVar[int] + id: str + name: str + created_time: _timestamp_pb2.Timestamp + labels: _containers.ScalarMap[str, str] + resource_version: int + annotations: _containers.ScalarMap[str, str] + workspace: str + deletion_time: _timestamp_pb2.Timestamp + def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., created_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., labels: _Optional[_Mapping[str, str]] = ..., resource_version: _Optional[int] = ..., annotations: _Optional[_Mapping[str, str]] = ..., workspace: _Optional[str] = ..., deletion_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class WorkspaceStatus(_message.Message): + __slots__ = ("phase",) + PHASE_FIELD_NUMBER: _ClassVar[int] + phase: WorkspacePhase + def __init__(self, phase: _Optional[_Union[WorkspacePhase, str]] = ...) -> None: ... + +class Workspace(_message.Message): + __slots__ = ("metadata", "status") + METADATA_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + metadata: ObjectMeta + status: WorkspaceStatus + def __init__(self, metadata: _Optional[_Union[ObjectMeta, _Mapping]] = ..., status: _Optional[_Union[WorkspaceStatus, _Mapping]] = ...) -> None: ... + +class CredentialHandle(_message.Message): + __slots__ = ("driver", "handle", "metadata") + class MetadataEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + DRIVER_FIELD_NUMBER: _ClassVar[int] + HANDLE_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + driver: str + handle: str + metadata: _containers.ScalarMap[str, str] + def __init__(self, driver: _Optional[str] = ..., handle: _Optional[str] = ..., metadata: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class Provider(_message.Message): + __slots__ = ("metadata", "type", "credentials", "config", "credential_expiration_times", "profile_workspace", "credential_handles") + class CredentialsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + class ConfigEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + class CredentialExpirationTimesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _timestamp_pb2.Timestamp + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + class CredentialHandlesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: CredentialHandle + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[CredentialHandle, _Mapping]] = ...) -> None: ... + METADATA_FIELD_NUMBER: _ClassVar[int] + TYPE_FIELD_NUMBER: _ClassVar[int] + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + CONFIG_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_EXPIRATION_TIMES_FIELD_NUMBER: _ClassVar[int] + PROFILE_WORKSPACE_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_HANDLES_FIELD_NUMBER: _ClassVar[int] + metadata: ObjectMeta + type: str + credentials: _containers.ScalarMap[str, str] + config: _containers.ScalarMap[str, str] + credential_expiration_times: _containers.MessageMap[str, _timestamp_pb2.Timestamp] + profile_workspace: str + credential_handles: _containers.MessageMap[str, CredentialHandle] + def __init__(self, metadata: _Optional[_Union[ObjectMeta, _Mapping]] = ..., type: _Optional[str] = ..., credentials: _Optional[_Mapping[str, str]] = ..., config: _Optional[_Mapping[str, str]] = ..., credential_expiration_times: _Optional[_Mapping[str, _timestamp_pb2.Timestamp]] = ..., profile_workspace: _Optional[str] = ..., credential_handles: _Optional[_Mapping[str, CredentialHandle]] = ...) -> None: ... diff --git a/src/openshell/_proto/datamodel_pb2_grpc.py b/src/openshell/_proto/datamodel_pb2_grpc.py new file mode 100644 index 0000000..5d6bffc --- /dev/null +++ b/src/openshell/_proto/datamodel_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in datamodel_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/src/openshell/_proto/datamodel_pb2_grpc.pyi b/src/openshell/_proto/datamodel_pb2_grpc.pyi new file mode 100644 index 0000000..3127e0d --- /dev/null +++ b/src/openshell/_proto/datamodel_pb2_grpc.pyi @@ -0,0 +1,22 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 +""" + +from collections import abc as _abc +from grpc import aio as _aio +import abc as _abc_1 +import grpc as _grpc +import typing as _typing + +_T = _typing.TypeVar("_T") + +class _MaybeAsyncIterator(_abc.AsyncIterator[_T], _abc.Iterator[_T], metaclass=_abc_1.ABCMeta): ... + +class _ServicerContext(_grpc.ServicerContext, _aio.ServicerContext): # type: ignore[misc, type-arg] + ... + +GRPC_GENERATED_VERSION: str +GRPC_VERSION: str diff --git a/src/openshell/_proto/extension_pb2.py b/src/openshell/_proto/extension_pb2.py new file mode 100644 index 0000000..480ed23 --- /dev/null +++ b/src/openshell/_proto/extension_pb2.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: extension.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'extension.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0f\x65xtension.proto\x12\x16openshell.extension.v1\"/\n\x0fProtocolVersion\x12\r\n\x05major\x18\x01 \x01(\r\x12\r\n\x05minor\x18\x02 \x01(\r\"\xcd\x01\n\x0cPeerMetadata\x12\x41\n\x10protocol_version\x18\x01 \x01(\x0b\x32\'.openshell.extension.v1.ProtocolVersion\x12\x1b\n\x13implementation_name\x18\x02 \x01(\t\x12\x1e\n\x16implementation_version\x18\x03 \x01(\t\x12\x1e\n\x16supported_capabilities\x18\x04 \x03(\t\x12\x1d\n\x15required_capabilities\x18\x05 \x03(\tb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'extension_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_PROTOCOLVERSION']._serialized_start=43 + _globals['_PROTOCOLVERSION']._serialized_end=90 + _globals['_PEERMETADATA']._serialized_start=93 + _globals['_PEERMETADATA']._serialized_end=298 +# @@protoc_insertion_point(module_scope) diff --git a/src/openshell/_proto/extension_pb2.pyi b/src/openshell/_proto/extension_pb2.pyi new file mode 100644 index 0000000..0cab88d --- /dev/null +++ b/src/openshell/_proto/extension_pb2.pyi @@ -0,0 +1,29 @@ +from google.protobuf.internal import containers as _containers +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class ProtocolVersion(_message.Message): + __slots__ = ("major", "minor") + MAJOR_FIELD_NUMBER: _ClassVar[int] + MINOR_FIELD_NUMBER: _ClassVar[int] + major: int + minor: int + def __init__(self, major: _Optional[int] = ..., minor: _Optional[int] = ...) -> None: ... + +class PeerMetadata(_message.Message): + __slots__ = ("protocol_version", "implementation_name", "implementation_version", "supported_capabilities", "required_capabilities") + PROTOCOL_VERSION_FIELD_NUMBER: _ClassVar[int] + IMPLEMENTATION_NAME_FIELD_NUMBER: _ClassVar[int] + IMPLEMENTATION_VERSION_FIELD_NUMBER: _ClassVar[int] + SUPPORTED_CAPABILITIES_FIELD_NUMBER: _ClassVar[int] + REQUIRED_CAPABILITIES_FIELD_NUMBER: _ClassVar[int] + protocol_version: ProtocolVersion + implementation_name: str + implementation_version: str + supported_capabilities: _containers.RepeatedScalarFieldContainer[str] + required_capabilities: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, protocol_version: _Optional[_Union[ProtocolVersion, _Mapping]] = ..., implementation_name: _Optional[str] = ..., implementation_version: _Optional[str] = ..., supported_capabilities: _Optional[_Iterable[str]] = ..., required_capabilities: _Optional[_Iterable[str]] = ...) -> None: ... diff --git a/src/openshell/_proto/extension_pb2_grpc.py b/src/openshell/_proto/extension_pb2_grpc.py new file mode 100644 index 0000000..519ff69 --- /dev/null +++ b/src/openshell/_proto/extension_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in extension_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/src/openshell/_proto/extension_pb2_grpc.pyi b/src/openshell/_proto/extension_pb2_grpc.pyi new file mode 100644 index 0000000..3127e0d --- /dev/null +++ b/src/openshell/_proto/extension_pb2_grpc.pyi @@ -0,0 +1,22 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 +""" + +from collections import abc as _abc +from grpc import aio as _aio +import abc as _abc_1 +import grpc as _grpc +import typing as _typing + +_T = _typing.TypeVar("_T") + +class _MaybeAsyncIterator(_abc.AsyncIterator[_T], _abc.Iterator[_T], metaclass=_abc_1.ABCMeta): ... + +class _ServicerContext(_grpc.ServicerContext, _aio.ServicerContext): # type: ignore[misc, type-arg] + ... + +GRPC_GENERATED_VERSION: str +GRPC_VERSION: str diff --git a/src/openshell/_proto/openshell_pb2.py b/src/openshell/_proto/openshell_pb2.py new file mode 100644 index 0000000..36045b8 --- /dev/null +++ b/src/openshell/_proto/openshell_pb2.py @@ -0,0 +1,906 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: openshell.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'openshell.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from . import datamodel_pb2 as datamodel__pb2 +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 +from . import options_pb2 as options__pb2 +from . import sandbox_pb2 as sandbox__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fopenshell.proto\x12\x0copenshell.v1\x1a\x0f\x64\x61tamodel.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\roptions.proto\x1a\rsandbox.proto\"\x1a\n\x18IssueSandboxTokenRequest\"z\n\x19IssueSandboxTokenResponse\x12\x13\n\x05token\x18\x01 \x01(\tB\x04\x88\xb5\x18\x01\x12\x33\n\x0f\x65xpiration_time\x18\x66 \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x02\x10\x03R\rexpires_at_ms\"=\n\x1aRefreshSandboxTokenRequest\x12\x1f\n\x17\x65xtension_service_names\x18\x01 \x03(\t\"\xea\x02\n\x1bRefreshSandboxTokenResponse\x12\x13\n\x05token\x18\x01 \x01(\tB\x04\x88\xb5\x18\x01\x12\x33\n\x0f\x65xpiration_time\x18\x66 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12G\n\x15\x65xtension_credentials\x18\x03 \x03(\x0b\x32(.openshell.v1.ExtensionServiceCredential\x12\x1b\n\rsandbox_token\x18\x04 \x01(\tB\x04\x88\xb5\x18\x01\x12;\n\x17sandbox_expiration_time\x18i \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nsession_id\x18\x06 \x01(\t\x12\x18\n\x10\x63redential_epoch\x18\x07 \x01(\x04J\x04\x08\x02\x10\x03J\x04\x08\x05\x10\x06R\rexpires_at_msR\x15sandbox_expires_at_ms\"\x0f\n\rHealthRequest\"N\n\x0eHealthResponse\x12+\n\x06status\x18\x01 \x01(\x0e\x32\x1b.openshell.v1.ServiceStatus\x12\x0f\n\x07version\x18\x02 \x01(\t\"\x17\n\x15GetCurrentUserRequest\"y\n\x16GetCurrentUserResponse\x12\x0f\n\x07subject\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\r\n\x05roles\x18\x03 \x03(\t\x12\x0e\n\x06scopes\x18\x04 \x03(\t\x12\x19\n\x11identity_provider\x18\x05 \x01(\t\"\x17\n\x15GetGatewayInfoRequest\"\xd3\x01\n\x16GetGatewayInfoResponse\x12+\n\x06status\x18\x01 \x01(\x0e\x32\x1b.openshell.v1.ServiceStatus\x12\x17\n\x0fgateway_version\x18\x02 \x01(\t\x12\x38\n\x0f\x63ompute_drivers\x18\x03 \x03(\x0b\x32\x1f.openshell.v1.ComputeDriverInfo\x12\x39\n\nextensions\x18\x04 \x03(\x0b\x32%.openshell.v1.NegotiatedExtensionInfo\"\x89\x02\n\x17NegotiatedExtensionInfo\x12)\n\x04kind\x18\x01 \x01(\x0e\x32\x1b.openshell.v1.ExtensionKind\x12\x17\n\x0f\x63onfigured_name\x18\x02 \x01(\t\x12\x1b\n\x13implementation_name\x18\x03 \x01(\t\x12\x1e\n\x16implementation_version\x18\x04 \x01(\t\x12\x16\n\x0eprotocol_major\x18\x05 \x01(\r\x12\x16\n\x0eprotocol_minor\x18\x06 \x01(\r\x12\x1e\n\x16supported_capabilities\x18\x07 \x03(\t\x12\x1d\n\x15required_capabilities\x18\x08 \x03(\t\"`\n\x11\x43omputeDriverInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12=\n\x0c\x63\x61pabilities\x18\x02 \x01(\x0b\x32\'.openshell.v1.ComputeDriverCapabilities\"\x8b\x01\n\x19\x43omputeDriverCapabilities\x12\x13\n\x0b\x64river_name\x18\x01 \x01(\t\x12\x16\n\x0e\x64river_version\x18\x02 \x01(\t\x12\x41\n\x15resource_capabilities\x18\x03 \x01(\x0b\x32\".openshell.v1.ResourceCapabilities\"\xb8\x01\n\x14ResourceCapabilities\x12\x32\n\x03\x63pu\x18\x01 \x01(\x0b\x32%.openshell.v1.CpuResourceCapabilities\x12\x38\n\x06memory\x18\x02 \x01(\x0b\x32(.openshell.v1.MemoryResourceCapabilities\x12\x32\n\x03gpu\x18\x03 \x01(\x0b\x32%.openshell.v1.GpuResourceCapabilities\"2\n\x17\x43puResourceCapabilities\x12\x17\n\x0flimit_supported\x18\x01 \x01(\x08\"5\n\x1aMemoryResourceCapabilities\x12\x17\n\x0flimit_supported\x18\x01 \x01(\x08\"a\n\x17GpuResourceCapabilities\x12#\n\x1b\x64\x65\x66\x61ult_selection_supported\x18\x01 \x01(\x08\x12!\n\x19\x63ount_selection_supported\x18\x02 \x01(\x08\"\xb7\x02\n\x07Sandbox\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".openshell.datamodel.v1.ObjectMeta\x12\'\n\x04spec\x18\x02 \x01(\x0b\x32\x19.openshell.v1.SandboxSpec\x12+\n\x06status\x18\x03 \x01(\x0b\x32\x1b.openshell.v1.SandboxStatus\x12\x1c\n\x14host_key_fingerprint\x18\x06 \x01(\t\x12W\n\x1e\x63reated_from_workload_template\x18\x14 \x01(\x0b\x32/.openshell.v1.SandboxWorkloadTemplateProvenanceJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06R\x05phaseR\x16\x63urrent_policy_version\"\xfe\x03\n\x0bSandboxSpec\x12\x11\n\tlog_level\x18\x01 \x01(\t\x12?\n\x0b\x65nvironment\x18\x05 \x03(\x0b\x32*.openshell.v1.SandboxSpec.EnvironmentEntry\x12/\n\x08template\x18\x06 \x01(\x0b\x32\x1d.openshell.v1.SandboxTemplate\x12\x33\n\x06policy\x18\x07 \x01(\x0b\x32#.openshell.sandbox.v1.SandboxPolicy\x12\x11\n\tproviders\x18\x08 \x03(\t\x12\x41\n\x15resource_requirements\x18\t \x01(\x0b\x32\".openshell.v1.ResourceRequirements\x12\x0f\n\x07\x63ommand\x18\x0c \x03(\t\x12\x0b\n\x03tty\x18\r \x01(\x08\x12!\n\x19provider_attachment_epoch\x18\x0e \x01(\t\x12:\n\x0erestart_policy\x18\x0f \x01(\x0e\x32\".openshell.v1.SandboxRestartPolicy\x1a\x32\n\x10\x45nvironmentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\n\x10\x0bJ\x04\x08\x0b\x10\x0cR\ngpu_deviceR\x16proposal_approval_mode\"J\n\x14ResourceRequirements\x12\x32\n\x03gpu\x18\x01 \x01(\x0b\x32%.openshell.v1.GpuResourceRequirements\"7\n\x17GpuResourceRequirements\x12\x12\n\x05\x63ount\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\x08\n\x06_count\"\xda\x04\n\x0fSandboxTemplate\x12\r\n\x05image\x18\x01 \x01(\t\x12\x1a\n\x12runtime_class_name\x18\x02 \x01(\t\x12\x14\n\x0c\x61gent_socket\x18\x03 \x01(\t\x12\x39\n\x06labels\x18\x04 \x03(\x0b\x32).openshell.v1.SandboxTemplate.LabelsEntry\x12\x43\n\x0b\x61nnotations\x18\x05 \x03(\x0b\x32..openshell.v1.SandboxTemplate.AnnotationsEntry\x12\x43\n\x0b\x65nvironment\x18\x06 \x03(\x0b\x32..openshell.v1.SandboxTemplate.EnvironmentEntry\x12*\n\tresources\x18\x07 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x1c\n\x0fuser_namespaces\x18\n \x01(\x08H\x00\x88\x01\x01\x12.\n\rdriver_config\x18\x0b \x01(\x0b\x32\x17.google.protobuf.Struct\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x32\n\x10\x41nnotationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x32\n\x10\x45nvironmentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x12\n\x10_user_namespacesJ\x04\x08\t\x10\nR\x16volume_claim_templates\"\x88\x01\n\x17SandboxWorkloadTemplate\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".openshell.datamodel.v1.ObjectMeta\x12\x37\n\x04spec\x18\x02 \x01(\x0b\x32).openshell.v1.SandboxWorkloadTemplateSpec\"\xc6\x01\n\x1bSandboxWorkloadTemplateSpec\x12\x35\n\x08workload\x18\x01 \x01(\x0b\x32#.openshell.v1.SandboxWorkloadConfig\x12.\n\rdriver_config\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12@\n\x15\x64\x65sired_service_level\x18\x03 \x01(\x0b\x32!.openshell.v1.SandboxServiceLevel\"\xd8\x01\n\x15SandboxWorkloadConfig\x12\r\n\x05image\x18\x01 \x01(\t\x12I\n\x0b\x65nvironment\x18\x02 \x03(\x0b\x32\x34.openshell.v1.SandboxWorkloadConfig.EnvironmentEntry\x12\x31\n\tresources\x18\x03 \x01(\x0b\x32\x1e.openshell.v1.SandboxResources\x1a\x32\n\x10\x45nvironmentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"c\n\x10SandboxResources\x12\x0b\n\x03\x63pu\x18\x01 \x01(\t\x12\x0e\n\x06memory\x18\x02 \x01(\t\x12\x32\n\x03gpu\x18\x03 \x01(\x0b\x32%.openshell.v1.GpuResourceRequirements\"D\n\x13SandboxServiceLevel\x12-\n\x07startup\x18\x01 \x01(\x0b\x32\x1c.openshell.v1.SandboxStartup\"T\n\x0eSandboxStartup\x12/\n\x0cready_within\x18\x01 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x11\n\tmax_burst\x18\x02 \x01(\r\"K\n!SandboxWorkloadTemplateProvenance\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10resource_version\x18\x02 \x01(\t\"\xec\x05\n\rSandboxStatus\x12\x11\n\tagent_pod\x18\x02 \x01(\t\x12\x10\n\x08\x61gent_fd\x18\x03 \x01(\t\x12\x12\n\nsandbox_fd\x18\x04 \x01(\t\x12\x32\n\nconditions\x18\x05 \x03(\x0b\x32\x1e.openshell.v1.SandboxCondition\x12)\n\x05phase\x18\x06 \x01(\x0e\x32\x1a.openshell.v1.SandboxPhase\x12\x1e\n\x16\x63urrent_policy_version\x18\x07 \x01(\r\x12 \n\x18main_process_instance_id\x18\x08 \x01(\t\x12\x16\n\texit_code\x18\t \x01(\x05H\x00\x88\x01\x01\x12\x37\n\x11\x65ndpoint_statuses\x18\n \x03(\x0b\x32\x1c.openshell.v1.EndpointStatus\x12L\n\x17\x63onfiguration_admission\x18\x0b \x01(\x0b\x32+.openshell.v1.SandboxConfigurationAdmission\x12$\n\x17\x63onfiguration_activated\x18\x0c \x01(\x08H\x01\x88\x01\x01\x12\x37\n\x0cprovisioning\x18\r \x01(\x0b\x32!.openshell.v1.SandboxProvisioning\x12\x15\n\rrestart_count\x18\x0e \x01(\r\x12\x35\n\x11next_restart_time\x18\x0f \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12=\n\x19main_process_started_time\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12L\n\x18last_token_grant_failure\x18\x11 \x01(\x0b\x32*.openshell.v1.TokenGrantFailureObservationB\x0c\n\n_exit_codeB\x1a\n\x18_configuration_activated\"\xa2\x01\n\x10SandboxCondition\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x0f\n\x07message\x18\x04 \x01(\t\x12\x33\n\x0ftransition_time\x18i \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x05\x10\x06R\x14last_transition_time\"\x80\x02\n\rPlatformEvent\x12.\n\nevent_time\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0e\n\x06reason\x18\x04 \x01(\t\x12\x0f\n\x07message\x18\x05 \x01(\t\x12;\n\x08metadata\x18\x06 \x03(\x0b\x32).openshell.v1.PlatformEvent.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\x01\x10\x02R\x0ctimestamp_ms\"\x95\x04\n\x14\x43reateSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x07 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\'\n\x04spec\x18\x01 \x01(\x0b\x32\x19.openshell.v1.SandboxSpec\x12\x0c\n\x04name\x18\x02 \x01(\t\x12>\n\x06labels\x18\x03 \x03(\x0b\x32..openshell.v1.CreateSandboxRequest.LabelsEntry\x12H\n\x0b\x61nnotations\x18\x04 \x03(\x0b\x32\x33.openshell.v1.CreateSandboxRequest.AnnotationsEntry\x12%\n\x1d\x61wait_main_process_attachment\x18\x05 \x01(\x08\x12\x19\n\x11workload_template\x18\x06 \x01(\t\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x12?\n\x11service_exposures\x18\t \x03(\x0b\x32$.openshell.v1.SandboxServiceExposure\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x32\n\x10\x41nnotationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x8c\x03\n\x14UpdateSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x01 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\x05image\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x33\n\x07\x63ommand\x18\x06 \x01(\x0b\x32\".openshell.v1.SandboxCommandUpdate\x12\x33\n\x0b\x65nvironment\x18\x07 \x01(\x0b\x32\x1e.openshell.v1.SandboxMapUpdate\x12.\n\x06labels\x18\x08 \x01(\x0b\x32\x1e.openshell.v1.SandboxMapUpdate\x12\x33\n\x0b\x61nnotations\x18\t \x01(\x0b\x32\x1e.openshell.v1.SandboxMapUpdate\x12!\n\x19\x65xpected_resource_version\x18\x04 \x01(\x04\x12\x12\n\nrequest_id\x18\x05 \x01(\tB\x08\n\x06_image\"$\n\x14SandboxCommandUpdate\x12\x0c\n\x04\x61rgv\x18\x01 \x03(\t\"}\n\x10SandboxMapUpdate\x12:\n\x06values\x18\x01 \x03(\x0b\x32*.openshell.v1.SandboxMapUpdate.ValuesEntry\x1a-\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xaf\x01\n\x1c\x43reateSandboxTemplateRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x37\n\x08template\x18\x01 \x01(\x0b\x32%.openshell.v1.SandboxWorkloadTemplate\x12\x12\n\nrequest_id\x18\x03 \x01(\t\"m\n\x19GetSandboxTemplateRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xa0\x01\n\x1bListSandboxTemplatesRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x12\n\npage_token\x18\x02 \x01(\t\x12\x16\n\x0elabel_selector\x18\x03 \x01(\t\"\x9b\x01\n\x1c\x44\x65leteSandboxTemplateRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rallow_missing\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\"R\n\x17SandboxTemplateResponse\x12\x37\n\x08template\x18\x01 \x01(\x0b\x32%.openshell.v1.SandboxWorkloadTemplate\"q\n\x1cListSandboxTemplatesResponse\x12\x38\n\ttemplates\x18\x01 \x03(\x0b\x32%.openshell.v1.SandboxWorkloadTemplate\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"^\n\x1d\x44\x65leteSandboxTemplateResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07\x64\x65leted\"\x89\x01\n\x1c\x42\x65ginRootfsTarStagingRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x04\"\xa8\x01\n\x1d\x42\x65ginRootfsTarStagingResponse\x12\x15\n\rstaging_token\x18\x01 \x01(\t\x12\x13\n\x0bupload_path\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\x04\x12\x33\n\x0f\x65xpiration_time\x18h \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x04\x10\x05R\rexpires_at_ms\"e\n\x11GetSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x99\x01\n\x14ListSandboxesRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x12\n\npage_token\x18\x02 \x01(\t\x12\x16\n\x0elabel_selector\x18\x03 \x01(\t\"\x99\x01\n\x1bListSandboxProvidersRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x11\n\tpage_size\x18\x03 \x01(\x05\x12\x12\n\npage_token\x18\x04 \x01(\t\"\xbc\x01\n\x1c\x41ttachSandboxProviderRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x10\n\x08provider\x18\x02 \x01(\t\x12!\n\x19\x65xpected_resource_version\x18\x03 \x01(\x04\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"\xbc\x01\n\x1c\x44\x65tachSandboxProviderRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x10\n\x08provider\x18\x02 \x01(\t\x12!\n\x19\x65xpected_resource_version\x18\x03 \x01(\x04\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"\x93\x01\n\x14\x44\x65leteSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rallow_missing\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\"z\n\x12StopSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\"{\n\x13StartSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\"i\n\x15SuspendSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x8a\x01\n\x14ResumeSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\x12 \n\x18restart_if_restore_fails\x18\x03 \x01(\x08\"\xb3\x01\n\x0fSandboxResponse\x12&\n\x07sandbox\x18\x01 \x01(\x0b\x32\x15.openshell.v1.Sandbox\x12\x44\n\x0cservice_urls\x18\x02 \x03(\x0b\x32..openshell.v1.SandboxResponse.ServiceUrlsEntry\x1a\x32\n\x10ServiceUrlsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"Z\n\x15ListSandboxesResponse\x12(\n\tsandboxes\x18\x01 \x03(\x0b\x32\x15.openshell.v1.Sandbox\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"l\n\x1cListSandboxProvidersResponse\x12\x33\n\tproviders\x18\x01 \x03(\x0b\x32 .openshell.datamodel.v1.Provider\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x91\x01\n\x1d\x41ttachSandboxProviderResponse\x12&\n\x07sandbox\x18\x01 \x01(\x0b\x32\x15.openshell.v1.Sandbox\x12\x10\n\x08\x61ttached\x18\x02 \x01(\x08\x12\x36\n\x07receipt\x18\x03 \x01(\x0b\x32%.openshell.v1.ProviderMutationReceipt\"\x91\x01\n\x1d\x44\x65tachSandboxProviderResponse\x12&\n\x07sandbox\x18\x01 \x01(\x0b\x32\x15.openshell.v1.Sandbox\x12\x10\n\x08\x64\x65tached\x18\x02 \x01(\x08\x12\x36\n\x07receipt\x18\x03 \x01(\x0b\x32%.openshell.v1.ProviderMutationReceipt\"\xdd\x01\n\x17ProviderDesiredIdentity\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x0f\n\x07sandbox\x18\x02 \x01(\t\x12\x18\n\x10\x61ttachment_epoch\x18\x03 \x01(\t\x12\x13\n\x0bprovider_id\x18\x04 \x01(\t\x12!\n\x19provider_resource_version\x18\x05 \x01(\x04\x12\x1d\n\x15provider_env_revision\x18\x06 \x01(\x04\x12\x17\n\x0f\x63onfig_revision\x18\x07 \x01(\x04\x12\x13\n\x0bpolicy_hash\x18\x08 \x01(\t\"\xc6\x01\n\x16\x43onfigSnapshotRevision\x12=\n\x0esandbox_config\x18\x01 \x01(\x0b\x32#.openshell.v1.SandboxConfigRevisionH\x00\x12\x1e\n\x14provider_environment\x18\x02 \x01(\x04H\x00\x12@\n\x0fprovider_target\x18\x03 \x01(\x0b\x32%.openshell.v1.ProviderDesiredIdentityH\x00\x42\x0b\n\tcomponent\"\xbd\x01\n\x15SandboxConfigRevision\x12\x17\n\x0f\x63onfig_revision\x18\x01 \x01(\x04\x12\x16\n\x0epolicy_version\x18\x02 \x01(\r\x12\x39\n\rpolicy_source\x18\x03 \x01(\x0e\x32\".openshell.sandbox.v1.PolicySource\x12\x1d\n\x15global_policy_version\x18\x04 \x01(\r\x12\x19\n\x11settings_revision\x18\x05 \x01(\x04\"\x90\x04\n\x15\x43onfigUpdateOperation\x12\x14\n\x0coperation_id\x18\x01 \x01(\t\x12\x12\n\nsandbox_id\x18\x02 \x01(\t\x12\x30\n\tcomponent\x18\x03 \x01(\x0e\x32\x1d.openshell.v1.ConfigComponent\x12=\n\x0ftarget_revision\x18\x04 \x01(\x0b\x32$.openshell.v1.ConfigSnapshotRevision\x12\x37\n\x05state\x18\x05 \x01(\x0e\x32(.openshell.v1.ConfigUpdateOperationState\x12\x31\n\x07outcome\x18\x06 \x01(\x0e\x32 .openshell.v1.ConfigApplyOutcome\x12\x17\n\x0fsanitized_error\x18\x07 \x01(\t\x12\x30\n\x0c\x63reated_time\x18l \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0cupdated_time\x18m \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x32\n\x0e\x63ompleted_time\x18n \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\n\x10\x0bR\rcreated_at_msR\rupdated_at_msR\x0f\x63ompleted_at_ms\"\x9c\x02\n\x17ProviderMutationReceipt\x12\x12\n\nreceipt_id\x18\x01 \x01(\t\x12\x13\n\x0bmutation_id\x18\x02 \x01(\t\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x11\n\tworkspace\x18\x04 \x01(\t\x12\x30\n\x04kind\x18\x05 \x01(\x0e\x32\".openshell.v1.ProviderMutationKind\x12\x36\n\x07\x64\x65sired\x18\x06 \x01(\x0b\x32%.openshell.v1.ProviderDesiredIdentity\x12\x32\n\x0epersisted_time\x18k \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x07\x10\x08R\x0fpersisted_at_ms\"\xdb\x02\n\x1cProviderReadinessObservation\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x10\n\x08sequence\x18\x02 \x01(\x04\x12\x18\n\x10\x61ttachment_epoch\x18\x03 \x01(\t\x12\x1d\n\x15provider_env_revision\x18\x04 \x01(\x04\x12\x17\n\x0f\x63onfig_revision\x18\x05 \x01(\x04\x12\x13\n\x0bpolicy_hash\x18\x06 \x01(\t\x12\x1d\n\x15\x63redentials_installed\x18\x07 \x01(\x08\x12\x15\n\rpolicy_active\x18\x08 \x01(\x08\x12$\n\x1claunch_environment_installed\x18\t \x01(\x08\x12\x1b\n\x13process_instance_id\x18\n \x01(\t\x12\x35\n\x06reason\x18\x0b \x01(\x0e\x32%.openshell.v1.ProviderReadinessReason\"\xe4\x03\n\x17ProviderReadinessStatus\x12\x36\n\x07receipt\x18\x01 \x01(\x0b\x32%.openshell.v1.ProviderMutationReceipt\x12\x33\n\x05state\x18\x02 \x01(\x0e\x32$.openshell.v1.ProviderReadinessState\x12\x35\n\x06reason\x18\x03 \x01(\x0e\x32%.openshell.v1.ProviderReadinessReason\x12<\n\x08observed\x18\x04 \x01(\x0b\x32*.openshell.v1.ProviderReadinessObservation\x12\x1b\n\x13network_instance_id\x18\x05 \x01(\t\x12\x31\n\robserved_time\x18j \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x32\n\x0e\x65valuated_time\x18k \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x36\n\toperation\x18\x08 \x01(\x0b\x32#.openshell.v1.ConfigUpdateOperationJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08R\x0eobserved_at_msR\x0f\x65valuated_at_ms\"\x9c\x01\n\x1fGetSandboxProviderStatusRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x10\n\x08provider\x18\x02 \x01(\t\x12\x12\n\nreceipt_id\x18\x03 \x01(\t\"Y\n GetSandboxProviderStatusResponse\x12\x35\n\x06status\x18\x01 \x01(\x0b\x32%.openshell.v1.ProviderReadinessStatus\"u\n\x1eReportProviderReadinessRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12?\n\x0bobservation\x18\x02 \x01(\x0b\x32*.openshell.v1.ProviderReadinessObservation\"\xe2\x01\n\x1fReportProviderReadinessResponse\x12\x19\n\x11\x61\x63\x63\x65pted_sequence\x18\x01 \x01(\x04\x12\x32\n\x0freport_interval\x18\x66 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x32\n\x0fobservation_ttl\x18g \x01(\x0b\x32\x19.google.protobuf.DurationJ\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04R\x17report_interval_secondsR\x17observation_ttl_seconds\"j\n\x15\x44\x65leteSandboxResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcome\x12\x12\n\nsandbox_id\x18\x03 \x01(\tJ\x04\x08\x01\x10\x02R\x07\x64\x65leted\"n\n\x17\x43reateSshSessionRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\"\xef\x01\n\x18\x43reateSshSessionResponse\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x13\n\x05token\x18\x02 \x01(\tB\x04\x88\xb5\x18\x01\x12\x14\n\x0cgateway_host\x18\x03 \x01(\t\x12\x14\n\x0cgateway_port\x18\x04 \x01(\r\x12\x16\n\x0egateway_scheme\x18\x05 \x01(\t\x12\x1c\n\x14host_key_fingerprint\x18\x07 \x01(\t\x12\x33\n\x0f\x65xpiration_time\x18l \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x08\x10\tR\rexpires_at_ms\"\xf6\x01\n\x14\x45xposeServiceRequest\x12\x42\n\x0fworkspace_scope\x18\x05 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0btarget_port\x18\x03 \x01(\r\x12\x0e\n\x06\x64omain\x18\x04 \x01(\x08\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x06 \x01(\t\x12\x42\n\x12\x61uthorization_mode\x18\x07 \x01(\x0e\x32&.openshell.v1.ServiceAuthorizationMode\"v\n\x11GetServiceRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\"\x91\x01\n\x13ListServicesRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\"h\n\x14ListServicesResponse\x12\x37\n\x08services\x18\x01 \x03(\x0b\x32%.openshell.v1.ServiceEndpointResponse\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\xa4\x01\n\x14\x44\x65leteServiceRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x15\n\rallow_missing\x18\x04 \x01(\x08\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"V\n\x15\x44\x65leteServiceResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07\x64\x65leted\"\xe3\x01\n\x0fServiceEndpoint\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".openshell.datamodel.v1.ObjectMeta\x12\x12\n\nsandbox_id\x18\x02 \x01(\t\x12\x0f\n\x07sandbox\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x13\n\x0btarget_port\x18\x05 \x01(\r\x12\x0e\n\x06\x64omain\x18\x06 \x01(\x08\x12\x42\n\x12\x61uthorization_mode\x18\x07 \x01(\x0e\x32&.openshell.v1.ServiceAuthorizationMode\"W\n\x17ServiceEndpointResponse\x12/\n\x08\x65ndpoint\x18\x01 \x01(\x0b\x32\x1d.openshell.v1.ServiceEndpoint\x12\x0b\n\x03url\x18\x02 \x01(\t\"E\n\x17RevokeSshSessionRequest\x12\x13\n\x05token\x18\x01 \x01(\tB\x04\x88\xb5\x18\x01\x12\x15\n\rallow_missing\x18\x02 \x01(\x08\"Y\n\x18RevokeSshSessionResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07revoked\"\xb8\x03\n\x12\x45xecSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x0c \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x0f\n\x07\x63ommand\x18\x02 \x03(\t\x12\x0f\n\x07workdir\x18\x03 \x01(\t\x12\x46\n\x0b\x65nvironment\x18\x04 \x03(\x0b\x32\x31.openshell.v1.ExecSandboxRequest.EnvironmentEntry\x12\x34\n\x11\x65xecution_timeout\x18i \x01(\x0b\x32\x19.google.protobuf.Duration\x12\r\n\x05stdin\x18\x06 \x01(\x0c\x12\x0b\n\x03tty\x18\x07 \x01(\x08\x12\x0c\n\x04\x63ols\x18\x08 \x01(\r\x12\x0c\n\x04rows\x18\t \x01(\r\x12\x16\n\x0eno_login_shell\x18\n \x01(\x08\x12\x12\n\nrequest_id\x18\x0b \x01(\t\x1a\x32\n\x10\x45nvironmentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\x05\x10\x06R\x0ftimeout_seconds\"!\n\x11\x45xecSandboxStdout\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"!\n\x11\x45xecSandboxStderr\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\"$\n\x0f\x45xecSandboxExit\x12\x11\n\texit_code\x18\x01 \x01(\x05\"\xb2\x01\n\x10\x45xecSandboxEvent\x12\x31\n\x06stdout\x18\x01 \x01(\x0b\x32\x1f.openshell.v1.ExecSandboxStdoutH\x00\x12\x31\n\x06stderr\x18\x02 \x01(\x0b\x32\x1f.openshell.v1.ExecSandboxStderrH\x00\x12-\n\x04\x65xit\x18\x03 \x01(\x0b\x32\x1d.openshell.v1.ExecSandboxExitH\x00\x42\t\n\x07payload\"\xcf\x01\n\x0eTcpForwardInit\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x11\n\tworkspace\x18\x03 \x01(\t\x12\x12\n\nservice_id\x18\x04 \x01(\t\x12+\n\x03ssh\x18\x05 \x01(\x0b\x32\x1c.openshell.v1.SshRelayTargetH\x00\x12+\n\x03tcp\x18\x06 \x01(\x0b\x32\x1c.openshell.v1.TcpRelayTargetH\x00\x12!\n\x13\x61uthorization_token\x18\x07 \x01(\tB\x04\x88\xb5\x18\x01\x42\x08\n\x06target\"Z\n\x0fTcpForwardFrame\x12,\n\x04init\x18\x01 \x01(\x0b\x32\x1c.openshell.v1.TcpForwardInitH\x00\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x42\t\n\x07payload\"\x9a\x01\n\x10\x45xecSandboxInput\x12\x31\n\x05start\x18\x01 \x01(\x0b\x32 .openshell.v1.ExecSandboxRequestH\x00\x12\x0f\n\x05stdin\x18\x02 \x01(\x0cH\x00\x12\x37\n\x06resize\x18\x03 \x01(\x0b\x32%.openshell.v1.ExecSandboxWindowResizeH\x00\x42\t\n\x07payload\"5\n\x17\x45xecSandboxWindowResize\x12\x0c\n\x04\x63ols\x18\x01 \x01(\r\x12\x0c\n\x04rows\x18\x02 \x01(\r\"\xc6\x01\n\nSshSession\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".openshell.datamodel.v1.ObjectMeta\x12\x12\n\nsandbox_id\x18\x02 \x01(\t\x12\x13\n\x05token\x18\x03 \x01(\tB\x04\x88\xb5\x18\x01\x12\x33\n\x0f\x65xpiration_time\x18h \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07revoked\x18\x05 \x01(\x08J\x04\x08\x04\x10\x05R\rexpires_at_ms\"\x80\x03\n\x13WatchSandboxRequest\x12\x42\n\x0fworkspace_scope\x18\x0b \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x15\n\rfollow_status\x18\x02 \x01(\x08\x12\x13\n\x0b\x66ollow_logs\x18\x03 \x01(\x08\x12\x15\n\rfollow_events\x18\x04 \x01(\x08\x12\x16\n\x0elog_tail_lines\x18\x05 \x01(\r\x12\x12\n\nevent_tail\x18\x06 \x01(\r\x12\x18\n\x10stop_on_terminal\x18\x07 \x01(\x08\x12.\n\nsince_time\x18l \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0blog_sources\x18\t \x03(\t\x12\x15\n\rlog_min_level\x18\n \x01(\t\x12\x1b\n\x13resume_after_cursor\x18\x0c \x01(\tJ\x04\x08\x08\x10\tR\x0clog_since_ms\"\xab\x02\n\x12SandboxStreamEvent\x12(\n\x07sandbox\x18\x01 \x01(\x0b\x32\x15.openshell.v1.SandboxH\x00\x12+\n\x03log\x18\x02 \x01(\x0b\x32\x1c.openshell.v1.SandboxLogLineH\x00\x12,\n\x05\x65vent\x18\x03 \x01(\x0b\x32\x1b.openshell.v1.PlatformEventH\x00\x12\x35\n\x07warning\x18\x04 \x01(\x0b\x32\".openshell.v1.SandboxStreamWarningH\x00\x12>\n\x13\x64raft_policy_update\x18\x05 \x01(\x0b\x32\x1f.openshell.v1.DraftPolicyUpdateH\x00\x12\x0e\n\x06\x63ursor\x18\x06 \x01(\tB\t\n\x07payload\"\x91\x02\n\x0eSandboxLogLine\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12.\n\nevent_time\x18\x66 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\r\n\x05level\x18\x03 \x01(\t\x12\x0e\n\x06target\x18\x04 \x01(\t\x12\x0f\n\x07message\x18\x05 \x01(\t\x12\x0e\n\x06source\x18\x06 \x01(\t\x12\x38\n\x06\x66ields\x18\x07 \x03(\x0b\x32(.openshell.v1.SandboxLogLine.FieldsEntry\x1a-\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\x02\x10\x03R\x0ctimestamp_ms\"\'\n\x14SandboxStreamWarning\x12\x0f\n\x07message\x18\x01 \x01(\t\"\xa3\x01\n\x15\x43reateProviderRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x32\n\x08provider\x18\x01 \x01(\x0b\x32 .openshell.datamodel.v1.Provider\x12\x12\n\nrequest_id\x18\x03 \x01(\t\"f\n\x12GetProviderRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xc9\x01\n\x1dGetProviderCredentialsRequest\x12\x42\n\x0fworkspace_scope\x18\x01 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x17\n\x0f\x63redential_keys\x18\x03 \x03(\t\x12=\n\x1aminimum_remaining_lifetime\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\"c\n\x17ProviderCredentialValue\x12\x13\n\x05value\x18\x01 \x01(\tB\x04\x88\xb5\x18\x01\x12\x33\n\x0f\x65xpiration_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xcf\x01\n\x1eGetProviderCredentialsResponse\x12R\n\x0b\x63redentials\x18\x01 \x03(\x0b\x32=.openshell.v1.GetProviderCredentialsResponse.CredentialsEntry\x1aY\n\x10\x43redentialsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x34\n\x05value\x18\x02 \x01(\x0b\x32%.openshell.v1.ProviderCredentialValue:\x02\x38\x01\"\x99\x01\n\x14ListProvidersRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x12\n\npage_token\x18\x02 \x01(\t\x12\x16\n\x0elabel_selector\x18\x04 \x01(\t\"\xb4\x03\n\x15UpdateProviderRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x32\n\x08provider\x18\x01 \x01(\x0b\x32 .openshell.datamodel.v1.Provider\x12g\n\x1b\x63redential_expiration_times\x18\x66 \x03(\x0b\x32\x42.openshell.v1.UpdateProviderRequest.CredentialExpirationTimesEntry\x12(\n clear_credential_expiration_keys\x18g \x03(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\x1a\\\n\x1e\x43redentialExpirationTimesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp:\x02\x38\x01J\x04\x08\x02\x10\x03R\x18\x63redential_expires_at_ms\"\x94\x01\n\x15\x44\x65leteProviderRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rallow_missing\x18\x04 \x01(\x08\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"\x9b\x01\n\x10ProviderResponse\x12\x32\n\x08provider\x18\x01 \x01(\x0b\x32 .openshell.datamodel.v1.Provider\x12>\n\x0ftarget_receipts\x18\x02 \x03(\x0b\x32%.openshell.v1.ProviderMutationReceipt\x12\x13\n\x0bmutation_id\x18\x03 \x01(\t\"e\n\x15ListProvidersResponse\x12\x33\n\tproviders\x18\x01 \x03(\x0b\x32 .openshell.datamodel.v1.Provider\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x88\x01\n\x1bListProviderProfilesRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x12\n\npage_token\x18\x02 \x01(\t\"k\n\x19GetProviderProfileRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\n\n\x02id\x18\x01 \x01(\t\"[\n\x19ProviderProfileImportItem\x12.\n\x07profile\x18\x01 \x01(\x0b\x32\x1d.openshell.v1.ProviderProfile\x12\x0e\n\x06source\x18\x02 \x01(\t\"q\n\x19ProviderProfileDiagnostic\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x12\n\nprofile_id\x18\x02 \x01(\t\x12\r\n\x05\x66ield\x18\x03 \x01(\t\x12\x0f\n\x07message\x18\x04 \x01(\t\x12\x10\n\x08severity\x18\x05 \x01(\t\"z\n,ProviderCredentialTokenGrantAudienceOverride\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x0c\n\x04path\x18\x03 \x01(\t\x12\x10\n\x08\x61udience\x18\x04 \x01(\t\x12\x0e\n\x06scopes\x18\x05 \x03(\t\"j\n(ProviderCredentialTokenGrantSubjectToken\x12\x0e\n\x06source\x18\x01 \x01(\t\x12\x12\n\ncredential\x18\x02 \x01(\t\x12\x1a\n\x12subject_token_type\x18\x03 \x01(\t\"\xe2\x03\n\x1cProviderCredentialTokenGrant\x12\x16\n\x0etoken_endpoint\x18\x01 \x01(\t\x12\x10\n\x08\x61udience\x18\x02 \x01(\t\x12\x19\n\x11jwt_svid_audience\x18\x06 \x01(\t\x12\x0e\n\x06scopes\x18\x03 \x03(\t\x12,\n\tcache_ttl\x18h \x01(\x0b\x32\x19.google.protobuf.Duration\x12V\n\x12\x61udience_overrides\x18\x05 \x03(\x0b\x32:.openshell.v1.ProviderCredentialTokenGrantAudienceOverride\x12\x1d\n\x15\x63lient_assertion_type\x18\x07 \x01(\t\x12\x42\n\ngrant_type\x18\x08 \x01(\x0e\x32..openshell.v1.ProviderCredentialTokenGrantType\x12M\n\rsubject_token\x18\t \x01(\x0b\x32\x36.openshell.v1.ProviderCredentialTokenGrantSubjectToken\x12\x1c\n\x14requested_token_type\x18\n \x01(\tJ\x04\x08\x04\x10\x05R\x11\x63\x61\x63he_ttl_seconds\"\xea\x02\n\x19ProviderProfileCredential\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x10\n\x08\x65nv_vars\x18\x03 \x03(\t\x12\x10\n\x08required\x18\x04 \x01(\x08\x12\x12\n\nauth_style\x18\x05 \x01(\t\x12\x13\n\x0bheader_name\x18\x06 \x01(\t\x12\x13\n\x0bquery_param\x18\x07 \x01(\t\x12\x38\n\x07refresh\x18\x08 \x01(\x0b\x32\'.openshell.v1.ProviderCredentialRefresh\x12\x15\n\rpath_template\x18\t \x01(\t\x12?\n\x0btoken_grant\x18\n \x01(\x0b\x32*.openshell.v1.ProviderCredentialTokenGrant\x12\x1a\n\x12token_grant_owners\x18\x0b \x03(\t\x12\x1a\n\x12stable_placeholder\x18\x0c \x01(\x08\"h\n!ProviderCredentialRefreshMaterial\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x10\n\x08required\x18\x03 \x01(\x08\x12\x0e\n\x06secret\x18\x04 \x01(\x08\"E\n\x1fProviderCredentialRefreshOutput\x12\x0e\n\x06output\x18\x01 \x01(\t\x12\x12\n\ncredential\x18\x02 \x01(\t\"\xad\x03\n\x19ProviderCredentialRefresh\x12\x41\n\x08strategy\x18\x01 \x01(\x0e\x32/.openshell.v1.ProviderCredentialRefreshStrategy\x12\x11\n\ttoken_url\x18\x02 \x01(\t\x12\x0e\n\x06scopes\x18\x03 \x03(\t\x12\x31\n\x0erefresh_before\x18h \x01(\x0b\x32\x19.google.protobuf.Duration\x12/\n\x0cmax_lifetime\x18i \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x41\n\x08material\x18\x06 \x03(\x0b\x32/.openshell.v1.ProviderCredentialRefreshMaterial\x12I\n\x12\x61\x64\x64itional_outputs\x18\x07 \x03(\x0b\x32-.openshell.v1.ProviderCredentialRefreshOutputJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06R\x16refresh_before_secondsR\x14max_lifetime_seconds\"\x86\x05\n\x1fProviderCredentialRefreshStatus\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x13\n\x0bprovider_id\x18\x02 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x03 \x01(\t\x12\x41\n\x08strategy\x18\x04 \x01(\x0e\x32/.openshell.v1.ProviderCredentialRefreshStrategy\x12\x0e\n\x06status\x18\x05 \x01(\t\x12\x33\n\x0f\x65xpiration_time\x18j \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11next_refresh_time\x18k \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x35\n\x11last_refresh_time\x18l \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nlast_error\x18\t \x01(\t\x12N\n\x0frecovery_action\x18\n \x01(\x0e\x32\x35.openshell.v1.ProviderCredentialRefreshRecoveryAction\x12\x14\n\x0c\x66\x61ilure_code\x18\x0b \x01(\t\x12\x1e\n\x16provider_error_subtype\x18\x0c \x01(\t\x12\x33\n\x0flast_error_time\x18q \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\tJ\x04\x08\r\x10\x0eR\rexpires_at_msR\x12next_refresh_at_msR\x12last_refresh_at_msR\x10last_error_at_ms\"/\n\x18ProviderProfileDiscovery\x12\x13\n\x0b\x63redentials\x18\x01 \x03(\t\"\x8f\x01\n\x1fGetProviderRefreshStatusRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x02 \x01(\t\"f\n GetProviderRefreshStatusResponse\x12\x42\n\x0b\x63redentials\x18\x01 \x03(\x0b\x32-.openshell.v1.ProviderCredentialRefreshStatus\"\xd4\x03\n\x1f\x43onfigureProviderRefreshRequest\x12\x42\n\x0fworkspace_scope\x18\x07 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x02 \x01(\t\x12\x41\n\x08strategy\x18\x03 \x01(\x0e\x32/.openshell.v1.ProviderCredentialRefreshStrategy\x12S\n\x08material\x18\x04 \x03(\x0b\x32;.openshell.v1.ConfigureProviderRefreshRequest.MaterialEntryB\x04\x88\xb5\x18\x01\x12\x1c\n\x14secret_material_keys\x18\x05 \x03(\t\x12\x33\n\x0f\x65xpiration_time\x18j \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nrequest_id\x18\x08 \x01(\t\x1a/\n\rMaterialEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\x06\x10\x07R\rexpires_at_ms\"a\n ConfigureProviderRefreshResponse\x12=\n\x06status\x18\x01 \x01(\x0b\x32-.openshell.v1.ProviderCredentialRefreshStatus\"\xa3\x01\n\x1fRotateProviderCredentialRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x02 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\"a\n RotateProviderCredentialResponse\x12=\n\x06status\x18\x01 \x01(\x0b\x32-.openshell.v1.ProviderCredentialRefreshStatus\"\xb7\x01\n\x1c\x44\x65leteProviderRefreshRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x02 \x01(\t\x12\x15\n\rallow_missing\x18\x05 \x01(\x08\x12\x12\n\nrequest_id\x18\x06 \x01(\t\"^\n\x1d\x44\x65leteProviderRefreshResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07\x64\x65leted\"\xea\x04\n\x0fProviderProfile\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x37\n\x08\x63\x61tegory\x18\x04 \x01(\x0e\x32%.openshell.v1.ProviderProfileCategory\x12<\n\x0b\x63redentials\x18\x05 \x03(\x0b\x32\'.openshell.v1.ProviderProfileCredential\x12\x38\n\tendpoints\x18\x06 \x03(\x0b\x32%.openshell.sandbox.v1.NetworkEndpoint\x12\x35\n\x08\x62inaries\x18\x07 \x03(\x0b\x32#.openshell.sandbox.v1.NetworkBinary\x12\x19\n\x11inference_capable\x18\x08 \x01(\x08\x12\x39\n\tdiscovery\x18\t \x01(\x0b\x32&.openshell.v1.ProviderProfileDiscovery\x12\x18\n\x10resource_version\x18\n \x01(\x04\x12\x43\n\x0b\x61nnotations\x18\x0b \x03(\x0b\x32..openshell.v1.ProviderProfile.AnnotationsEntry\x12\x0e\n\x06source\x18\x0c \x01(\t\x12\r\n\x05scope\x18\r \x01(\t\x12\x30\n\x05\x66iles\x18\x0e \x03(\x0b\x32!.openshell.v1.ProviderProfileFile\x1a\x32\n\x10\x41nnotationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"E\n\x13ProviderProfileFile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x0f\n\x07\x65nv_var\x18\x03 \x01(\t\"I\n\x17ProviderProfileResponse\x12.\n\x07profile\x18\x01 \x01(\x0b\x32\x1d.openshell.v1.ProviderProfile\"h\n\x1cListProviderProfilesResponse\x12/\n\x08profiles\x18\x01 \x03(\x0b\x32\x1d.openshell.v1.ProviderProfile\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\xb2\x01\n\x1dImportProviderProfilesRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x39\n\x08profiles\x18\x01 \x03(\x0b\x32\'.openshell.v1.ProviderProfileImportItem\x12\x12\n\nrequest_id\x18\x03 \x01(\t\"\xa1\x01\n\x1eImportProviderProfilesResponse\x12<\n\x0b\x64iagnostics\x18\x01 \x03(\x0b\x32\'.openshell.v1.ProviderProfileDiagnostic\x12/\n\x08profiles\x18\x02 \x03(\x0b\x32\x1d.openshell.v1.ProviderProfile\x12\x10\n\x08imported\x18\x03 \x01(\x08\"\xe0\x01\n\x1dUpdateProviderProfilesRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x38\n\x07profile\x18\x01 \x01(\x0b\x32\'.openshell.v1.ProviderProfileImportItem\x12!\n\x19\x65xpected_resource_version\x18\x02 \x01(\x04\x12\n\n\x02id\x18\x03 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"\x9f\x01\n\x1eUpdateProviderProfilesResponse\x12<\n\x0b\x64iagnostics\x18\x01 \x03(\x0b\x32\'.openshell.v1.ProviderProfileDiagnostic\x12.\n\x07profile\x18\x02 \x01(\x0b\x32\x1d.openshell.v1.ProviderProfile\x12\x0f\n\x07updated\x18\x03 \x01(\x08\"\x9c\x01\n\x1bLintProviderProfilesRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x39\n\x08profiles\x18\x01 \x03(\x0b\x32\'.openshell.v1.ProviderProfileImportItem\"\x90\x01\n\x1cLintProviderProfilesResponse\x12<\n\x0b\x64iagnostics\x18\x01 \x03(\x0b\x32\'.openshell.v1.ProviderProfileDiagnostic\x12\r\n\x05valid\x18\x02 \x01(\x08\x12#\n\x1bsupports_stable_placeholder\x18\x03 \x01(\x08\"W\n\x16\x44\x65leteProviderResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07\x64\x65leted\"\x99\x01\n\x1c\x44\x65leteProviderProfileRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\n\n\x02id\x18\x01 \x01(\t\x12\x15\n\rallow_missing\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\"^\n\x1d\x44\x65leteProviderProfileResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07\x64\x65leted\"\x9d\x01\n$GetSandboxProviderEnvironmentRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12+\n#supports_static_credential_bindings\x18\x02 \x01(\x08\x12\x34\n,supports_stable_placeholder_environment_keys\x18\x03 \x01(\x08\"K\n\x1fStaticCredentialEndpointBinding\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x0c\n\x04path\x18\x03 \x01(\t\"\x9c\x01\n\x17StaticCredentialBinding\x12@\n\tendpoints\x18\x01 \x03(\x0b\x32-.openshell.v1.StaticCredentialEndpointBinding\x12\x1b\n\x13\x63redential_identity\x18\x02 \x01(\t\x12\"\n\x1aworkload_credential_handle\x18\x03 \x01(\t\"\xfd\t\n%GetSandboxProviderEnvironmentResponse\x12_\n\x0b\x65nvironment\x18\x01 \x03(\x0b\x32\x44.openshell.v1.GetSandboxProviderEnvironmentResponse.EnvironmentEntryB\x04\x88\xb5\x18\x01\x12\x1d\n\x15provider_env_revision\x18\x02 \x01(\x04\x12w\n\x1b\x63redential_expiration_times\x18g \x03(\x0b\x32R.openshell.v1.GetSandboxProviderEnvironmentResponse.CredentialExpirationTimesEntry\x12h\n\x13\x64ynamic_credentials\x18\x04 \x03(\x0b\x32K.openshell.v1.GetSandboxProviderEnvironmentResponse.DynamicCredentialsEntry\x12u\n\x1astatic_credential_bindings\x18\x05 \x03(\x0b\x32Q.openshell.v1.GetSandboxProviderEnvironmentResponse.StaticCredentialBindingsEntry\x12#\n\x1bnon_secret_environment_keys\x18\x06 \x03(\t\x12!\n\x19provider_attachment_epoch\x18\x07 \x01(\t\x12\x13\n\x0bpolicy_hash\x18\x08 \x01(\t\x12?\n\x10readiness_reason\x18\t \x01(\x0e\x32%.openshell.v1.ProviderReadinessReason\x12M\n\x05\x66iles\x18\n \x03(\x0b\x32>.openshell.v1.GetSandboxProviderEnvironmentResponse.FilesEntry\x12+\n#stable_placeholder_environment_keys\x18\x0b \x03(\t\x12\x34\n,supports_stable_placeholder_environment_keys\x18\x0c \x01(\x08\x1a\x32\n\x10\x45nvironmentEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\\\n\x1e\x43redentialExpirationTimesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp:\x02\x38\x01\x1a\x62\n\x17\x44ynamicCredentialsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.openshell.v1.ProviderProfileCredential:\x02\x38\x01\x1a\x66\n\x1dStaticCredentialBindingsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x34\n\x05value\x18\x02 \x01(\x0b\x32%.openshell.v1.StaticCredentialBinding:\x02\x38\x01\x1a,\n\nFilesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\x03\x10\x04R\x18\x63redential_expires_at_ms\"\xa6\x02\n\x18ProviderEnvironmentValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x05value\x18\x02 \x01(\tB\x04\x88\xb5\x18\x01\x12L\n\x0e\x63lassification\x18\x04 \x01(\x0e\x32\x34.openshell.v1.ProviderEnvironmentValueClassification\x12H\n\x19static_credential_binding\x18\x05 \x01(\x0b\x32%.openshell.v1.StaticCredentialBinding\x12\x33\n\x0f\x65xpiration_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1a\n\x12stable_placeholder\x18\x06 \x01(\x08\"\xa4\x04\n\x1bProviderEnvironmentSnapshot\x12\x1d\n\x15provider_env_revision\x18\x01 \x01(\x04\x12\x36\n\x06values\x18\x02 \x03(\x0b\x32&.openshell.v1.ProviderEnvironmentValue\x12^\n\x13\x64ynamic_credentials\x18\x03 \x03(\x0b\x32\x41.openshell.v1.ProviderEnvironmentSnapshot.DynamicCredentialsEntry\x12!\n\x19provider_attachment_epoch\x18\x04 \x01(\t\x12\x13\n\x0bpolicy_hash\x18\x05 \x01(\t\x12?\n\x10readiness_reason\x18\x06 \x01(\x0e\x32%.openshell.v1.ProviderReadinessReason\x12\x43\n\x05\x66iles\x18\x07 \x03(\x0b\x32\x34.openshell.v1.ProviderEnvironmentSnapshot.FilesEntry\x1a\x62\n\x17\x44ynamicCredentialsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.openshell.v1.ProviderProfileCredential:\x02\x38\x01\x1a,\n\nFilesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x86\x01\n#ExchangeProviderSubjectTokenRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x10\n\x08provider\x18\x02 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x03 \x01(\t\x12!\n\x13supervisor_jwt_svid\x18\x04 \x01(\tB\x04\x88\xb5\x18\x01\"\x9a\x01\n$ExchangeProviderSubjectTokenResponse\x12\x1a\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\tB\x04\x88\xb5\x18\x01\x12\x30\n\rexpires_after\x18\x66 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x12\n\ntoken_type\x18\x03 \x01(\tJ\x04\x08\x02\x10\x03R\nexpires_in\"\x89\x04\n\x13UpdateConfigRequest\x12\x42\n\x0fworkspace_scope\x18\n \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x33\n\x06policy\x18\x02 \x01(\x0b\x32#.openshell.sandbox.v1.SandboxPolicy\x12\x13\n\x0bsetting_key\x18\x03 \x01(\t\x12\x39\n\rsetting_value\x18\x04 \x01(\x0b\x32\".openshell.sandbox.v1.SettingValue\x12\x16\n\x0e\x64\x65lete_setting\x18\x05 \x01(\x08\x12\x0e\n\x06global\x18\x06 \x01(\x08\x12<\n\x10merge_operations\x18\x07 \x03(\x0b\x32\".openshell.v1.PolicyMergeOperation\x12!\n\x19\x65xpected_resource_version\x18\x08 \x01(\x04\x12G\n\x0b\x61nnotations\x18\t \x03(\x0b\x32\x32.openshell.v1.UpdateConfigRequest.AnnotationsEntry\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x0b \x01(\t\x1a\x32\n\x10\x41nnotationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf7\x02\n\x14PolicyMergeOperation\x12\x30\n\x08\x61\x64\x64_rule\x18\x01 \x01(\x0b\x32\x1c.openshell.v1.AddNetworkRuleH\x00\x12>\n\x0fremove_endpoint\x18\x02 \x01(\x0b\x32#.openshell.v1.RemoveNetworkEndpointH\x00\x12\x36\n\x0bremove_rule\x18\x03 \x01(\x0b\x32\x1f.openshell.v1.RemoveNetworkRuleH\x00\x12\x34\n\x0e\x61\x64\x64_deny_rules\x18\x04 \x01(\x0b\x32\x1a.openshell.v1.AddDenyRulesH\x00\x12\x36\n\x0f\x61\x64\x64_allow_rules\x18\x05 \x01(\x0b\x32\x1b.openshell.v1.AddAllowRulesH\x00\x12:\n\rremove_binary\x18\x06 \x01(\x0b\x32!.openshell.v1.RemoveNetworkBinaryH\x00\x42\x0b\n\toperation\"Z\n\x0e\x41\x64\x64NetworkRule\x12\x11\n\trule_name\x18\x01 \x01(\t\x12\x35\n\x04rule\x18\x02 \x01(\x0b\x32\'.openshell.sandbox.v1.NetworkPolicyRule\"F\n\x15RemoveNetworkEndpoint\x12\x11\n\trule_name\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\"&\n\x11RemoveNetworkRule\x12\x11\n\trule_name\x18\x01 \x01(\t\"\xa5\x01\n\x0cL7RuleTarget\x12\x11\n\trule_name\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\r\n\x05ports\x18\x03 \x03(\r\x12\x11\n\x04path\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x35\n\x08\x62inaries\x18\x05 \x03(\x0b\x32#.openshell.sandbox.v1.NetworkBinary\x12\x12\n\nany_binary\x18\x06 \x01(\x08\x42\x07\n\x05_path\"\x88\x01\n\x0c\x41\x64\x64\x44\x65nyRules\x12\x34\n\ndeny_rules\x18\x03 \x03(\x0b\x32 .openshell.sandbox.v1.L7DenyRule\x12*\n\x06target\x18\x04 \x01(\x0b\x32\x1a.openshell.v1.L7RuleTargetJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x04hostR\x04port\"\x80\x01\n\rAddAllowRules\x12+\n\x05rules\x18\x03 \x03(\x0b\x32\x1c.openshell.sandbox.v1.L7Rule\x12*\n\x06target\x18\x04 \x01(\x0b\x32\x1a.openshell.v1.L7RuleTargetJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x04hostR\x04port\"=\n\x13RemoveNetworkBinary\x12\x11\n\trule_name\x18\x01 \x01(\t\x12\x13\n\x0b\x62inary_path\x18\x02 \x01(\t\"\xe6\x01\n\x14UpdateConfigResponse\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x02 \x01(\t\x12\x19\n\x11settings_revision\x18\x03 \x01(\x04\x12\x0f\n\x07\x64\x65leted\x18\x04 \x01(\x08\x12H\n\x0b\x61nnotations\x18\x05 \x03(\x0b\x32\x33.openshell.v1.UpdateConfigResponse.AnnotationsEntry\x1a\x32\n\x10\x41nnotationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x95\x01\n\x1dGetSandboxPolicyStatusRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07version\x18\x02 \x01(\r\x12\x0e\n\x06global\x18\x03 \x01(\x08\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\"o\n\x1eGetSandboxPolicyStatusResponse\x12\x35\n\x08revision\x18\x01 \x01(\x0b\x32#.openshell.v1.SandboxPolicyRevision\x12\x16\n\x0e\x61\x63tive_version\x18\x02 \x01(\r\"\xa8\x01\n\x1aListSandboxPoliciesRequest\x12\x42\n\x0fworkspace_scope\x18\x05 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x0e\n\x06global\x18\x04 \x01(\x08\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\"n\n\x1bListSandboxPoliciesResponse\x12\x36\n\trevisions\x18\x01 \x03(\x0b\x32#.openshell.v1.SandboxPolicyRevision\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x80\x01\n\x19ReportPolicyStatusRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\r\x12*\n\x06status\x18\x03 \x01(\x0e\x32\x1a.openshell.v1.PolicyStatus\x12\x12\n\nload_error\x18\x04 \x01(\t\"\x1c\n\x1aReportPolicyStatusResponse\"\xe2\x01\n\x1dSandboxConfigurationAdmission\x12\x13\n\x0binstance_id\x18\x01 \x01(\t\x12\x38\n\x05state\x18\x02 \x01(\x0e\x32).openshell.v1.ConfigurationAdmissionState\x12\x16\n\x0epolicy_version\x18\x03 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x04 \x01(\t\x12\x17\n\x0f\x63onfig_revision\x18\x05 \x01(\x04\x12\x1d\n\x15provider_env_revision\x18\x06 \x01(\x04\x12\r\n\x05\x65rror\x18\x07 \x01(\t\"\x95\x01\n!ReportSandboxConfigurationRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12>\n\tadmission\x18\x02 \x01(\x0b\x32+.openshell.v1.SandboxConfigurationAdmission\x12\x1c\n\x14\x65xpected_instance_id\x18\x03 \x01(\t\"$\n\"ReportSandboxConfigurationResponse\"\xba\x03\n\x15SandboxPolicyRevision\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x02 \x01(\t\x12*\n\x06status\x18\x03 \x01(\x0e\x32\x1a.openshell.v1.PolicyStatus\x12\x12\n\nload_error\x18\x04 \x01(\t\x12\x30\n\x0c\x63reated_time\x18i \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bloaded_time\x18j \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x06policy\x18\x07 \x01(\x0b\x32#.openshell.sandbox.v1.SandboxPolicy\x12G\n\nprovenance\x18\x08 \x03(\x0b\x32\x33.openshell.v1.SandboxPolicyRevision.ProvenanceEntry\x1a\x31\n\x0fProvenanceEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07R\rcreated_at_msR\x0cloaded_at_ms\"\xdf\x01\n\x15GetSandboxLogsRequest\x12\x42\n\x0fworkspace_scope\x18\x06 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\r\n\x05lines\x18\x02 \x01(\r\x12.\n\nsince_time\x18g \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07sources\x18\x04 \x03(\t\x12\x11\n\tmin_level\x18\x05 \x01(\tJ\x04\x08\x03\x10\x04R\x08since_ms\"X\n\x16PushSandboxLogsRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12*\n\x04logs\x18\x02 \x03(\x0b\x32\x1c.openshell.v1.SandboxLogLine\"\x19\n\x17PushSandboxLogsResponse\"Z\n\x16GetSandboxLogsResponse\x12*\n\x04logs\x18\x01 \x03(\x0b\x32\x1c.openshell.v1.SandboxLogLine\x12\x14\n\x0c\x62uffer_total\x18\x02 \x01(\r\"\xb5\x02\n\x11SupervisorMessage\x12.\n\x05hello\x18\x01 \x01(\x0b\x32\x1d.openshell.v1.SupervisorHelloH\x00\x12\x36\n\theartbeat\x18\x02 \x01(\x0b\x32!.openshell.v1.SupervisorHeartbeatH\x00\x12:\n\x11relay_open_result\x18\x03 \x01(\x0b\x32\x1d.openshell.v1.RelayOpenResultH\x00\x12/\n\x0brelay_close\x18\x04 \x01(\x0b\x32\x18.openshell.v1.RelayCloseH\x00\x12@\n\x14\x63onfig_update_result\x18\x05 \x01(\x0b\x32 .openshell.v1.ConfigUpdateResultH\x00\x42\t\n\x07payload\"\x96\x03\n\x0eGatewayMessage\x12\x39\n\x10session_accepted\x18\x01 \x01(\x0b\x32\x1d.openshell.v1.SessionAcceptedH\x00\x12\x39\n\x10session_rejected\x18\x02 \x01(\x0b\x32\x1d.openshell.v1.SessionRejectedH\x00\x12\x33\n\theartbeat\x18\x03 \x01(\x0b\x32\x1e.openshell.v1.GatewayHeartbeatH\x00\x12-\n\nrelay_open\x18\x04 \x01(\x0b\x32\x17.openshell.v1.RelayOpenH\x00\x12/\n\x0brelay_close\x18\x05 \x01(\x0b\x32\x18.openshell.v1.RelayCloseH\x00\x12\x39\n\x10session_redirect\x18\x06 \x01(\x0b\x32\x1d.openshell.v1.SessionRedirectH\x00\x12\x33\n\rconfig_update\x18\x07 \x01(\x0b\x32\x1a.openshell.v1.ConfigUpdateH\x00\x42\t\n\x07payload\"\xce\x01\n\x0fSupervisorHello\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x13\n\x0binstance_id\x18\x02 \x01(\t\x12\x18\n\x10\x63onnection_epoch\x18\x03 \x01(\x04\x12#\n\x1bsupports_provider_readiness\x18\x04 \x01(\x08\x12\x12\n\nredirected\x18\x05 \x01(\x08\x12!\n\x19supports_session_redirect\x18\x06 \x01(\x08\x12\x1c\n\x14supports_config_push\x18\x07 \x01(\x08\"\xc7\x01\n\x0fSessionAccepted\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12-\n\tbootstrap\x18\x03 \x01(\x0b\x32\x1a.openshell.v1.ConfigUpdate\x12\x1b\n\x13\x63onfig_push_enabled\x18\x04 \x01(\x08\x12\x35\n\x12heartbeat_interval\x18\x66 \x01(\x0b\x32\x19.google.protobuf.DurationJ\x04\x08\x02\x10\x03R\x17heartbeat_interval_secs\"\xaf\x01\n\x0c\x43onfigUpdate\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x43\n\x0esandbox_config\x18\x02 \x01(\x0b\x32+.openshell.sandbox.v1.SandboxConfigSnapshot\x12G\n\x14provider_environment\x18\x03 \x01(\x0b\x32).openshell.v1.ProviderEnvironmentSnapshot\"F\n\x12\x43onfigApplyFailure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x11\n\tretryable\x18\x03 \x01(\x08\"\x82\x02\n\x12\x43onfigUpdateResult\x12\x11\n\tupdate_id\x18\x01 \x01(\t\x12\x31\n\x07outcome\x18\x02 \x01(\x0e\x32 .openshell.v1.ConfigApplyOutcome\x12\x31\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32 .openshell.v1.ConfigApplyFailure\x12>\n\tadmission\x18\x04 \x01(\x0b\x32+.openshell.v1.SandboxConfigurationAdmission\x12\x33\n\x0bpolicy_load\x18\x05 \x01(\x0b\x32\x1e.openshell.v1.PolicyLoadResult\"B\n\x10PolicyLoadResult\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x0e\n\x06loaded\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"!\n\x0fSessionRejected\x12\x0e\n\x06reason\x18\x01 \x01(\t\"B\n\x0fSessionRedirect\x12\x15\n\rpeer_endpoint\x18\x01 \x01(\t\x12\x18\n\x10owner_replica_id\x18\x02 \x01(\t\"\x15\n\x13SupervisorHeartbeat\"\x12\n\x10GatewayHeartbeat\"Z\n\x1cReportMainProcessExitRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x13\n\x0binstance_id\x18\x02 \x01(\t\x12\x11\n\texit_code\x18\x03 \x01(\x05\"\x1f\n\x1dReportMainProcessExitResponse\"I\n\x1e\x46inalizeMainProcessExitRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x13\n\x0binstance_id\x18\x02 \x01(\t\"!\n\x1f\x46inalizeMainProcessExitResponse\"\x97\x01\n\tRelayOpen\x12\x12\n\nchannel_id\x18\x01 \x01(\t\x12+\n\x03ssh\x18\x02 \x01(\x0b\x32\x1c.openshell.v1.SshRelayTargetH\x00\x12+\n\x03tcp\x18\x03 \x01(\x0b\x32\x1c.openshell.v1.TcpRelayTargetH\x00\x12\x12\n\nservice_id\x18\x05 \x01(\tB\x08\n\x06target\"\x10\n\x0eSshRelayTarget\",\n\x0eTcpRelayTarget\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\"\x1f\n\tRelayInit\x12\x12\n\nchannel_id\x18\x01 \x01(\t\"P\n\nRelayFrame\x12\'\n\x04init\x18\x01 \x01(\x0b\x32\x17.openshell.v1.RelayInitH\x00\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x42\t\n\x07payload\"n\n\rPeerRelayInit\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12+\n\nrelay_open\x18\x02 \x01(\x0b\x32\x17.openshell.v1.RelayOpen\x12\x1c\n\x14requester_replica_id\x18\x03 \x01(\t\"X\n\x0ePeerRelayFrame\x12+\n\x04init\x18\x01 \x01(\x0b\x32\x1b.openshell.v1.PeerRelayInitH\x00\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x42\t\n\x07payload\"A\n\x17PeerConfigSandboxTarget\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x12\n\nsession_id\x18\x02 \x01(\t\";\n\x18PeerConfigProviderTarget\x12\x11\n\tworkspace\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\xcc\x01\n\x1dPeerNotifyConfigUpdateRequest\x12\x38\n\x07sandbox\x18\x01 \x01(\x0b\x32%.openshell.v1.PeerConfigSandboxTargetH\x00\x12\x13\n\tworkspace\x18\x02 \x01(\tH\x00\x12\x17\n\rall_connected\x18\x03 \x01(\x08H\x00\x12:\n\x08provider\x18\x04 \x01(\x0b\x32&.openshell.v1.PeerConfigProviderTargetH\x00\x42\x07\n\x05scope\"5\n\x1ePeerNotifyConfigUpdateResponse\x12\x13\n\x0bstale_owner\x18\x01 \x01(\x08\"E\n\x0fRelayOpenResult\x12\x12\n\nchannel_id\x18\x01 \x01(\t\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"0\n\nRelayClose\x12\x12\n\nchannel_id\x18\x01 \x01(\t\x12\x0e\n\x06reason\x18\x02 \x01(\t\"P\n\x0fL7RequestSample\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x10\n\x08\x64\x65\x63ision\x18\x03 \x01(\t\x12\r\n\x05\x63ount\x18\x04 \x01(\r\"\xfa\x03\n\rDenialSummary\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\x12\x0e\n\x06\x62inary\x18\x04 \x01(\t\x12\x11\n\tancestors\x18\x05 \x03(\t\x12\x13\n\x0b\x64\x65ny_reason\x18\x06 \x01(\t\x12\x33\n\x0f\x66irst_seen_time\x18k \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x32\n\x0elast_seen_time\x18l \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\r\n\x05\x63ount\x18\t \x01(\r\x12\x18\n\x10suppressed_count\x18\n \x01(\r\x12\x13\n\x0btotal_count\x18\x0b \x01(\r\x12\x17\n\x0fsample_cmdlines\x18\x0c \x03(\t\x12\x15\n\rbinary_sha256\x18\r \x01(\t\x12\x12\n\npersistent\x18\x0e \x01(\x08\x12\x14\n\x0c\x64\x65nial_stage\x18\x0f \x01(\t\x12\x39\n\x12l7_request_samples\x18\x10 \x03(\x0b\x32\x1d.openshell.v1.L7RequestSample\x12\x1c\n\x14l7_inspection_active\x18\x11 \x01(\x08J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\tR\rfirst_seen_msR\x0clast_seen_ms\"<\n\x10\x44\x65nialGroupCount\x12\x12\n\ndeny_group\x18\x01 \x01(\t\x12\x14\n\x0c\x64\x65nied_count\x18\x02 \x01(\r\"\x8f\x01\n\x16NetworkActivitySummary\x12\x1e\n\x16network_activity_count\x18\x01 \x01(\r\x12\x1b\n\x13\x64\x65nied_action_count\x18\x02 \x01(\r\x12\x38\n\x10\x64\x65nials_by_group\x18\x03 \x03(\x0b\x32\x1e.openshell.v1.DenialGroupCount\"\x8c\x07\n\x0bPolicyChunk\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x11\n\trule_name\x18\x03 \x01(\t\x12>\n\rproposed_rule\x18\x04 \x01(\x0b\x32\'.openshell.sandbox.v1.NetworkPolicyRule\x12\x11\n\trationale\x18\x05 \x01(\t\x12\x16\n\x0esecurity_notes\x18\x06 \x01(\t\x12\x12\n\nconfidence\x18\x07 \x01(\x02\x12\x1a\n\x12\x64\x65nial_summary_ids\x18\x08 \x03(\t\x12\x30\n\x0c\x63reated_time\x18m \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0c\x64\x65\x63ided_time\x18n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\r\n\x05stage\x18\x0b \x01(\t\x12\x1b\n\x13supersedes_chunk_id\x18\x0c \x01(\t\x12\x11\n\thit_count\x18\r \x01(\x05\x12\x33\n\x0f\x66irst_seen_time\x18r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x32\n\x0elast_seen_time\x18s \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06\x62inary\x18\x10 \x01(\t\x12\x19\n\x11validation_result\x18\x11 \x01(\t\x12\x18\n\x10rejection_reason\x18\x12 \x01(\t\x12\x19\n\x11\x61pplication_error\x18\x13 \x01(\t\x12\x14\n\x0creview_token\x18\x14 \x01(\t\x12%\n\x1d\x63urrent_effective_policy_hash\x18\x15 \x01(\t\x12\'\n\x1f\x63\x61ndidate_effective_policy_hash\x18\x16 \x01(\t\x12\x45\n\x18\x63urrent_effective_policy\x18\x17 \x01(\x0b\x32#.openshell.sandbox.v1.SandboxPolicy\x12G\n\x1a\x63\x61ndidate_effective_policy\x18\x18 \x01(\x0b\x32#.openshell.sandbox.v1.SandboxPolicyJ\x04\x08\t\x10\nJ\x04\x08\n\x10\x0bJ\x04\x08\x0e\x10\x0fJ\x04\x08\x0f\x10\x10R\rcreated_at_msR\rdecided_at_msR\rfirst_seen_msR\x0clast_seen_ms\"f\n\x11\x44raftPolicyUpdate\x12\x15\n\rdraft_version\x18\x01 \x01(\x04\x12\x12\n\nnew_chunks\x18\x02 \x01(\r\x12\x15\n\rtotal_pending\x18\x03 \x01(\r\x12\x0f\n\x07summary\x18\x04 \x01(\t\"\xb4\x02\n\x1bSubmitPolicyAnalysisRequest\x12\x42\n\x0fworkspace_scope\x18\x06 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12.\n\tsummaries\x18\x01 \x03(\x0b\x32\x1b.openshell.v1.DenialSummary\x12\x32\n\x0fproposed_chunks\x18\x02 \x03(\x0b\x32\x19.openshell.v1.PolicyChunk\x12\x15\n\ranalysis_mode\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12H\n\x1anetwork_activity_summaries\x18\x05 \x03(\x0b\x32$.openshell.v1.NetworkActivitySummary\"\x87\x01\n\x1cSubmitPolicyAnalysisResponse\x12\x17\n\x0f\x61\x63\x63\x65pted_chunks\x18\x01 \x01(\r\x12\x17\n\x0frejected_chunks\x18\x02 \x01(\r\x12\x19\n\x11rejection_reasons\x18\x03 \x03(\t\x12\x1a\n\x12\x61\x63\x63\x65pted_chunk_ids\x18\x04 \x03(\t\"\x83\x01\n\x15GetDraftPolicyRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x15\n\rstatus_filter\x18\x02 \x01(\t\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\"\xc6\x01\n\x16GetDraftPolicyResponse\x12)\n\x06\x63hunks\x18\x01 \x03(\x0b\x32\x19.openshell.v1.PolicyChunk\x12\x17\n\x0frolling_summary\x18\x02 \x01(\t\x12\x15\n\rdraft_version\x18\x03 \x01(\x04\x12\x36\n\x12last_analyzed_time\x18h \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x04\x10\x05R\x13last_analyzed_at_ms\"\xab\x01\n\x18\x41pproveDraftChunkRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08\x63hunk_id\x18\x02 \x01(\t\x12\x14\n\x0creview_token\x18\x04 \x01(\t\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"H\n\x19\x41pproveDraftChunkResponse\x12\x16\n\x0epolicy_version\x18\x01 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x02 \x01(\t\"\xa4\x01\n\x17RejectDraftChunkRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08\x63hunk_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"\x1a\n\x18RejectDraftChunkResponse\"<\n\x12\x44raftChunkApproval\x12\x10\n\x08\x63hunk_id\x18\x01 \x01(\t\x12\x14\n\x0creview_token\x18\x02 \x01(\t\"\xde\x01\n\x1c\x41pproveAllDraftChunksRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12 \n\x18include_security_flagged\x18\x02 \x01(\x08\x12\x33\n\tapprovals\x18\x03 \x03(\x0b\x32 .openshell.v1.DraftChunkApproval\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"}\n\x1d\x41pproveAllDraftChunksResponse\x12\x16\n\x0epolicy_version\x18\x01 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x02 \x01(\t\x12\x17\n\x0f\x63hunks_approved\x18\x03 \x01(\r\x12\x16\n\x0e\x63hunks_skipped\x18\x04 \x01(\r\"\xd2\x01\n\x15\x45\x64itDraftChunkRequest\x12\x42\n\x0fworkspace_scope\x18\x04 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08\x63hunk_id\x18\x02 \x01(\t\x12>\n\rproposed_rule\x18\x03 \x01(\x0b\x32\'.openshell.sandbox.v1.NetworkPolicyRule\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x05 \x01(\t\"\x18\n\x16\x45\x64itDraftChunkResponse\"\x92\x01\n\x15UndoDraftChunkRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x10\n\x08\x63hunk_id\x18\x02 \x01(\t\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x04 \x01(\t\"E\n\x16UndoDraftChunkResponse\x12\x16\n\x0epolicy_version\x18\x01 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x02 \x01(\t\"\x82\x01\n\x17\x43learDraftChunksRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\x12\x12\n\nrequest_id\x18\x03 \x01(\t\"2\n\x18\x43learDraftChunksResponse\x12\x16\n\x0e\x63hunks_cleared\x18\x01 \x01(\r\"m\n\x16GetDraftHistoryRequest\x12\x42\n\x0fworkspace_scope\x18\x02 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0f\n\x07sandbox\x18\x01 \x01(\t\"\x92\x01\n\x11\x44raftHistoryEntry\x12.\n\nevent_time\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nevent_type\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x10\n\x08\x63hunk_id\x18\x04 \x01(\tJ\x04\x08\x01\x10\x02R\x0ctimestamp_ms\"K\n\x17GetDraftHistoryResponse\x12\x30\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x1f.openshell.v1.DraftHistoryEntry\"\xab\x01\n\x16\x43reateWorkspaceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12@\n\x06labels\x18\x02 \x03(\x0b\x32\x30.openshell.v1.CreateWorkspaceRequest.LabelsEntry\x12\x12\n\nrequest_id\x18\x03 \x01(\t\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"O\n\x17\x43reateWorkspaceResponse\x12\x34\n\tworkspace\x18\x01 \x01(\x0b\x32!.openshell.datamodel.v1.Workspace\"#\n\x13GetWorkspaceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"L\n\x14GetWorkspaceResponse\x12\x34\n\tworkspace\x18\x01 \x01(\x0b\x32!.openshell.datamodel.v1.Workspace\"V\n\x15ListWorkspacesRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x12\n\npage_token\x18\x02 \x01(\t\x12\x16\n\x0elabel_selector\x18\x03 \x01(\t\"h\n\x16ListWorkspacesResponse\x12\x35\n\nworkspaces\x18\x01 \x03(\x0b\x32!.openshell.datamodel.v1.Workspace\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"Q\n\x16\x44\x65leteWorkspaceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rallow_missing\x18\x02 \x01(\x08\x12\x12\n\nrequest_id\x18\x03 \x01(\t\"X\n\x17\x44\x65leteWorkspaceResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07\x64\x65leted\"\x8d\x01\n\x0fWorkspaceMember\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".openshell.datamodel.v1.ObjectMeta\x12\x19\n\x11principal_subject\x18\x02 \x01(\t\x12)\n\x04role\x18\x03 \x01(\x0e\x32\x1b.openshell.v1.WorkspaceRole\"\xb9\x01\n\x19\x41\x64\x64WorkspaceMemberRequest\x12\x42\n\x0fworkspace_scope\x18\x01 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x19\n\x11principal_subject\x18\x02 \x01(\t\x12)\n\x04role\x18\x03 \x01(\x0e\x32\x1b.openshell.v1.WorkspaceRole\x12\x12\n\nrequest_id\x18\x04 \x01(\t\"K\n\x1a\x41\x64\x64WorkspaceMemberResponse\x12-\n\x06member\x18\x01 \x01(\x0b\x32\x1d.openshell.v1.WorkspaceMember\"\xa8\x01\n\x1cRemoveWorkspaceMemberRequest\x12\x42\n\x0fworkspace_scope\x18\x01 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x19\n\x11principal_subject\x18\x02 \x01(\t\x12\x15\n\rallow_missing\x18\x03 \x01(\x08\x12\x12\n\nrequest_id\x18\x04 \x01(\t\"^\n\x1dRemoveWorkspaceMemberResponse\x12.\n\x07outcome\x18\x02 \x01(\x0e\x32\x1d.openshell.v1.DeletionOutcomeJ\x04\x08\x01\x10\x02R\x07removed\"\x88\x01\n\x1bListWorkspaceMembersRequest\x12\x42\n\x0fworkspace_scope\x18\x01 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\"g\n\x1cListWorkspaceMembersResponse\x12.\n\x07members\x18\x01 \x03(\x0b\x32\x1d.openshell.v1.WorkspaceMember\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x91\x01\n\x1a\x45xtensionServiceCredential\x12\x14\n\x0cservice_name\x18\x01 \x01(\t\x12\x13\n\x05token\x18\x02 \x01(\tB\x04\x88\xb5\x18\x01\x12\x33\n\x0f\x65xpiration_time\x18g \x01(\x0b\x32\x1a.google.protobuf.TimestampJ\x04\x08\x03\x10\x04R\rexpires_at_ms\"\x88\x01\n\x13\x45ndpointObservation\x12\x13\n\x0b\x65ndpoint_id\x18\x01 \x01(\t\x12,\n\x06result\x18\x02 \x01(\x0e\x32\x1c.openshell.v1.EndpointResult\x12.\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32\x1d.openshell.v1.EndpointFailure\"\xb1\x02\n\x1bReportEndpointStatusRequest\x12\x12\n\nsandbox_id\x18\x01 \x01(\t\x12\x13\n\x0bpolicy_hash\x18\x02 \x01(\t\x12\x1d\n\x15provider_env_revision\x18\x03 \x01(\x04\x12\x37\n\x0cobservations\x18\x04 \x03(\x0b\x32!.openshell.v1.EndpointObservation\x12\x1d\n\x15observed_endpoint_ids\x18\x05 \x03(\t\x12\x1d\n\x15supervisor_session_id\x18\x06 \x01(\t\x12\x17\n\x0freport_sequence\x18\x07 \x01(\x04\x12:\n\x12token_grant_status\x18\x08 \x01(\x0b\x32\x1e.openshell.v1.TokenGrantStatus\"T\n\x10TokenGrantStatus\x12@\n\x0clast_failure\x18\x01 \x01(\x0b\x32*.openshell.v1.TokenGrantFailureObservation\"\x82\x01\n\x1cTokenGrantFailureObservation\x12\x18\n\x10\x64\x65stination_host\x18\x01 \x01(\t\x12\x18\n\x10\x64\x65stination_port\x18\x02 \x01(\r\x12.\n\x07\x66\x61ilure\x18\x03 \x01(\x0b\x32\x1d.openshell.v1.EndpointFailure\"\x1e\n\x1cReportEndpointStatusResponse\"\x88\x02\n\x0e\x45ndpointStatus\x12\x13\n\x0b\x65ndpoint_id\x18\x01 \x01(\t\x12\x0c\n\x04host\x18\x02 \x01(\t\x12\r\n\x05ports\x18\x03 \x03(\r\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x31\n\x0blast_result\x18\x05 \x01(\x0e\x32\x1c.openshell.v1.EndpointResult\x12\x36\n\x12last_reported_time\x18j \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x33\n\x0clast_failure\x18\x07 \x01(\x0b\x32\x1d.openshell.v1.EndpointFailureJ\x04\x08\x06\x10\x07R\x10last_reported_at\"\xbb\x05\n\x13SandboxProvisioning\x12\x12\n\nattempt_id\x18\x01 \x01(\t\x12\x1f\n\x17\x63onfiguration_change_id\x18\x02 \x01(\t\x12=\n\x19\x63onfiguration_change_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x38\n\x14\x66irst_rejection_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12,\n\x08\x64\x65\x61\x64line\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0ctimeout_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12:\n\x16\x63leanup_completed_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\rcleanup_error\x18\x08 \x01(\t\x12\x36\n\x12\x63leanup_retry_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1c\n\x14\x61ttachment_change_id\x18\n \x01(\t\x12:\n\x16\x61ttachment_change_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x38\n\x14preparation_deadline\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x38\n\x14\x61\x64mission_start_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12 \n\x18\x64river_operation_pending\x18\x0e \x01(\x08\x12\x1b\n\x13\x64river_operation_id\x18\x0f \x01(\t\"\x82\x01\n\x16SandboxServiceExposure\x12\x0f\n\x07service\x18\x01 \x01(\t\x12\x13\n\x0btarget_port\x18\x02 \x01(\r\x12\x42\n\x12\x61uthorization_mode\x18\x03 \x01(\x0e\x32&.openshell.v1.ServiceAuthorizationMode\"\xad\x02\n\x0f\x45ndpointFailure\x12\x33\n\x06\x64omain\x18\x01 \x01(\x0e\x32#.openshell.v1.EndpointFailureDomain\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12N\n\x0frecovery_action\x18\x03 \x01(\x0e\x32\x35.openshell.v1.ProviderCredentialRefreshRecoveryAction\x12\x10\n\x08provider\x18\x04 \x01(\t\x12\x16\n\x0e\x63redential_key\x18\x05 \x01(\t\x12\r\n\x05stage\x18\x06 \x01(\t\x12!\n\x14upstream_http_status\x18\x07 \x01(\rH\x00\x88\x01\x01\x12\x12\n\nrequest_id\x18\x08 \x01(\tB\x17\n\x15_upstream_http_status*\xca\x01\n\rExtensionKind\x12\x1e\n\x1a\x45XTENSION_KIND_UNSPECIFIED\x10\x00\x12!\n\x1d\x45XTENSION_KIND_COMPUTE_DRIVER\x10\x01\x12$\n EXTENSION_KIND_CREDENTIAL_DRIVER\x10\x02\x12&\n\"EXTENSION_KIND_GATEWAY_INTERCEPTOR\x10\x03\x12(\n$EXTENSION_KIND_SUPERVISOR_MIDDLEWARE\x10\x04*\x81\x03\n\x0cSandboxPhase\x12\x1d\n\x19SANDBOX_PHASE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSANDBOX_PHASE_PROVISIONING\x10\x01\x12\x17\n\x13SANDBOX_PHASE_READY\x10\x02\x12\x17\n\x13SANDBOX_PHASE_ERROR\x10\x03\x12\x1a\n\x16SANDBOX_PHASE_DELETING\x10\x04\x12\x19\n\x15SANDBOX_PHASE_UNKNOWN\x10\x05\x12\x1a\n\x16SANDBOX_PHASE_STOPPING\x10\x06\x12\x19\n\x15SANDBOX_PHASE_STOPPED\x10\x07\x12\x1a\n\x16SANDBOX_PHASE_STARTING\x10\x08\x12\x1b\n\x17SANDBOX_PHASE_COMPLETED\x10\t\x12\x1c\n\x18SANDBOX_PHASE_SUSPENDING\x10\x0b\x12\x1b\n\x17SANDBOX_PHASE_SUSPENDED\x10\x0c\"\x04\x08\n\x10\n*\x18SANDBOX_PHASE_RESTARTING*\xcb\x01\n\x14ProviderMutationKind\x12&\n\"PROVIDER_MUTATION_KIND_UNSPECIFIED\x10\x00\x12!\n\x1dPROVIDER_MUTATION_KIND_ATTACH\x10\x01\x12!\n\x1dPROVIDER_MUTATION_KIND_DETACH\x10\x02\x12!\n\x1dPROVIDER_MUTATION_KIND_UPDATE\x10\x03\x12\"\n\x1ePROVIDER_MUTATION_KIND_OBSERVE\x10\x04*\xcf\x02\n\x16ProviderReadinessState\x12(\n$PROVIDER_READINESS_STATE_UNSPECIFIED\x10\x00\x12&\n\"PROVIDER_READINESS_STATE_PERSISTED\x10\x01\x12$\n PROVIDER_READINESS_STATE_PENDING\x10\x02\x12\"\n\x1ePROVIDER_READINESS_STATE_READY\x10\x03\x12%\n!PROVIDER_READINESS_STATE_WITHHELD\x10\x04\x12$\n PROVIDER_READINESS_STATE_REVOKED\x10\x05\x12#\n\x1fPROVIDER_READINESS_STATE_FAILED\x10\x06\x12\'\n#PROVIDER_READINESS_STATE_SUPERSEDED\x10\x07*\xda\x06\n\x17ProviderReadinessReason\x12)\n%PROVIDER_READINESS_REASON_UNSPECIFIED\x10\x00\x12\x34\n0PROVIDER_READINESS_REASON_WAITING_FOR_SUPERVISOR\x10\x01\x12\x35\n1PROVIDER_READINESS_REASON_WAITING_FOR_CREDENTIALS\x10\x02\x12\x30\n,PROVIDER_READINESS_REASON_WAITING_FOR_POLICY\x10\x03\x12\x31\n-PROVIDER_READINESS_REASON_WAITING_FOR_PROCESS\x10\x04\x12\x34\n0PROVIDER_READINESS_REASON_UNSUPPORTED_SUPERVISOR\x10\x05\x12\x32\n.PROVIDER_READINESS_REASON_CREDENTIALS_WITHHELD\x10\x06\x12\x37\n3PROVIDER_READINESS_REASON_CREDENTIAL_INSTALL_FAILED\x10\x07\x12\x36\n2PROVIDER_READINESS_REASON_POLICY_ACTIVATION_FAILED\x10\x08\x12\x34\n0PROVIDER_READINESS_REASON_PROCESS_INSTALL_FAILED\x10\t\x12\x35\n1PROVIDER_READINESS_REASON_SUPERVISOR_DISCONNECTED\x10\n\x12\x36\n2PROVIDER_READINESS_REASON_SUPERVISOR_LEASE_EXPIRED\x10\x0b\x12\x33\n/PROVIDER_READINESS_REASON_DESIRED_STATE_CHANGED\x10\x0c\x12\x30\n,PROVIDER_READINESS_REASON_CREDENTIAL_EXPIRED\x10\r\x12*\n&PROVIDER_READINESS_REASON_LOCAL_POLICY\x10\x0e\x12/\n+PROVIDER_READINESS_REASON_SNAPSHOT_MISMATCH\x10\x0f*\x83\x01\n\x0f\x43onfigComponent\x12 \n\x1c\x43ONFIG_COMPONENT_UNSPECIFIED\x10\x00\x12#\n\x1f\x43ONFIG_COMPONENT_SANDBOX_CONFIG\x10\x01\x12)\n%CONFIG_COMPONENT_PROVIDER_ENVIRONMENT\x10\x02*\x8d\x03\n\x12\x43onfigApplyOutcome\x12$\n CONFIG_APPLY_OUTCOME_UNSPECIFIED\x10\x00\x12 \n\x1c\x43ONFIG_APPLY_OUTCOME_APPLIED\x10\x01\x12*\n&CONFIG_APPLY_OUTCOME_IGNORED_DUPLICATE\x10\x02\x12&\n\"CONFIG_APPLY_OUTCOME_IGNORED_STALE\x10\x03\x12\x30\n,CONFIG_APPLY_OUTCOME_RETAINED_LOCAL_OVERRIDE\x10\x04\x12!\n\x1d\x43ONFIG_APPLY_OUTCOME_DEGRADED\x10\x05\x12\x38\n4CONFIG_APPLY_OUTCOME_FAILED_RETAINED_LAST_KNOWN_GOOD\x10\x06\x12&\n\"CONFIG_APPLY_OUTCOME_FAILED_CLOSED\x10\x07\x12$\n CONFIG_APPLY_OUTCOME_UNSUPPORTED\x10\x08*\xd2\x02\n\x1a\x43onfigUpdateOperationState\x12-\n)CONFIG_UPDATE_OPERATION_STATE_UNSPECIFIED\x10\x00\x12)\n%CONFIG_UPDATE_OPERATION_STATE_PENDING\x10\x01\x12)\n%CONFIG_UPDATE_OPERATION_STATE_APPLIED\x10\x02\x12*\n&CONFIG_UPDATE_OPERATION_STATE_INACTIVE\x10\x03\x12(\n$CONFIG_UPDATE_OPERATION_STATE_FAILED\x10\x04\x12,\n(CONFIG_UPDATE_OPERATION_STATE_SUPERSEDED\x10\x05\x12+\n\'CONFIG_UPDATE_OPERATION_STATE_CANCELLED\x10\x06*\xce\x01\n ProviderCredentialTokenGrantType\x12\x34\n0PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_UNSPECIFIED\x10\x00\x12;\n7PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_CLIENT_CREDENTIALS\x10\x01\x12\x37\n3PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_TOKEN_EXCHANGE\x10\x02*\xc3\x03\n!ProviderCredentialRefreshStrategy\x12\x34\n0PROVIDER_CREDENTIAL_REFRESH_STRATEGY_UNSPECIFIED\x10\x00\x12/\n+PROVIDER_CREDENTIAL_REFRESH_STRATEGY_STATIC\x10\x01\x12\x31\n-PROVIDER_CREDENTIAL_REFRESH_STRATEGY_EXTERNAL\x10\x02\x12=\n9PROVIDER_CREDENTIAL_REFRESH_STRATEGY_OAUTH2_REFRESH_TOKEN\x10\x03\x12\x42\n>PROVIDER_CREDENTIAL_REFRESH_STRATEGY_OAUTH2_CLIENT_CREDENTIALS\x10\x04\x12\x43\n?PROVIDER_CREDENTIAL_REFRESH_STRATEGY_GOOGLE_SERVICE_ACCOUNT_JWT\x10\x05\x12<\n8PROVIDER_CREDENTIAL_REFRESH_STRATEGY_AWS_STS_ASSUME_ROLE\x10\x06*\xdb\x02\n\x17ProviderProfileCategory\x12)\n%PROVIDER_PROFILE_CATEGORY_UNSPECIFIED\x10\x00\x12#\n\x1fPROVIDER_PROFILE_CATEGORY_OTHER\x10\x01\x12\'\n#PROVIDER_PROFILE_CATEGORY_INFERENCE\x10\x02\x12#\n\x1fPROVIDER_PROFILE_CATEGORY_AGENT\x10\x03\x12,\n(PROVIDER_PROFILE_CATEGORY_SOURCE_CONTROL\x10\x04\x12\'\n#PROVIDER_PROFILE_CATEGORY_MESSAGING\x10\x05\x12\"\n\x1ePROVIDER_PROFILE_CATEGORY_DATA\x10\x06\x12\'\n#PROVIDER_PROFILE_CATEGORY_KNOWLEDGE\x10\x07*\xde\x01\n&ProviderEnvironmentValueClassification\x12\x39\n5PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_UNSPECIFIED\x10\x00\x12\x38\n4PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_NON_SECRET\x10\x01\x12?\n;PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_STATIC_CREDENTIAL\x10\x02*\xcf\x01\n\x1b\x43onfigurationAdmissionState\x12-\n)CONFIGURATION_ADMISSION_STATE_UNSPECIFIED\x10\x00\x12)\n%CONFIGURATION_ADMISSION_STATE_PENDING\x10\x01\x12*\n&CONFIGURATION_ADMISSION_STATE_ACCEPTED\x10\x02\x12*\n&CONFIGURATION_ADMISSION_STATE_REJECTED\x10\x03*\x9a\x01\n\x0cPolicyStatus\x12\x1d\n\x19POLICY_STATUS_UNSPECIFIED\x10\x00\x12\x19\n\x15POLICY_STATUS_PENDING\x10\x01\x12\x18\n\x14POLICY_STATUS_LOADED\x10\x02\x12\x18\n\x14POLICY_STATUS_FAILED\x10\x03\x12\x1c\n\x18POLICY_STATUS_SUPERSEDED\x10\x04*\x86\x01\n\rServiceStatus\x12\x1e\n\x1aSERVICE_STATUS_UNSPECIFIED\x10\x00\x12\x1a\n\x16SERVICE_STATUS_HEALTHY\x10\x01\x12\x1b\n\x17SERVICE_STATUS_DEGRADED\x10\x02\x12\x1c\n\x18SERVICE_STATUS_UNHEALTHY\x10\x03*b\n\rWorkspaceRole\x12\x1e\n\x1aWORKSPACE_ROLE_UNSPECIFIED\x10\x00\x12\x17\n\x13WORKSPACE_ROLE_USER\x10\x01\x12\x18\n\x14WORKSPACE_ROLE_ADMIN\x10\x02*\xda\x02\n\'ProviderCredentialRefreshRecoveryAction\x12;\n7PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_UNSPECIFIED\x10\x00\x12\x35\n1PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_RETRY\x10\x01\x12;\n7PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_REAUTHORIZE\x10\x02\x12\x41\n=PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_FIX_CONFIGURATION\x10\x03\x12;\n7PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_INVESTIGATE\x10\x04*\xaa\x01\n\x14SandboxRestartPolicy\x12&\n\"SANDBOX_RESTART_POLICY_UNSPECIFIED\x10\x00\x12 \n\x1cSANDBOX_RESTART_POLICY_NEVER\x10\x01\x12%\n!SANDBOX_RESTART_POLICY_ON_FAILURE\x10\x02\x12!\n\x1dSANDBOX_RESTART_POLICY_ALWAYS\x10\x03*\x97\x01\n\x0f\x44\x65letionOutcome\x12 \n\x1c\x44\x45LETION_OUTCOME_UNSPECIFIED\x10\x00\x12\x1e\n\x1a\x44\x45LETION_OUTCOME_COMPLETED\x10\x01\x12\x1d\n\x19\x44\x45LETION_OUTCOME_ACCEPTED\x10\x02\x12#\n\x1f\x44\x45LETION_OUTCOME_ALREADY_ABSENT\x10\x03*\xc3\x02\n\x0e\x45ndpointResult\x12\x1f\n\x1b\x45NDPOINT_RESULT_UNSPECIFIED\x10\x00\x12(\n$ENDPOINT_RESULT_NO_OBSERVED_EXCHANGE\x10\x01\x12*\n&ENDPOINT_RESULT_HTTP_RESPONSE_RECEIVED\x10\x02\x12!\n\x1d\x45NDPOINT_RESULT_POLICY_DENIED\x10\x03\x12*\n&ENDPOINT_RESULT_CREDENTIAL_UNAVAILABLE\x10\x04\x12\x1e\n\x1a\x45NDPOINT_RESULT_TLS_FAILED\x10\x05\x12$\n ENDPOINT_RESULT_TRANSPORT_FAILED\x10\x06\x12%\n!ENDPOINT_RESULT_UPSTREAM_REJECTED\x10\x07*\x9f\x01\n\x18ServiceAuthorizationMode\x12*\n&SERVICE_AUTHORIZATION_MODE_UNSPECIFIED\x10\x00\x12$\n SERVICE_AUTHORIZATION_MODE_STRIP\x10\x01\x12\x31\n-SERVICE_AUTHORIZATION_MODE_BEARER_PASSTHROUGH\x10\x02*i\n\x15\x45ndpointFailureDomain\x12\'\n#ENDPOINT_FAILURE_DOMAIN_UNSPECIFIED\x10\x00\x12\'\n#ENDPOINT_FAILURE_DOMAIN_TOKEN_GRANT\x10\x01\x32\xa6Y\n\tOpenShell\x12Z\n\x06Health\x12\x1b.openshell.v1.HealthRequest\x1a\x1c.openshell.v1.HealthResponse\"\x15\x82\xb5\x18\x11\n\x0funauthenticated\x12i\n\x0eGetCurrentUser\x12#.openshell.v1.GetCurrentUserRequest\x1a$.openshell.v1.GetCurrentUserResponse\"\x0c\x82\xb5\x18\x08\n\x06\x62\x65\x61rer\x12\x86\x01\n\x0eGetGatewayInfo\x12#.openshell.v1.GetGatewayInfoRequest\x1a$.openshell.v1.GetGatewayInfoResponse\")\x82\xb5\x18%\n\x06\x62\x65\x61rer\x1a\x0eplatform_admin\"\x0b\x63onfig:read\x12u\n\rCreateSandbox\x12\".openshell.v1.CreateSandboxRequest\x1a\x1d.openshell.v1.SandboxResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12\x93\x01\n\x15\x42\x65ginRootfsTarStaging\x12*.openshell.v1.BeginRootfsTarStagingRequest\x1a+.openshell.v1.BeginRootfsTarStagingResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12n\n\nGetSandbox\x12\x1f.openshell.v1.GetSandboxRequest\x1a\x1d.openshell.v1.SandboxResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12z\n\rListSandboxes\x12\".openshell.v1.ListSandboxesRequest\x1a#.openshell.v1.ListSandboxesResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12\x8e\x01\n\x15\x43reateSandboxTemplate\x12*.openshell.v1.CreateSandboxTemplateRequest\x1a%.openshell.v1.SandboxTemplateResponse\"\"\x82\xb5\x18\x1e\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\rsandbox:write\x12\x86\x01\n\x12GetSandboxTemplate\x12\'.openshell.v1.GetSandboxTemplateRequest\x1a%.openshell.v1.SandboxTemplateResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12\x8f\x01\n\x14ListSandboxTemplates\x12).openshell.v1.ListSandboxTemplatesRequest\x1a*.openshell.v1.ListSandboxTemplatesResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12\x94\x01\n\x15\x44\x65leteSandboxTemplate\x12*.openshell.v1.DeleteSandboxTemplateRequest\x1a+.openshell.v1.DeleteSandboxTemplateResponse\"\"\x82\xb5\x18\x1e\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\rsandbox:write\x12\x8f\x01\n\x14ListSandboxProviders\x12).openshell.v1.ListSandboxProvidersRequest\x1a*.openshell.v1.ListSandboxProvidersResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12\x93\x01\n\x15\x41ttachSandboxProvider\x12*.openshell.v1.AttachSandboxProviderRequest\x1a+.openshell.v1.AttachSandboxProviderResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12\x93\x01\n\x15\x44\x65tachSandboxProvider\x12*.openshell.v1.DetachSandboxProviderRequest\x1a+.openshell.v1.DetachSandboxProviderResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12\x9b\x01\n\x18GetSandboxProviderStatus\x12-.openshell.v1.GetSandboxProviderStatusRequest\x1a..openshell.v1.GetSandboxProviderStatusResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12{\n\rDeleteSandbox\x12\".openshell.v1.DeleteSandboxRequest\x1a#.openshell.v1.DeleteSandboxResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12q\n\x0bStopSandbox\x12 .openshell.v1.StopSandboxRequest\x1a\x1d.openshell.v1.SandboxResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12s\n\x0cStartSandbox\x12!.openshell.v1.StartSandboxRequest\x1a\x1d.openshell.v1.SandboxResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12w\n\x0eSuspendSandbox\x12#.openshell.v1.SuspendSandboxRequest\x1a\x1d.openshell.v1.SandboxResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12u\n\rResumeSandbox\x12\".openshell.v1.ResumeSandboxRequest\x1a\x1d.openshell.v1.SandboxResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12\x84\x01\n\x10\x43reateSshSession\x12%.openshell.v1.CreateSshSessionRequest\x1a&.openshell.v1.CreateSshSessionResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12}\n\rExposeService\x12\".openshell.v1.ExposeServiceRequest\x1a%.openshell.v1.ServiceEndpointResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12v\n\nGetService\x12\x1f.openshell.v1.GetServiceRequest\x1a%.openshell.v1.ServiceEndpointResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12w\n\x0cListServices\x12!.openshell.v1.ListServicesRequest\x1a\".openshell.v1.ListServicesResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12{\n\rDeleteService\x12\".openshell.v1.DeleteServiceRequest\x1a#.openshell.v1.DeleteServiceResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12\x84\x01\n\x10RevokeSshSession\x12%.openshell.v1.RevokeSshSessionRequest\x1a&.openshell.v1.RevokeSshSessionResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write\x12t\n\x0b\x45xecSandbox\x12 .openshell.v1.ExecSandboxRequest\x1a\x1e.openshell.v1.ExecSandboxEvent\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write0\x01\x12q\n\nForwardTcp\x12\x1d.openshell.v1.TcpForwardFrame\x1a\x1d.openshell.v1.TcpForwardFrame\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write(\x01\x30\x01\x12\x7f\n\x16\x45xecSandboxInteractive\x12\x1e.openshell.v1.ExecSandboxInput\x1a\x1e.openshell.v1.ExecSandboxEvent\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:write(\x01\x30\x01\x12z\n\x0e\x43reateProvider\x12#.openshell.v1.CreateProviderRequest\x1a\x1e.openshell.v1.ProviderResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12r\n\x0bGetProvider\x12 .openshell.v1.GetProviderRequest\x1a\x1e.openshell.v1.ProviderResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rprovider:read\x12\x83\x01\n\x16GetProviderCredentials\x12+.openshell.v1.GetProviderCredentialsRequest\x1a,.openshell.v1.GetProviderCredentialsResponse\"\x0e\x82\xb5\x18\n\n\x08operator\x12{\n\rListProviders\x12\".openshell.v1.ListProvidersRequest\x1a#.openshell.v1.ListProvidersResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rprovider:read\x12\x90\x01\n\x14ListProviderProfiles\x12).openshell.v1.ListProviderProfilesRequest\x1a*.openshell.v1.ListProviderProfilesResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rprovider:read\x12\x87\x01\n\x12GetProviderProfile\x12\'.openshell.v1.GetProviderProfileRequest\x1a%.openshell.v1.ProviderProfileResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rprovider:read\x12\x98\x01\n\x16ImportProviderProfiles\x12+.openshell.v1.ImportProviderProfilesRequest\x1a,.openshell.v1.ImportProviderProfilesResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x98\x01\n\x16UpdateProviderProfiles\x12+.openshell.v1.UpdateProviderProfilesRequest\x1a,.openshell.v1.UpdateProviderProfilesResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x90\x01\n\x14LintProviderProfiles\x12).openshell.v1.LintProviderProfilesRequest\x1a*.openshell.v1.LintProviderProfilesResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rprovider:read\x12z\n\x0eUpdateProvider\x12#.openshell.v1.UpdateProviderRequest\x1a\x1e.openshell.v1.ProviderResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x9c\x01\n\x18GetProviderRefreshStatus\x12-.openshell.v1.GetProviderRefreshStatusRequest\x1a..openshell.v1.GetProviderRefreshStatusResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rprovider:read\x12\x9e\x01\n\x18\x43onfigureProviderRefresh\x12-.openshell.v1.ConfigureProviderRefreshRequest\x1a..openshell.v1.ConfigureProviderRefreshResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x9e\x01\n\x18RotateProviderCredential\x12-.openshell.v1.RotateProviderCredentialRequest\x1a..openshell.v1.RotateProviderCredentialResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x95\x01\n\x15\x44\x65leteProviderRefresh\x12*.openshell.v1.DeleteProviderRefreshRequest\x1a+.openshell.v1.DeleteProviderRefreshResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x80\x01\n\x0e\x44\x65leteProvider\x12#.openshell.v1.DeleteProviderRequest\x1a$.openshell.v1.DeleteProviderResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x95\x01\n\x15\x44\x65leteProviderProfile\x12*.openshell.v1.DeleteProviderProfileRequest\x1a+.openshell.v1.DeleteProviderProfileResponse\"#\x82\xb5\x18\x1f\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0eprovider:write\x12\x90\x01\n\x10GetSandboxConfig\x12-.openshell.sandbox.v1.GetSandboxConfigRequest\x1a..openshell.sandbox.v1.GetSandboxConfigResponse\"\x1d\x82\xb5\x18\x19\n\x04\x64ual\x12\x04user\"\x0b\x63onfig:read\x12\x8c\x01\n\x10GetGatewayConfig\x12-.openshell.sandbox.v1.GetGatewayConfigRequest\x1a..openshell.sandbox.v1.GetGatewayConfigResponse\"\x19\x82\xb5\x18\x15\n\x06\x62\x65\x61rer\"\x0b\x63onfig:read\x12v\n\x0cUpdateConfig\x12!.openshell.v1.UpdateConfigRequest\x1a\".openshell.v1.UpdateConfigResponse\"\x1f\x82\xb5\x18\x1b\n\x04\x64ual\x12\x05\x61\x64min\"\x0c\x63onfig:write\x12\x95\x01\n\x16GetSandboxPolicyStatus\x12+.openshell.v1.GetSandboxPolicyStatusRequest\x1a,.openshell.v1.GetSandboxPolicyStatusResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12\x8c\x01\n\x13ListSandboxPolicies\x12(.openshell.v1.ListSandboxPoliciesRequest\x1a).openshell.v1.ListSandboxPoliciesResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12v\n\x12ReportPolicyStatus\x12\'.openshell.v1.ReportPolicyStatusRequest\x1a(.openshell.v1.ReportPolicyStatusResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12|\n\x14ReportEndpointStatus\x12).openshell.v1.ReportEndpointStatusRequest\x1a*.openshell.v1.ReportEndpointStatusResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12\x85\x01\n\x17ReportProviderReadiness\x12,.openshell.v1.ReportProviderReadinessRequest\x1a-.openshell.v1.ReportProviderReadinessResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12\x8e\x01\n\x1aReportSandboxConfiguration\x12/.openshell.v1.ReportSandboxConfigurationRequest\x1a\x30.openshell.v1.ReportSandboxConfigurationResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12\x97\x01\n\x1dGetSandboxProviderEnvironment\x12\x32.openshell.v1.GetSandboxProviderEnvironmentRequest\x1a\x33.openshell.v1.GetSandboxProviderEnvironmentResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12\x94\x01\n\x1c\x45xchangeProviderSubjectToken\x12\x31.openshell.v1.ExchangeProviderSubjectTokenRequest\x1a\x32.openshell.v1.ExchangeProviderSubjectTokenResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12}\n\x0eGetSandboxLogs\x12#.openshell.v1.GetSandboxLogsRequest\x1a$.openshell.v1.GetSandboxLogsResponse\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read\x12o\n\x0fPushSandboxLogs\x12$.openshell.v1.PushSandboxLogsRequest\x1a%.openshell.v1.PushSandboxLogsResponse\"\r\x82\xb5\x18\t\n\x07sandbox(\x01\x12\x65\n\x11\x43onnectSupervisor\x12\x1f.openshell.v1.SupervisorMessage\x1a\x1c.openshell.v1.GatewayMessage\"\r\x82\xb5\x18\t\n\x07sandbox(\x01\x30\x01\x12\x7f\n\x15ReportMainProcessExit\x12*.openshell.v1.ReportMainProcessExitRequest\x1a+.openshell.v1.ReportMainProcessExitResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12\x85\x01\n\x17\x46inalizeMainProcessExit\x12,.openshell.v1.FinalizeMainProcessExitRequest\x1a-.openshell.v1.FinalizeMainProcessExitResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12T\n\x0bRelayStream\x12\x18.openshell.v1.RelayFrame\x1a\x18.openshell.v1.RelayFrame\"\r\x82\xb5\x18\t\n\x07sandbox(\x01\x30\x01\x12W\n\tPeerRelay\x12\x1c.openshell.v1.PeerRelayFrame\x1a\x1c.openshell.v1.PeerRelayFrame\"\n\x82\xb5\x18\x06\n\x04peer(\x01\x30\x01\x12\x86\x01\n\x1bPeerReportProviderReadiness\x12,.openshell.v1.ReportProviderReadinessRequest\x1a-.openshell.v1.ReportProviderReadinessResponse\"\n\x82\xb5\x18\x06\n\x04peer\x12}\n\x18PeerReportEndpointStatus\x12).openshell.v1.ReportEndpointStatusRequest\x1a*.openshell.v1.ReportEndpointStatusResponse\"\n\x82\xb5\x18\x06\n\x04peer\x12\x89\x01\n\x1cPeerGetSandboxProviderStatus\x12-.openshell.v1.GetSandboxProviderStatusRequest\x1a..openshell.v1.GetSandboxProviderStatusResponse\"\n\x82\xb5\x18\x06\n\x04peer\x12\x7f\n\x16PeerNotifyConfigUpdate\x12+.openshell.v1.PeerNotifyConfigUpdateRequest\x1a,.openshell.v1.PeerNotifyConfigUpdateResponse\"\n\x82\xb5\x18\x06\n\x04peer\x12w\n\x0cWatchSandbox\x12!.openshell.v1.WatchSandboxRequest\x1a .openshell.v1.SandboxStreamEvent\" \x82\xb5\x18\x1c\n\x06\x62\x65\x61rer\x12\x04user\"\x0csandbox:read0\x01\x12|\n\x14SubmitPolicyAnalysis\x12).openshell.v1.SubmitPolicyAnalysisRequest\x1a*.openshell.v1.SubmitPolicyAnalysisResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12z\n\x0eGetDraftPolicy\x12#.openshell.v1.GetDraftPolicyRequest\x1a$.openshell.v1.GetDraftPolicyResponse\"\x1d\x82\xb5\x18\x19\n\x04\x64ual\x12\x04user\"\x0b\x63onfig:read\x12\x87\x01\n\x11\x41pproveDraftChunk\x12&.openshell.v1.ApproveDraftChunkRequest\x1a\'.openshell.v1.ApproveDraftChunkResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0c\x63onfig:write\x12\x84\x01\n\x10RejectDraftChunk\x12%.openshell.v1.RejectDraftChunkRequest\x1a&.openshell.v1.RejectDraftChunkResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0c\x63onfig:write\x12\x93\x01\n\x15\x41pproveAllDraftChunks\x12*.openshell.v1.ApproveAllDraftChunksRequest\x1a+.openshell.v1.ApproveAllDraftChunksResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0c\x63onfig:write\x12~\n\x0e\x45\x64itDraftChunk\x12#.openshell.v1.EditDraftChunkRequest\x1a$.openshell.v1.EditDraftChunkResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0c\x63onfig:write\x12~\n\x0eUndoDraftChunk\x12#.openshell.v1.UndoDraftChunkRequest\x1a$.openshell.v1.UndoDraftChunkResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0c\x63onfig:write\x12\x84\x01\n\x10\x43learDraftChunks\x12%.openshell.v1.ClearDraftChunksRequest\x1a&.openshell.v1.ClearDraftChunksResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0c\x63onfig:write\x12\x7f\n\x0fGetDraftHistory\x12$.openshell.v1.GetDraftHistoryRequest\x1a%.openshell.v1.GetDraftHistoryResponse\"\x1f\x82\xb5\x18\x1b\n\x06\x62\x65\x61rer\x12\x04user\"\x0b\x63onfig:read\x12s\n\x11IssueSandboxToken\x12&.openshell.v1.IssueSandboxTokenRequest\x1a\'.openshell.v1.IssueSandboxTokenResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12y\n\x13RefreshSandboxToken\x12(.openshell.v1.RefreshSandboxTokenRequest\x1a).openshell.v1.RefreshSandboxTokenResponse\"\r\x82\xb5\x18\t\n\x07sandbox\x12\x8d\x01\n\x0f\x43reateWorkspace\x12$.openshell.v1.CreateWorkspaceRequest\x1a%.openshell.v1.CreateWorkspaceResponse\"-\x82\xb5\x18)\n\x06\x62\x65\x61rer\x1a\x0eplatform_admin\"\x0fworkspace:write\x12y\n\x0cGetWorkspace\x12!.openshell.v1.GetWorkspaceRequest\x1a\".openshell.v1.GetWorkspaceResponse\"\"\x82\xb5\x18\x1e\n\x06\x62\x65\x61rer\x12\x04user\"\x0eworkspace:read\x12\x7f\n\x0eListWorkspaces\x12#.openshell.v1.ListWorkspacesRequest\x1a$.openshell.v1.ListWorkspacesResponse\"\"\x82\xb5\x18\x1e\n\x06\x62\x65\x61rer\x12\x04user\"\x0eworkspace:read\x12\x8d\x01\n\x0f\x44\x65leteWorkspace\x12$.openshell.v1.DeleteWorkspaceRequest\x1a%.openshell.v1.DeleteWorkspaceResponse\"-\x82\xb5\x18)\n\x06\x62\x65\x61rer\x1a\x0eplatform_admin\"\x0fworkspace:write\x12\x8d\x01\n\x12\x41\x64\x64WorkspaceMember\x12\'.openshell.v1.AddWorkspaceMemberRequest\x1a(.openshell.v1.AddWorkspaceMemberResponse\"$\x82\xb5\x18 \n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0fworkspace:write\x12\x96\x01\n\x15RemoveWorkspaceMember\x12*.openshell.v1.RemoveWorkspaceMemberRequest\x1a+.openshell.v1.RemoveWorkspaceMemberResponse\"$\x82\xb5\x18 \n\x06\x62\x65\x61rer\x12\x05\x61\x64min\"\x0fworkspace:write\x12\x91\x01\n\x14ListWorkspaceMembers\x12).openshell.v1.ListWorkspaceMembersRequest\x1a*.openshell.v1.ListWorkspaceMembersResponse\"\"\x82\xb5\x18\x1e\n\x06\x62\x65\x61rer\x12\x04user\"\x0eworkspace:read2\x87\x01\n\x0eSandboxUpdates\x12u\n\rUpdateSandbox\x12\".openshell.v1.UpdateSandboxRequest\x1a\x1d.openshell.v1.SandboxResponse\"!\x82\xb5\x18\x1d\n\x06\x62\x65\x61rer\x12\x04user\"\rsandbox:writeb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'openshell_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_ISSUESANDBOXTOKENRESPONSE'].fields_by_name['token']._loaded_options = None + _globals['_ISSUESANDBOXTOKENRESPONSE'].fields_by_name['token']._serialized_options = b'\210\265\030\001' + _globals['_REFRESHSANDBOXTOKENRESPONSE'].fields_by_name['token']._loaded_options = None + _globals['_REFRESHSANDBOXTOKENRESPONSE'].fields_by_name['token']._serialized_options = b'\210\265\030\001' + _globals['_REFRESHSANDBOXTOKENRESPONSE'].fields_by_name['sandbox_token']._loaded_options = None + _globals['_REFRESHSANDBOXTOKENRESPONSE'].fields_by_name['sandbox_token']._serialized_options = b'\210\265\030\001' + _globals['_SANDBOXSPEC_ENVIRONMENTENTRY']._loaded_options = None + _globals['_SANDBOXSPEC_ENVIRONMENTENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXTEMPLATE_LABELSENTRY']._loaded_options = None + _globals['_SANDBOXTEMPLATE_LABELSENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXTEMPLATE_ANNOTATIONSENTRY']._loaded_options = None + _globals['_SANDBOXTEMPLATE_ANNOTATIONSENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXTEMPLATE_ENVIRONMENTENTRY']._loaded_options = None + _globals['_SANDBOXTEMPLATE_ENVIRONMENTENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXWORKLOADCONFIG_ENVIRONMENTENTRY']._loaded_options = None + _globals['_SANDBOXWORKLOADCONFIG_ENVIRONMENTENTRY']._serialized_options = b'8\001' + _globals['_PLATFORMEVENT_METADATAENTRY']._loaded_options = None + _globals['_PLATFORMEVENT_METADATAENTRY']._serialized_options = b'8\001' + _globals['_CREATESANDBOXREQUEST_LABELSENTRY']._loaded_options = None + _globals['_CREATESANDBOXREQUEST_LABELSENTRY']._serialized_options = b'8\001' + _globals['_CREATESANDBOXREQUEST_ANNOTATIONSENTRY']._loaded_options = None + _globals['_CREATESANDBOXREQUEST_ANNOTATIONSENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXMAPUPDATE_VALUESENTRY']._loaded_options = None + _globals['_SANDBOXMAPUPDATE_VALUESENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXRESPONSE_SERVICEURLSENTRY']._loaded_options = None + _globals['_SANDBOXRESPONSE_SERVICEURLSENTRY']._serialized_options = b'8\001' + _globals['_CREATESSHSESSIONRESPONSE'].fields_by_name['token']._loaded_options = None + _globals['_CREATESSHSESSIONRESPONSE'].fields_by_name['token']._serialized_options = b'\210\265\030\001' + _globals['_REVOKESSHSESSIONREQUEST'].fields_by_name['token']._loaded_options = None + _globals['_REVOKESSHSESSIONREQUEST'].fields_by_name['token']._serialized_options = b'\210\265\030\001' + _globals['_EXECSANDBOXREQUEST_ENVIRONMENTENTRY']._loaded_options = None + _globals['_EXECSANDBOXREQUEST_ENVIRONMENTENTRY']._serialized_options = b'8\001' + _globals['_TCPFORWARDINIT'].fields_by_name['authorization_token']._loaded_options = None + _globals['_TCPFORWARDINIT'].fields_by_name['authorization_token']._serialized_options = b'\210\265\030\001' + _globals['_SSHSESSION'].fields_by_name['token']._loaded_options = None + _globals['_SSHSESSION'].fields_by_name['token']._serialized_options = b'\210\265\030\001' + _globals['_SANDBOXLOGLINE_FIELDSENTRY']._loaded_options = None + _globals['_SANDBOXLOGLINE_FIELDSENTRY']._serialized_options = b'8\001' + _globals['_PROVIDERCREDENTIALVALUE'].fields_by_name['value']._loaded_options = None + _globals['_PROVIDERCREDENTIALVALUE'].fields_by_name['value']._serialized_options = b'\210\265\030\001' + _globals['_GETPROVIDERCREDENTIALSRESPONSE_CREDENTIALSENTRY']._loaded_options = None + _globals['_GETPROVIDERCREDENTIALSRESPONSE_CREDENTIALSENTRY']._serialized_options = b'8\001' + _globals['_UPDATEPROVIDERREQUEST_CREDENTIALEXPIRATIONTIMESENTRY']._loaded_options = None + _globals['_UPDATEPROVIDERREQUEST_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_options = b'8\001' + _globals['_CONFIGUREPROVIDERREFRESHREQUEST_MATERIALENTRY']._loaded_options = None + _globals['_CONFIGUREPROVIDERREFRESHREQUEST_MATERIALENTRY']._serialized_options = b'8\001' + _globals['_CONFIGUREPROVIDERREFRESHREQUEST'].fields_by_name['material']._loaded_options = None + _globals['_CONFIGUREPROVIDERREFRESHREQUEST'].fields_by_name['material']._serialized_options = b'\210\265\030\001' + _globals['_PROVIDERPROFILE_ANNOTATIONSENTRY']._loaded_options = None + _globals['_PROVIDERPROFILE_ANNOTATIONSENTRY']._serialized_options = b'8\001' + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_ENVIRONMENTENTRY']._loaded_options = None + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_ENVIRONMENTENTRY']._serialized_options = b'8\001' + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_CREDENTIALEXPIRATIONTIMESENTRY']._loaded_options = None + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_options = b'8\001' + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_DYNAMICCREDENTIALSENTRY']._loaded_options = None + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_DYNAMICCREDENTIALSENTRY']._serialized_options = b'8\001' + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_STATICCREDENTIALBINDINGSENTRY']._loaded_options = None + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_STATICCREDENTIALBINDINGSENTRY']._serialized_options = b'8\001' + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_FILESENTRY']._loaded_options = None + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_FILESENTRY']._serialized_options = b'8\001' + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE'].fields_by_name['environment']._loaded_options = None + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE'].fields_by_name['environment']._serialized_options = b'\210\265\030\001' + _globals['_PROVIDERENVIRONMENTVALUE'].fields_by_name['value']._loaded_options = None + _globals['_PROVIDERENVIRONMENTVALUE'].fields_by_name['value']._serialized_options = b'\210\265\030\001' + _globals['_PROVIDERENVIRONMENTSNAPSHOT_DYNAMICCREDENTIALSENTRY']._loaded_options = None + _globals['_PROVIDERENVIRONMENTSNAPSHOT_DYNAMICCREDENTIALSENTRY']._serialized_options = b'8\001' + _globals['_PROVIDERENVIRONMENTSNAPSHOT_FILESENTRY']._loaded_options = None + _globals['_PROVIDERENVIRONMENTSNAPSHOT_FILESENTRY']._serialized_options = b'8\001' + _globals['_EXCHANGEPROVIDERSUBJECTTOKENREQUEST'].fields_by_name['supervisor_jwt_svid']._loaded_options = None + _globals['_EXCHANGEPROVIDERSUBJECTTOKENREQUEST'].fields_by_name['supervisor_jwt_svid']._serialized_options = b'\210\265\030\001' + _globals['_EXCHANGEPROVIDERSUBJECTTOKENRESPONSE'].fields_by_name['access_token']._loaded_options = None + _globals['_EXCHANGEPROVIDERSUBJECTTOKENRESPONSE'].fields_by_name['access_token']._serialized_options = b'\210\265\030\001' + _globals['_UPDATECONFIGREQUEST_ANNOTATIONSENTRY']._loaded_options = None + _globals['_UPDATECONFIGREQUEST_ANNOTATIONSENTRY']._serialized_options = b'8\001' + _globals['_UPDATECONFIGRESPONSE_ANNOTATIONSENTRY']._loaded_options = None + _globals['_UPDATECONFIGRESPONSE_ANNOTATIONSENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXPOLICYREVISION_PROVENANCEENTRY']._loaded_options = None + _globals['_SANDBOXPOLICYREVISION_PROVENANCEENTRY']._serialized_options = b'8\001' + _globals['_CREATEWORKSPACEREQUEST_LABELSENTRY']._loaded_options = None + _globals['_CREATEWORKSPACEREQUEST_LABELSENTRY']._serialized_options = b'8\001' + _globals['_EXTENSIONSERVICECREDENTIAL'].fields_by_name['token']._loaded_options = None + _globals['_EXTENSIONSERVICECREDENTIAL'].fields_by_name['token']._serialized_options = b'\210\265\030\001' + _globals['_OPENSHELL'].methods_by_name['Health']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['Health']._serialized_options = b'\202\265\030\021\n\017unauthenticated' + _globals['_OPENSHELL'].methods_by_name['GetCurrentUser']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetCurrentUser']._serialized_options = b'\202\265\030\010\n\006bearer' + _globals['_OPENSHELL'].methods_by_name['GetGatewayInfo']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetGatewayInfo']._serialized_options = b'\202\265\030%\n\006bearer\032\016platform_admin\"\013config:read' + _globals['_OPENSHELL'].methods_by_name['CreateSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['CreateSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['BeginRootfsTarStaging']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['BeginRootfsTarStaging']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['GetSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetSandbox']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['ListSandboxes']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListSandboxes']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['CreateSandboxTemplate']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['CreateSandboxTemplate']._serialized_options = b'\202\265\030\036\n\006bearer\022\005admin\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['GetSandboxTemplate']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetSandboxTemplate']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['ListSandboxTemplates']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListSandboxTemplates']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['DeleteSandboxTemplate']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DeleteSandboxTemplate']._serialized_options = b'\202\265\030\036\n\006bearer\022\005admin\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['ListSandboxProviders']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListSandboxProviders']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['AttachSandboxProvider']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['AttachSandboxProvider']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['DetachSandboxProvider']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DetachSandboxProvider']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['GetSandboxProviderStatus']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetSandboxProviderStatus']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['DeleteSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DeleteSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['StopSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['StopSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['StartSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['StartSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['SuspendSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['SuspendSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['ResumeSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ResumeSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['CreateSshSession']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['CreateSshSession']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['ExposeService']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ExposeService']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['GetService']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetService']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['ListServices']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListServices']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['DeleteService']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DeleteService']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['RevokeSshSession']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['RevokeSshSession']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['ExecSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ExecSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['ForwardTcp']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ForwardTcp']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['ExecSandboxInteractive']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ExecSandboxInteractive']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_OPENSHELL'].methods_by_name['CreateProvider']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['CreateProvider']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['GetProvider']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetProvider']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rprovider:read' + _globals['_OPENSHELL'].methods_by_name['GetProviderCredentials']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetProviderCredentials']._serialized_options = b'\202\265\030\n\n\010operator' + _globals['_OPENSHELL'].methods_by_name['ListProviders']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListProviders']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rprovider:read' + _globals['_OPENSHELL'].methods_by_name['ListProviderProfiles']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListProviderProfiles']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rprovider:read' + _globals['_OPENSHELL'].methods_by_name['GetProviderProfile']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetProviderProfile']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rprovider:read' + _globals['_OPENSHELL'].methods_by_name['ImportProviderProfiles']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ImportProviderProfiles']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['UpdateProviderProfiles']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['UpdateProviderProfiles']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['LintProviderProfiles']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['LintProviderProfiles']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rprovider:read' + _globals['_OPENSHELL'].methods_by_name['UpdateProvider']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['UpdateProvider']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['GetProviderRefreshStatus']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetProviderRefreshStatus']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rprovider:read' + _globals['_OPENSHELL'].methods_by_name['ConfigureProviderRefresh']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ConfigureProviderRefresh']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['RotateProviderCredential']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['RotateProviderCredential']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['DeleteProviderRefresh']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DeleteProviderRefresh']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['DeleteProvider']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DeleteProvider']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['DeleteProviderProfile']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DeleteProviderProfile']._serialized_options = b'\202\265\030\037\n\006bearer\022\005admin\"\016provider:write' + _globals['_OPENSHELL'].methods_by_name['GetSandboxConfig']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetSandboxConfig']._serialized_options = b'\202\265\030\031\n\004dual\022\004user\"\013config:read' + _globals['_OPENSHELL'].methods_by_name['GetGatewayConfig']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetGatewayConfig']._serialized_options = b'\202\265\030\025\n\006bearer\"\013config:read' + _globals['_OPENSHELL'].methods_by_name['UpdateConfig']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['UpdateConfig']._serialized_options = b'\202\265\030\033\n\004dual\022\005admin\"\014config:write' + _globals['_OPENSHELL'].methods_by_name['GetSandboxPolicyStatus']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetSandboxPolicyStatus']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['ListSandboxPolicies']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListSandboxPolicies']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['ReportPolicyStatus']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ReportPolicyStatus']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['ReportEndpointStatus']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ReportEndpointStatus']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['ReportProviderReadiness']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ReportProviderReadiness']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['ReportSandboxConfiguration']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ReportSandboxConfiguration']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['GetSandboxProviderEnvironment']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetSandboxProviderEnvironment']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['ExchangeProviderSubjectToken']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ExchangeProviderSubjectToken']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['GetSandboxLogs']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetSandboxLogs']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['PushSandboxLogs']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['PushSandboxLogs']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['ConnectSupervisor']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ConnectSupervisor']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['ReportMainProcessExit']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ReportMainProcessExit']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['FinalizeMainProcessExit']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['FinalizeMainProcessExit']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['RelayStream']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['RelayStream']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['PeerRelay']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['PeerRelay']._serialized_options = b'\202\265\030\006\n\004peer' + _globals['_OPENSHELL'].methods_by_name['PeerReportProviderReadiness']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['PeerReportProviderReadiness']._serialized_options = b'\202\265\030\006\n\004peer' + _globals['_OPENSHELL'].methods_by_name['PeerReportEndpointStatus']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['PeerReportEndpointStatus']._serialized_options = b'\202\265\030\006\n\004peer' + _globals['_OPENSHELL'].methods_by_name['PeerGetSandboxProviderStatus']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['PeerGetSandboxProviderStatus']._serialized_options = b'\202\265\030\006\n\004peer' + _globals['_OPENSHELL'].methods_by_name['PeerNotifyConfigUpdate']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['PeerNotifyConfigUpdate']._serialized_options = b'\202\265\030\006\n\004peer' + _globals['_OPENSHELL'].methods_by_name['WatchSandbox']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['WatchSandbox']._serialized_options = b'\202\265\030\034\n\006bearer\022\004user\"\014sandbox:read' + _globals['_OPENSHELL'].methods_by_name['SubmitPolicyAnalysis']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['SubmitPolicyAnalysis']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['GetDraftPolicy']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetDraftPolicy']._serialized_options = b'\202\265\030\031\n\004dual\022\004user\"\013config:read' + _globals['_OPENSHELL'].methods_by_name['ApproveDraftChunk']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ApproveDraftChunk']._serialized_options = b'\202\265\030\035\n\006bearer\022\005admin\"\014config:write' + _globals['_OPENSHELL'].methods_by_name['RejectDraftChunk']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['RejectDraftChunk']._serialized_options = b'\202\265\030\035\n\006bearer\022\005admin\"\014config:write' + _globals['_OPENSHELL'].methods_by_name['ApproveAllDraftChunks']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ApproveAllDraftChunks']._serialized_options = b'\202\265\030\035\n\006bearer\022\005admin\"\014config:write' + _globals['_OPENSHELL'].methods_by_name['EditDraftChunk']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['EditDraftChunk']._serialized_options = b'\202\265\030\035\n\006bearer\022\005admin\"\014config:write' + _globals['_OPENSHELL'].methods_by_name['UndoDraftChunk']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['UndoDraftChunk']._serialized_options = b'\202\265\030\035\n\006bearer\022\005admin\"\014config:write' + _globals['_OPENSHELL'].methods_by_name['ClearDraftChunks']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ClearDraftChunks']._serialized_options = b'\202\265\030\035\n\006bearer\022\005admin\"\014config:write' + _globals['_OPENSHELL'].methods_by_name['GetDraftHistory']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetDraftHistory']._serialized_options = b'\202\265\030\033\n\006bearer\022\004user\"\013config:read' + _globals['_OPENSHELL'].methods_by_name['IssueSandboxToken']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['IssueSandboxToken']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['RefreshSandboxToken']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['RefreshSandboxToken']._serialized_options = b'\202\265\030\t\n\007sandbox' + _globals['_OPENSHELL'].methods_by_name['CreateWorkspace']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['CreateWorkspace']._serialized_options = b'\202\265\030)\n\006bearer\032\016platform_admin\"\017workspace:write' + _globals['_OPENSHELL'].methods_by_name['GetWorkspace']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['GetWorkspace']._serialized_options = b'\202\265\030\036\n\006bearer\022\004user\"\016workspace:read' + _globals['_OPENSHELL'].methods_by_name['ListWorkspaces']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListWorkspaces']._serialized_options = b'\202\265\030\036\n\006bearer\022\004user\"\016workspace:read' + _globals['_OPENSHELL'].methods_by_name['DeleteWorkspace']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['DeleteWorkspace']._serialized_options = b'\202\265\030)\n\006bearer\032\016platform_admin\"\017workspace:write' + _globals['_OPENSHELL'].methods_by_name['AddWorkspaceMember']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['AddWorkspaceMember']._serialized_options = b'\202\265\030 \n\006bearer\022\005admin\"\017workspace:write' + _globals['_OPENSHELL'].methods_by_name['RemoveWorkspaceMember']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['RemoveWorkspaceMember']._serialized_options = b'\202\265\030 \n\006bearer\022\005admin\"\017workspace:write' + _globals['_OPENSHELL'].methods_by_name['ListWorkspaceMembers']._loaded_options = None + _globals['_OPENSHELL'].methods_by_name['ListWorkspaceMembers']._serialized_options = b'\202\265\030\036\n\006bearer\022\004user\"\016workspace:read' + _globals['_SANDBOXUPDATES'].methods_by_name['UpdateSandbox']._loaded_options = None + _globals['_SANDBOXUPDATES'].methods_by_name['UpdateSandbox']._serialized_options = b'\202\265\030\035\n\006bearer\022\004user\"\rsandbox:write' + _globals['_EXTENSIONKIND']._serialized_start=43765 + _globals['_EXTENSIONKIND']._serialized_end=43967 + _globals['_SANDBOXPHASE']._serialized_start=43970 + _globals['_SANDBOXPHASE']._serialized_end=44355 + _globals['_PROVIDERMUTATIONKIND']._serialized_start=44358 + _globals['_PROVIDERMUTATIONKIND']._serialized_end=44561 + _globals['_PROVIDERREADINESSSTATE']._serialized_start=44564 + _globals['_PROVIDERREADINESSSTATE']._serialized_end=44899 + _globals['_PROVIDERREADINESSREASON']._serialized_start=44902 + _globals['_PROVIDERREADINESSREASON']._serialized_end=45760 + _globals['_CONFIGCOMPONENT']._serialized_start=45763 + _globals['_CONFIGCOMPONENT']._serialized_end=45894 + _globals['_CONFIGAPPLYOUTCOME']._serialized_start=45897 + _globals['_CONFIGAPPLYOUTCOME']._serialized_end=46294 + _globals['_CONFIGUPDATEOPERATIONSTATE']._serialized_start=46297 + _globals['_CONFIGUPDATEOPERATIONSTATE']._serialized_end=46635 + _globals['_PROVIDERCREDENTIALTOKENGRANTTYPE']._serialized_start=46638 + _globals['_PROVIDERCREDENTIALTOKENGRANTTYPE']._serialized_end=46844 + _globals['_PROVIDERCREDENTIALREFRESHSTRATEGY']._serialized_start=46847 + _globals['_PROVIDERCREDENTIALREFRESHSTRATEGY']._serialized_end=47298 + _globals['_PROVIDERPROFILECATEGORY']._serialized_start=47301 + _globals['_PROVIDERPROFILECATEGORY']._serialized_end=47648 + _globals['_PROVIDERENVIRONMENTVALUECLASSIFICATION']._serialized_start=47651 + _globals['_PROVIDERENVIRONMENTVALUECLASSIFICATION']._serialized_end=47873 + _globals['_CONFIGURATIONADMISSIONSTATE']._serialized_start=47876 + _globals['_CONFIGURATIONADMISSIONSTATE']._serialized_end=48083 + _globals['_POLICYSTATUS']._serialized_start=48086 + _globals['_POLICYSTATUS']._serialized_end=48240 + _globals['_SERVICESTATUS']._serialized_start=48243 + _globals['_SERVICESTATUS']._serialized_end=48377 + _globals['_WORKSPACEROLE']._serialized_start=48379 + _globals['_WORKSPACEROLE']._serialized_end=48477 + _globals['_PROVIDERCREDENTIALREFRESHRECOVERYACTION']._serialized_start=48480 + _globals['_PROVIDERCREDENTIALREFRESHRECOVERYACTION']._serialized_end=48826 + _globals['_SANDBOXRESTARTPOLICY']._serialized_start=48829 + _globals['_SANDBOXRESTARTPOLICY']._serialized_end=48999 + _globals['_DELETIONOUTCOME']._serialized_start=49002 + _globals['_DELETIONOUTCOME']._serialized_end=49153 + _globals['_ENDPOINTRESULT']._serialized_start=49156 + _globals['_ENDPOINTRESULT']._serialized_end=49479 + _globals['_SERVICEAUTHORIZATIONMODE']._serialized_start=49482 + _globals['_SERVICEAUTHORIZATIONMODE']._serialized_end=49641 + _globals['_ENDPOINTFAILUREDOMAIN']._serialized_start=49643 + _globals['_ENDPOINTFAILUREDOMAIN']._serialized_end=49748 + _globals['_ISSUESANDBOXTOKENREQUEST']._serialized_start=175 + _globals['_ISSUESANDBOXTOKENREQUEST']._serialized_end=201 + _globals['_ISSUESANDBOXTOKENRESPONSE']._serialized_start=203 + _globals['_ISSUESANDBOXTOKENRESPONSE']._serialized_end=325 + _globals['_REFRESHSANDBOXTOKENREQUEST']._serialized_start=327 + _globals['_REFRESHSANDBOXTOKENREQUEST']._serialized_end=388 + _globals['_REFRESHSANDBOXTOKENRESPONSE']._serialized_start=391 + _globals['_REFRESHSANDBOXTOKENRESPONSE']._serialized_end=753 + _globals['_HEALTHREQUEST']._serialized_start=755 + _globals['_HEALTHREQUEST']._serialized_end=770 + _globals['_HEALTHRESPONSE']._serialized_start=772 + _globals['_HEALTHRESPONSE']._serialized_end=850 + _globals['_GETCURRENTUSERREQUEST']._serialized_start=852 + _globals['_GETCURRENTUSERREQUEST']._serialized_end=875 + _globals['_GETCURRENTUSERRESPONSE']._serialized_start=877 + _globals['_GETCURRENTUSERRESPONSE']._serialized_end=998 + _globals['_GETGATEWAYINFOREQUEST']._serialized_start=1000 + _globals['_GETGATEWAYINFOREQUEST']._serialized_end=1023 + _globals['_GETGATEWAYINFORESPONSE']._serialized_start=1026 + _globals['_GETGATEWAYINFORESPONSE']._serialized_end=1237 + _globals['_NEGOTIATEDEXTENSIONINFO']._serialized_start=1240 + _globals['_NEGOTIATEDEXTENSIONINFO']._serialized_end=1505 + _globals['_COMPUTEDRIVERINFO']._serialized_start=1507 + _globals['_COMPUTEDRIVERINFO']._serialized_end=1603 + _globals['_COMPUTEDRIVERCAPABILITIES']._serialized_start=1606 + _globals['_COMPUTEDRIVERCAPABILITIES']._serialized_end=1745 + _globals['_RESOURCECAPABILITIES']._serialized_start=1748 + _globals['_RESOURCECAPABILITIES']._serialized_end=1932 + _globals['_CPURESOURCECAPABILITIES']._serialized_start=1934 + _globals['_CPURESOURCECAPABILITIES']._serialized_end=1984 + _globals['_MEMORYRESOURCECAPABILITIES']._serialized_start=1986 + _globals['_MEMORYRESOURCECAPABILITIES']._serialized_end=2039 + _globals['_GPURESOURCECAPABILITIES']._serialized_start=2041 + _globals['_GPURESOURCECAPABILITIES']._serialized_end=2138 + _globals['_SANDBOX']._serialized_start=2141 + _globals['_SANDBOX']._serialized_end=2452 + _globals['_SANDBOXSPEC']._serialized_start=2455 + _globals['_SANDBOXSPEC']._serialized_end=2965 + _globals['_SANDBOXSPEC_ENVIRONMENTENTRY']._serialized_start=2867 + _globals['_SANDBOXSPEC_ENVIRONMENTENTRY']._serialized_end=2917 + _globals['_RESOURCEREQUIREMENTS']._serialized_start=2967 + _globals['_RESOURCEREQUIREMENTS']._serialized_end=3041 + _globals['_GPURESOURCEREQUIREMENTS']._serialized_start=3043 + _globals['_GPURESOURCEREQUIREMENTS']._serialized_end=3098 + _globals['_SANDBOXTEMPLATE']._serialized_start=3101 + _globals['_SANDBOXTEMPLATE']._serialized_end=3703 + _globals['_SANDBOXTEMPLATE_LABELSENTRY']._serialized_start=3504 + _globals['_SANDBOXTEMPLATE_LABELSENTRY']._serialized_end=3549 + _globals['_SANDBOXTEMPLATE_ANNOTATIONSENTRY']._serialized_start=3551 + _globals['_SANDBOXTEMPLATE_ANNOTATIONSENTRY']._serialized_end=3601 + _globals['_SANDBOXTEMPLATE_ENVIRONMENTENTRY']._serialized_start=2867 + _globals['_SANDBOXTEMPLATE_ENVIRONMENTENTRY']._serialized_end=2917 + _globals['_SANDBOXWORKLOADTEMPLATE']._serialized_start=3706 + _globals['_SANDBOXWORKLOADTEMPLATE']._serialized_end=3842 + _globals['_SANDBOXWORKLOADTEMPLATESPEC']._serialized_start=3845 + _globals['_SANDBOXWORKLOADTEMPLATESPEC']._serialized_end=4043 + _globals['_SANDBOXWORKLOADCONFIG']._serialized_start=4046 + _globals['_SANDBOXWORKLOADCONFIG']._serialized_end=4262 + _globals['_SANDBOXWORKLOADCONFIG_ENVIRONMENTENTRY']._serialized_start=2867 + _globals['_SANDBOXWORKLOADCONFIG_ENVIRONMENTENTRY']._serialized_end=2917 + _globals['_SANDBOXRESOURCES']._serialized_start=4264 + _globals['_SANDBOXRESOURCES']._serialized_end=4363 + _globals['_SANDBOXSERVICELEVEL']._serialized_start=4365 + _globals['_SANDBOXSERVICELEVEL']._serialized_end=4433 + _globals['_SANDBOXSTARTUP']._serialized_start=4435 + _globals['_SANDBOXSTARTUP']._serialized_end=4519 + _globals['_SANDBOXWORKLOADTEMPLATEPROVENANCE']._serialized_start=4521 + _globals['_SANDBOXWORKLOADTEMPLATEPROVENANCE']._serialized_end=4596 + _globals['_SANDBOXSTATUS']._serialized_start=4599 + _globals['_SANDBOXSTATUS']._serialized_end=5347 + _globals['_SANDBOXCONDITION']._serialized_start=5350 + _globals['_SANDBOXCONDITION']._serialized_end=5512 + _globals['_PLATFORMEVENT']._serialized_start=5515 + _globals['_PLATFORMEVENT']._serialized_end=5771 + _globals['_PLATFORMEVENT_METADATAENTRY']._serialized_start=5704 + _globals['_PLATFORMEVENT_METADATAENTRY']._serialized_end=5751 + _globals['_CREATESANDBOXREQUEST']._serialized_start=5774 + _globals['_CREATESANDBOXREQUEST']._serialized_end=6307 + _globals['_CREATESANDBOXREQUEST_LABELSENTRY']._serialized_start=3504 + _globals['_CREATESANDBOXREQUEST_LABELSENTRY']._serialized_end=3549 + _globals['_CREATESANDBOXREQUEST_ANNOTATIONSENTRY']._serialized_start=3551 + _globals['_CREATESANDBOXREQUEST_ANNOTATIONSENTRY']._serialized_end=3601 + _globals['_UPDATESANDBOXREQUEST']._serialized_start=6310 + _globals['_UPDATESANDBOXREQUEST']._serialized_end=6706 + _globals['_SANDBOXCOMMANDUPDATE']._serialized_start=6708 + _globals['_SANDBOXCOMMANDUPDATE']._serialized_end=6744 + _globals['_SANDBOXMAPUPDATE']._serialized_start=6746 + _globals['_SANDBOXMAPUPDATE']._serialized_end=6871 + _globals['_SANDBOXMAPUPDATE_VALUESENTRY']._serialized_start=6826 + _globals['_SANDBOXMAPUPDATE_VALUESENTRY']._serialized_end=6871 + _globals['_CREATESANDBOXTEMPLATEREQUEST']._serialized_start=6874 + _globals['_CREATESANDBOXTEMPLATEREQUEST']._serialized_end=7049 + _globals['_GETSANDBOXTEMPLATEREQUEST']._serialized_start=7051 + _globals['_GETSANDBOXTEMPLATEREQUEST']._serialized_end=7160 + _globals['_LISTSANDBOXTEMPLATESREQUEST']._serialized_start=7163 + _globals['_LISTSANDBOXTEMPLATESREQUEST']._serialized_end=7323 + _globals['_DELETESANDBOXTEMPLATEREQUEST']._serialized_start=7326 + _globals['_DELETESANDBOXTEMPLATEREQUEST']._serialized_end=7481 + _globals['_SANDBOXTEMPLATERESPONSE']._serialized_start=7483 + _globals['_SANDBOXTEMPLATERESPONSE']._serialized_end=7565 + _globals['_LISTSANDBOXTEMPLATESRESPONSE']._serialized_start=7567 + _globals['_LISTSANDBOXTEMPLATESRESPONSE']._serialized_end=7680 + _globals['_DELETESANDBOXTEMPLATERESPONSE']._serialized_start=7682 + _globals['_DELETESANDBOXTEMPLATERESPONSE']._serialized_end=7776 + _globals['_BEGINROOTFSTARSTAGINGREQUEST']._serialized_start=7779 + _globals['_BEGINROOTFSTARSTAGINGREQUEST']._serialized_end=7916 + _globals['_BEGINROOTFSTARSTAGINGRESPONSE']._serialized_start=7919 + _globals['_BEGINROOTFSTARSTAGINGRESPONSE']._serialized_end=8087 + _globals['_GETSANDBOXREQUEST']._serialized_start=8089 + _globals['_GETSANDBOXREQUEST']._serialized_end=8190 + _globals['_LISTSANDBOXESREQUEST']._serialized_start=8193 + _globals['_LISTSANDBOXESREQUEST']._serialized_end=8346 + _globals['_LISTSANDBOXPROVIDERSREQUEST']._serialized_start=8349 + _globals['_LISTSANDBOXPROVIDERSREQUEST']._serialized_end=8502 + _globals['_ATTACHSANDBOXPROVIDERREQUEST']._serialized_start=8505 + _globals['_ATTACHSANDBOXPROVIDERREQUEST']._serialized_end=8693 + _globals['_DETACHSANDBOXPROVIDERREQUEST']._serialized_start=8696 + _globals['_DETACHSANDBOXPROVIDERREQUEST']._serialized_end=8884 + _globals['_DELETESANDBOXREQUEST']._serialized_start=8887 + _globals['_DELETESANDBOXREQUEST']._serialized_end=9034 + _globals['_STOPSANDBOXREQUEST']._serialized_start=9036 + _globals['_STOPSANDBOXREQUEST']._serialized_end=9158 + _globals['_STARTSANDBOXREQUEST']._serialized_start=9160 + _globals['_STARTSANDBOXREQUEST']._serialized_end=9283 + _globals['_SUSPENDSANDBOXREQUEST']._serialized_start=9285 + _globals['_SUSPENDSANDBOXREQUEST']._serialized_end=9390 + _globals['_RESUMESANDBOXREQUEST']._serialized_start=9393 + _globals['_RESUMESANDBOXREQUEST']._serialized_end=9531 + _globals['_SANDBOXRESPONSE']._serialized_start=9534 + _globals['_SANDBOXRESPONSE']._serialized_end=9713 + _globals['_SANDBOXRESPONSE_SERVICEURLSENTRY']._serialized_start=9663 + _globals['_SANDBOXRESPONSE_SERVICEURLSENTRY']._serialized_end=9713 + _globals['_LISTSANDBOXESRESPONSE']._serialized_start=9715 + _globals['_LISTSANDBOXESRESPONSE']._serialized_end=9805 + _globals['_LISTSANDBOXPROVIDERSRESPONSE']._serialized_start=9807 + _globals['_LISTSANDBOXPROVIDERSRESPONSE']._serialized_end=9915 + _globals['_ATTACHSANDBOXPROVIDERRESPONSE']._serialized_start=9918 + _globals['_ATTACHSANDBOXPROVIDERRESPONSE']._serialized_end=10063 + _globals['_DETACHSANDBOXPROVIDERRESPONSE']._serialized_start=10066 + _globals['_DETACHSANDBOXPROVIDERRESPONSE']._serialized_end=10211 + _globals['_PROVIDERDESIREDIDENTITY']._serialized_start=10214 + _globals['_PROVIDERDESIREDIDENTITY']._serialized_end=10435 + _globals['_CONFIGSNAPSHOTREVISION']._serialized_start=10438 + _globals['_CONFIGSNAPSHOTREVISION']._serialized_end=10636 + _globals['_SANDBOXCONFIGREVISION']._serialized_start=10639 + _globals['_SANDBOXCONFIGREVISION']._serialized_end=10828 + _globals['_CONFIGUPDATEOPERATION']._serialized_start=10831 + _globals['_CONFIGUPDATEOPERATION']._serialized_end=11359 + _globals['_PROVIDERMUTATIONRECEIPT']._serialized_start=11362 + _globals['_PROVIDERMUTATIONRECEIPT']._serialized_end=11646 + _globals['_PROVIDERREADINESSOBSERVATION']._serialized_start=11649 + _globals['_PROVIDERREADINESSOBSERVATION']._serialized_end=11996 + _globals['_PROVIDERREADINESSSTATUS']._serialized_start=11999 + _globals['_PROVIDERREADINESSSTATUS']._serialized_end=12483 + _globals['_GETSANDBOXPROVIDERSTATUSREQUEST']._serialized_start=12486 + _globals['_GETSANDBOXPROVIDERSTATUSREQUEST']._serialized_end=12642 + _globals['_GETSANDBOXPROVIDERSTATUSRESPONSE']._serialized_start=12644 + _globals['_GETSANDBOXPROVIDERSTATUSRESPONSE']._serialized_end=12733 + _globals['_REPORTPROVIDERREADINESSREQUEST']._serialized_start=12735 + _globals['_REPORTPROVIDERREADINESSREQUEST']._serialized_end=12852 + _globals['_REPORTPROVIDERREADINESSRESPONSE']._serialized_start=12855 + _globals['_REPORTPROVIDERREADINESSRESPONSE']._serialized_end=13081 + _globals['_DELETESANDBOXRESPONSE']._serialized_start=13083 + _globals['_DELETESANDBOXRESPONSE']._serialized_end=13189 + _globals['_CREATESSHSESSIONREQUEST']._serialized_start=13191 + _globals['_CREATESSHSESSIONREQUEST']._serialized_end=13301 + _globals['_CREATESSHSESSIONRESPONSE']._serialized_start=13304 + _globals['_CREATESSHSESSIONRESPONSE']._serialized_end=13543 + _globals['_EXPOSESERVICEREQUEST']._serialized_start=13546 + _globals['_EXPOSESERVICEREQUEST']._serialized_end=13792 + _globals['_GETSERVICEREQUEST']._serialized_start=13794 + _globals['_GETSERVICEREQUEST']._serialized_end=13912 + _globals['_LISTSERVICESREQUEST']._serialized_start=13915 + _globals['_LISTSERVICESREQUEST']._serialized_end=14060 + _globals['_LISTSERVICESRESPONSE']._serialized_start=14062 + _globals['_LISTSERVICESRESPONSE']._serialized_end=14166 + _globals['_DELETESERVICEREQUEST']._serialized_start=14169 + _globals['_DELETESERVICEREQUEST']._serialized_end=14333 + _globals['_DELETESERVICERESPONSE']._serialized_start=14335 + _globals['_DELETESERVICERESPONSE']._serialized_end=14421 + _globals['_SERVICEENDPOINT']._serialized_start=14424 + _globals['_SERVICEENDPOINT']._serialized_end=14651 + _globals['_SERVICEENDPOINTRESPONSE']._serialized_start=14653 + _globals['_SERVICEENDPOINTRESPONSE']._serialized_end=14740 + _globals['_REVOKESSHSESSIONREQUEST']._serialized_start=14742 + _globals['_REVOKESSHSESSIONREQUEST']._serialized_end=14811 + _globals['_REVOKESSHSESSIONRESPONSE']._serialized_start=14813 + _globals['_REVOKESSHSESSIONRESPONSE']._serialized_end=14902 + _globals['_EXECSANDBOXREQUEST']._serialized_start=14905 + _globals['_EXECSANDBOXREQUEST']._serialized_end=15345 + _globals['_EXECSANDBOXREQUEST_ENVIRONMENTENTRY']._serialized_start=2867 + _globals['_EXECSANDBOXREQUEST_ENVIRONMENTENTRY']._serialized_end=2917 + _globals['_EXECSANDBOXSTDOUT']._serialized_start=15347 + _globals['_EXECSANDBOXSTDOUT']._serialized_end=15380 + _globals['_EXECSANDBOXSTDERR']._serialized_start=15382 + _globals['_EXECSANDBOXSTDERR']._serialized_end=15415 + _globals['_EXECSANDBOXEXIT']._serialized_start=15417 + _globals['_EXECSANDBOXEXIT']._serialized_end=15453 + _globals['_EXECSANDBOXEVENT']._serialized_start=15456 + _globals['_EXECSANDBOXEVENT']._serialized_end=15634 + _globals['_TCPFORWARDINIT']._serialized_start=15637 + _globals['_TCPFORWARDINIT']._serialized_end=15844 + _globals['_TCPFORWARDFRAME']._serialized_start=15846 + _globals['_TCPFORWARDFRAME']._serialized_end=15936 + _globals['_EXECSANDBOXINPUT']._serialized_start=15939 + _globals['_EXECSANDBOXINPUT']._serialized_end=16093 + _globals['_EXECSANDBOXWINDOWRESIZE']._serialized_start=16095 + _globals['_EXECSANDBOXWINDOWRESIZE']._serialized_end=16148 + _globals['_SSHSESSION']._serialized_start=16151 + _globals['_SSHSESSION']._serialized_end=16349 + _globals['_WATCHSANDBOXREQUEST']._serialized_start=16352 + _globals['_WATCHSANDBOXREQUEST']._serialized_end=16736 + _globals['_SANDBOXSTREAMEVENT']._serialized_start=16739 + _globals['_SANDBOXSTREAMEVENT']._serialized_end=17038 + _globals['_SANDBOXLOGLINE']._serialized_start=17041 + _globals['_SANDBOXLOGLINE']._serialized_end=17314 + _globals['_SANDBOXLOGLINE_FIELDSENTRY']._serialized_start=17249 + _globals['_SANDBOXLOGLINE_FIELDSENTRY']._serialized_end=17294 + _globals['_SANDBOXSTREAMWARNING']._serialized_start=17316 + _globals['_SANDBOXSTREAMWARNING']._serialized_end=17355 + _globals['_CREATEPROVIDERREQUEST']._serialized_start=17358 + _globals['_CREATEPROVIDERREQUEST']._serialized_end=17521 + _globals['_GETPROVIDERREQUEST']._serialized_start=17523 + _globals['_GETPROVIDERREQUEST']._serialized_end=17625 + _globals['_GETPROVIDERCREDENTIALSREQUEST']._serialized_start=17628 + _globals['_GETPROVIDERCREDENTIALSREQUEST']._serialized_end=17829 + _globals['_PROVIDERCREDENTIALVALUE']._serialized_start=17831 + _globals['_PROVIDERCREDENTIALVALUE']._serialized_end=17930 + _globals['_GETPROVIDERCREDENTIALSRESPONSE']._serialized_start=17933 + _globals['_GETPROVIDERCREDENTIALSRESPONSE']._serialized_end=18140 + _globals['_GETPROVIDERCREDENTIALSRESPONSE_CREDENTIALSENTRY']._serialized_start=18051 + _globals['_GETPROVIDERCREDENTIALSRESPONSE_CREDENTIALSENTRY']._serialized_end=18140 + _globals['_LISTPROVIDERSREQUEST']._serialized_start=18143 + _globals['_LISTPROVIDERSREQUEST']._serialized_end=18296 + _globals['_UPDATEPROVIDERREQUEST']._serialized_start=18299 + _globals['_UPDATEPROVIDERREQUEST']._serialized_end=18735 + _globals['_UPDATEPROVIDERREQUEST_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_start=18611 + _globals['_UPDATEPROVIDERREQUEST_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_end=18703 + _globals['_DELETEPROVIDERREQUEST']._serialized_start=18738 + _globals['_DELETEPROVIDERREQUEST']._serialized_end=18886 + _globals['_PROVIDERRESPONSE']._serialized_start=18889 + _globals['_PROVIDERRESPONSE']._serialized_end=19044 + _globals['_LISTPROVIDERSRESPONSE']._serialized_start=19046 + _globals['_LISTPROVIDERSRESPONSE']._serialized_end=19147 + _globals['_LISTPROVIDERPROFILESREQUEST']._serialized_start=19150 + _globals['_LISTPROVIDERPROFILESREQUEST']._serialized_end=19286 + _globals['_GETPROVIDERPROFILEREQUEST']._serialized_start=19288 + _globals['_GETPROVIDERPROFILEREQUEST']._serialized_end=19395 + _globals['_PROVIDERPROFILEIMPORTITEM']._serialized_start=19397 + _globals['_PROVIDERPROFILEIMPORTITEM']._serialized_end=19488 + _globals['_PROVIDERPROFILEDIAGNOSTIC']._serialized_start=19490 + _globals['_PROVIDERPROFILEDIAGNOSTIC']._serialized_end=19603 + _globals['_PROVIDERCREDENTIALTOKENGRANTAUDIENCEOVERRIDE']._serialized_start=19605 + _globals['_PROVIDERCREDENTIALTOKENGRANTAUDIENCEOVERRIDE']._serialized_end=19727 + _globals['_PROVIDERCREDENTIALTOKENGRANTSUBJECTTOKEN']._serialized_start=19729 + _globals['_PROVIDERCREDENTIALTOKENGRANTSUBJECTTOKEN']._serialized_end=19835 + _globals['_PROVIDERCREDENTIALTOKENGRANT']._serialized_start=19838 + _globals['_PROVIDERCREDENTIALTOKENGRANT']._serialized_end=20320 + _globals['_PROVIDERPROFILECREDENTIAL']._serialized_start=20323 + _globals['_PROVIDERPROFILECREDENTIAL']._serialized_end=20685 + _globals['_PROVIDERCREDENTIALREFRESHMATERIAL']._serialized_start=20687 + _globals['_PROVIDERCREDENTIALREFRESHMATERIAL']._serialized_end=20791 + _globals['_PROVIDERCREDENTIALREFRESHOUTPUT']._serialized_start=20793 + _globals['_PROVIDERCREDENTIALREFRESHOUTPUT']._serialized_end=20862 + _globals['_PROVIDERCREDENTIALREFRESH']._serialized_start=20865 + _globals['_PROVIDERCREDENTIALREFRESH']._serialized_end=21294 + _globals['_PROVIDERCREDENTIALREFRESHSTATUS']._serialized_start=21297 + _globals['_PROVIDERCREDENTIALREFRESHSTATUS']._serialized_end=21943 + _globals['_PROVIDERPROFILEDISCOVERY']._serialized_start=21945 + _globals['_PROVIDERPROFILEDISCOVERY']._serialized_end=21992 + _globals['_GETPROVIDERREFRESHSTATUSREQUEST']._serialized_start=21995 + _globals['_GETPROVIDERREFRESHSTATUSREQUEST']._serialized_end=22138 + _globals['_GETPROVIDERREFRESHSTATUSRESPONSE']._serialized_start=22140 + _globals['_GETPROVIDERREFRESHSTATUSRESPONSE']._serialized_end=22242 + _globals['_CONFIGUREPROVIDERREFRESHREQUEST']._serialized_start=22245 + _globals['_CONFIGUREPROVIDERREFRESHREQUEST']._serialized_end=22713 + _globals['_CONFIGUREPROVIDERREFRESHREQUEST_MATERIALENTRY']._serialized_start=22645 + _globals['_CONFIGUREPROVIDERREFRESHREQUEST_MATERIALENTRY']._serialized_end=22692 + _globals['_CONFIGUREPROVIDERREFRESHRESPONSE']._serialized_start=22715 + _globals['_CONFIGUREPROVIDERREFRESHRESPONSE']._serialized_end=22812 + _globals['_ROTATEPROVIDERCREDENTIALREQUEST']._serialized_start=22815 + _globals['_ROTATEPROVIDERCREDENTIALREQUEST']._serialized_end=22978 + _globals['_ROTATEPROVIDERCREDENTIALRESPONSE']._serialized_start=22980 + _globals['_ROTATEPROVIDERCREDENTIALRESPONSE']._serialized_end=23077 + _globals['_DELETEPROVIDERREFRESHREQUEST']._serialized_start=23080 + _globals['_DELETEPROVIDERREFRESHREQUEST']._serialized_end=23263 + _globals['_DELETEPROVIDERREFRESHRESPONSE']._serialized_start=23265 + _globals['_DELETEPROVIDERREFRESHRESPONSE']._serialized_end=23359 + _globals['_PROVIDERPROFILE']._serialized_start=23362 + _globals['_PROVIDERPROFILE']._serialized_end=23980 + _globals['_PROVIDERPROFILE_ANNOTATIONSENTRY']._serialized_start=3551 + _globals['_PROVIDERPROFILE_ANNOTATIONSENTRY']._serialized_end=3601 + _globals['_PROVIDERPROFILEFILE']._serialized_start=23982 + _globals['_PROVIDERPROFILEFILE']._serialized_end=24051 + _globals['_PROVIDERPROFILERESPONSE']._serialized_start=24053 + _globals['_PROVIDERPROFILERESPONSE']._serialized_end=24126 + _globals['_LISTPROVIDERPROFILESRESPONSE']._serialized_start=24128 + _globals['_LISTPROVIDERPROFILESRESPONSE']._serialized_end=24232 + _globals['_IMPORTPROVIDERPROFILESREQUEST']._serialized_start=24235 + _globals['_IMPORTPROVIDERPROFILESREQUEST']._serialized_end=24413 + _globals['_IMPORTPROVIDERPROFILESRESPONSE']._serialized_start=24416 + _globals['_IMPORTPROVIDERPROFILESRESPONSE']._serialized_end=24577 + _globals['_UPDATEPROVIDERPROFILESREQUEST']._serialized_start=24580 + _globals['_UPDATEPROVIDERPROFILESREQUEST']._serialized_end=24804 + _globals['_UPDATEPROVIDERPROFILESRESPONSE']._serialized_start=24807 + _globals['_UPDATEPROVIDERPROFILESRESPONSE']._serialized_end=24966 + _globals['_LINTPROVIDERPROFILESREQUEST']._serialized_start=24969 + _globals['_LINTPROVIDERPROFILESREQUEST']._serialized_end=25125 + _globals['_LINTPROVIDERPROFILESRESPONSE']._serialized_start=25128 + _globals['_LINTPROVIDERPROFILESRESPONSE']._serialized_end=25272 + _globals['_DELETEPROVIDERRESPONSE']._serialized_start=25274 + _globals['_DELETEPROVIDERRESPONSE']._serialized_end=25361 + _globals['_DELETEPROVIDERPROFILEREQUEST']._serialized_start=25364 + _globals['_DELETEPROVIDERPROFILEREQUEST']._serialized_end=25517 + _globals['_DELETEPROVIDERPROFILERESPONSE']._serialized_start=25519 + _globals['_DELETEPROVIDERPROFILERESPONSE']._serialized_end=25613 + _globals['_GETSANDBOXPROVIDERENVIRONMENTREQUEST']._serialized_start=25616 + _globals['_GETSANDBOXPROVIDERENVIRONMENTREQUEST']._serialized_end=25773 + _globals['_STATICCREDENTIALENDPOINTBINDING']._serialized_start=25775 + _globals['_STATICCREDENTIALENDPOINTBINDING']._serialized_end=25850 + _globals['_STATICCREDENTIALBINDING']._serialized_start=25853 + _globals['_STATICCREDENTIALBINDING']._serialized_end=26009 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE']._serialized_start=26012 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE']._serialized_end=27289 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_ENVIRONMENTENTRY']._serialized_start=2867 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_ENVIRONMENTENTRY']._serialized_end=2917 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_start=18611 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_CREDENTIALEXPIRATIONTIMESENTRY']._serialized_end=18703 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_DYNAMICCREDENTIALSENTRY']._serialized_start=27009 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_DYNAMICCREDENTIALSENTRY']._serialized_end=27107 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_STATICCREDENTIALBINDINGSENTRY']._serialized_start=27109 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_STATICCREDENTIALBINDINGSENTRY']._serialized_end=27211 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_FILESENTRY']._serialized_start=27213 + _globals['_GETSANDBOXPROVIDERENVIRONMENTRESPONSE_FILESENTRY']._serialized_end=27257 + _globals['_PROVIDERENVIRONMENTVALUE']._serialized_start=27292 + _globals['_PROVIDERENVIRONMENTVALUE']._serialized_end=27586 + _globals['_PROVIDERENVIRONMENTSNAPSHOT']._serialized_start=27589 + _globals['_PROVIDERENVIRONMENTSNAPSHOT']._serialized_end=28137 + _globals['_PROVIDERENVIRONMENTSNAPSHOT_DYNAMICCREDENTIALSENTRY']._serialized_start=27009 + _globals['_PROVIDERENVIRONMENTSNAPSHOT_DYNAMICCREDENTIALSENTRY']._serialized_end=27107 + _globals['_PROVIDERENVIRONMENTSNAPSHOT_FILESENTRY']._serialized_start=27213 + _globals['_PROVIDERENVIRONMENTSNAPSHOT_FILESENTRY']._serialized_end=27257 + _globals['_EXCHANGEPROVIDERSUBJECTTOKENREQUEST']._serialized_start=28140 + _globals['_EXCHANGEPROVIDERSUBJECTTOKENREQUEST']._serialized_end=28274 + _globals['_EXCHANGEPROVIDERSUBJECTTOKENRESPONSE']._serialized_start=28277 + _globals['_EXCHANGEPROVIDERSUBJECTTOKENRESPONSE']._serialized_end=28431 + _globals['_UPDATECONFIGREQUEST']._serialized_start=28434 + _globals['_UPDATECONFIGREQUEST']._serialized_end=28955 + _globals['_UPDATECONFIGREQUEST_ANNOTATIONSENTRY']._serialized_start=3551 + _globals['_UPDATECONFIGREQUEST_ANNOTATIONSENTRY']._serialized_end=3601 + _globals['_POLICYMERGEOPERATION']._serialized_start=28958 + _globals['_POLICYMERGEOPERATION']._serialized_end=29333 + _globals['_ADDNETWORKRULE']._serialized_start=29335 + _globals['_ADDNETWORKRULE']._serialized_end=29425 + _globals['_REMOVENETWORKENDPOINT']._serialized_start=29427 + _globals['_REMOVENETWORKENDPOINT']._serialized_end=29497 + _globals['_REMOVENETWORKRULE']._serialized_start=29499 + _globals['_REMOVENETWORKRULE']._serialized_end=29537 + _globals['_L7RULETARGET']._serialized_start=29540 + _globals['_L7RULETARGET']._serialized_end=29705 + _globals['_ADDDENYRULES']._serialized_start=29708 + _globals['_ADDDENYRULES']._serialized_end=29844 + _globals['_ADDALLOWRULES']._serialized_start=29847 + _globals['_ADDALLOWRULES']._serialized_end=29975 + _globals['_REMOVENETWORKBINARY']._serialized_start=29977 + _globals['_REMOVENETWORKBINARY']._serialized_end=30038 + _globals['_UPDATECONFIGRESPONSE']._serialized_start=30041 + _globals['_UPDATECONFIGRESPONSE']._serialized_end=30271 + _globals['_UPDATECONFIGRESPONSE_ANNOTATIONSENTRY']._serialized_start=3551 + _globals['_UPDATECONFIGRESPONSE_ANNOTATIONSENTRY']._serialized_end=3601 + _globals['_GETSANDBOXPOLICYSTATUSREQUEST']._serialized_start=30274 + _globals['_GETSANDBOXPOLICYSTATUSREQUEST']._serialized_end=30423 + _globals['_GETSANDBOXPOLICYSTATUSRESPONSE']._serialized_start=30425 + _globals['_GETSANDBOXPOLICYSTATUSRESPONSE']._serialized_end=30536 + _globals['_LISTSANDBOXPOLICIESREQUEST']._serialized_start=30539 + _globals['_LISTSANDBOXPOLICIESREQUEST']._serialized_end=30707 + _globals['_LISTSANDBOXPOLICIESRESPONSE']._serialized_start=30709 + _globals['_LISTSANDBOXPOLICIESRESPONSE']._serialized_end=30819 + _globals['_REPORTPOLICYSTATUSREQUEST']._serialized_start=30822 + _globals['_REPORTPOLICYSTATUSREQUEST']._serialized_end=30950 + _globals['_REPORTPOLICYSTATUSRESPONSE']._serialized_start=30952 + _globals['_REPORTPOLICYSTATUSRESPONSE']._serialized_end=30980 + _globals['_SANDBOXCONFIGURATIONADMISSION']._serialized_start=30983 + _globals['_SANDBOXCONFIGURATIONADMISSION']._serialized_end=31209 + _globals['_REPORTSANDBOXCONFIGURATIONREQUEST']._serialized_start=31212 + _globals['_REPORTSANDBOXCONFIGURATIONREQUEST']._serialized_end=31361 + _globals['_REPORTSANDBOXCONFIGURATIONRESPONSE']._serialized_start=31363 + _globals['_REPORTSANDBOXCONFIGURATIONRESPONSE']._serialized_end=31399 + _globals['_SANDBOXPOLICYREVISION']._serialized_start=31402 + _globals['_SANDBOXPOLICYREVISION']._serialized_end=31844 + _globals['_SANDBOXPOLICYREVISION_PROVENANCEENTRY']._serialized_start=31754 + _globals['_SANDBOXPOLICYREVISION_PROVENANCEENTRY']._serialized_end=31803 + _globals['_GETSANDBOXLOGSREQUEST']._serialized_start=31847 + _globals['_GETSANDBOXLOGSREQUEST']._serialized_end=32070 + _globals['_PUSHSANDBOXLOGSREQUEST']._serialized_start=32072 + _globals['_PUSHSANDBOXLOGSREQUEST']._serialized_end=32160 + _globals['_PUSHSANDBOXLOGSRESPONSE']._serialized_start=32162 + _globals['_PUSHSANDBOXLOGSRESPONSE']._serialized_end=32187 + _globals['_GETSANDBOXLOGSRESPONSE']._serialized_start=32189 + _globals['_GETSANDBOXLOGSRESPONSE']._serialized_end=32279 + _globals['_SUPERVISORMESSAGE']._serialized_start=32282 + _globals['_SUPERVISORMESSAGE']._serialized_end=32591 + _globals['_GATEWAYMESSAGE']._serialized_start=32594 + _globals['_GATEWAYMESSAGE']._serialized_end=33000 + _globals['_SUPERVISORHELLO']._serialized_start=33003 + _globals['_SUPERVISORHELLO']._serialized_end=33209 + _globals['_SESSIONACCEPTED']._serialized_start=33212 + _globals['_SESSIONACCEPTED']._serialized_end=33411 + _globals['_CONFIGUPDATE']._serialized_start=33414 + _globals['_CONFIGUPDATE']._serialized_end=33589 + _globals['_CONFIGAPPLYFAILURE']._serialized_start=33591 + _globals['_CONFIGAPPLYFAILURE']._serialized_end=33661 + _globals['_CONFIGUPDATERESULT']._serialized_start=33664 + _globals['_CONFIGUPDATERESULT']._serialized_end=33922 + _globals['_POLICYLOADRESULT']._serialized_start=33924 + _globals['_POLICYLOADRESULT']._serialized_end=33990 + _globals['_SESSIONREJECTED']._serialized_start=33992 + _globals['_SESSIONREJECTED']._serialized_end=34025 + _globals['_SESSIONREDIRECT']._serialized_start=34027 + _globals['_SESSIONREDIRECT']._serialized_end=34093 + _globals['_SUPERVISORHEARTBEAT']._serialized_start=34095 + _globals['_SUPERVISORHEARTBEAT']._serialized_end=34116 + _globals['_GATEWAYHEARTBEAT']._serialized_start=34118 + _globals['_GATEWAYHEARTBEAT']._serialized_end=34136 + _globals['_REPORTMAINPROCESSEXITREQUEST']._serialized_start=34138 + _globals['_REPORTMAINPROCESSEXITREQUEST']._serialized_end=34228 + _globals['_REPORTMAINPROCESSEXITRESPONSE']._serialized_start=34230 + _globals['_REPORTMAINPROCESSEXITRESPONSE']._serialized_end=34261 + _globals['_FINALIZEMAINPROCESSEXITREQUEST']._serialized_start=34263 + _globals['_FINALIZEMAINPROCESSEXITREQUEST']._serialized_end=34336 + _globals['_FINALIZEMAINPROCESSEXITRESPONSE']._serialized_start=34338 + _globals['_FINALIZEMAINPROCESSEXITRESPONSE']._serialized_end=34371 + _globals['_RELAYOPEN']._serialized_start=34374 + _globals['_RELAYOPEN']._serialized_end=34525 + _globals['_SSHRELAYTARGET']._serialized_start=34527 + _globals['_SSHRELAYTARGET']._serialized_end=34543 + _globals['_TCPRELAYTARGET']._serialized_start=34545 + _globals['_TCPRELAYTARGET']._serialized_end=34589 + _globals['_RELAYINIT']._serialized_start=34591 + _globals['_RELAYINIT']._serialized_end=34622 + _globals['_RELAYFRAME']._serialized_start=34624 + _globals['_RELAYFRAME']._serialized_end=34704 + _globals['_PEERRELAYINIT']._serialized_start=34706 + _globals['_PEERRELAYINIT']._serialized_end=34816 + _globals['_PEERRELAYFRAME']._serialized_start=34818 + _globals['_PEERRELAYFRAME']._serialized_end=34906 + _globals['_PEERCONFIGSANDBOXTARGET']._serialized_start=34908 + _globals['_PEERCONFIGSANDBOXTARGET']._serialized_end=34973 + _globals['_PEERCONFIGPROVIDERTARGET']._serialized_start=34975 + _globals['_PEERCONFIGPROVIDERTARGET']._serialized_end=35034 + _globals['_PEERNOTIFYCONFIGUPDATEREQUEST']._serialized_start=35037 + _globals['_PEERNOTIFYCONFIGUPDATEREQUEST']._serialized_end=35241 + _globals['_PEERNOTIFYCONFIGUPDATERESPONSE']._serialized_start=35243 + _globals['_PEERNOTIFYCONFIGUPDATERESPONSE']._serialized_end=35296 + _globals['_RELAYOPENRESULT']._serialized_start=35298 + _globals['_RELAYOPENRESULT']._serialized_end=35367 + _globals['_RELAYCLOSE']._serialized_start=35369 + _globals['_RELAYCLOSE']._serialized_end=35417 + _globals['_L7REQUESTSAMPLE']._serialized_start=35419 + _globals['_L7REQUESTSAMPLE']._serialized_end=35499 + _globals['_DENIALSUMMARY']._serialized_start=35502 + _globals['_DENIALSUMMARY']._serialized_end=36008 + _globals['_DENIALGROUPCOUNT']._serialized_start=36010 + _globals['_DENIALGROUPCOUNT']._serialized_end=36070 + _globals['_NETWORKACTIVITYSUMMARY']._serialized_start=36073 + _globals['_NETWORKACTIVITYSUMMARY']._serialized_end=36216 + _globals['_POLICYCHUNK']._serialized_start=36219 + _globals['_POLICYCHUNK']._serialized_end=37127 + _globals['_DRAFTPOLICYUPDATE']._serialized_start=37129 + _globals['_DRAFTPOLICYUPDATE']._serialized_end=37231 + _globals['_SUBMITPOLICYANALYSISREQUEST']._serialized_start=37234 + _globals['_SUBMITPOLICYANALYSISREQUEST']._serialized_end=37542 + _globals['_SUBMITPOLICYANALYSISRESPONSE']._serialized_start=37545 + _globals['_SUBMITPOLICYANALYSISRESPONSE']._serialized_end=37680 + _globals['_GETDRAFTPOLICYREQUEST']._serialized_start=37683 + _globals['_GETDRAFTPOLICYREQUEST']._serialized_end=37814 + _globals['_GETDRAFTPOLICYRESPONSE']._serialized_start=37817 + _globals['_GETDRAFTPOLICYRESPONSE']._serialized_end=38015 + _globals['_APPROVEDRAFTCHUNKREQUEST']._serialized_start=38018 + _globals['_APPROVEDRAFTCHUNKREQUEST']._serialized_end=38189 + _globals['_APPROVEDRAFTCHUNKRESPONSE']._serialized_start=38191 + _globals['_APPROVEDRAFTCHUNKRESPONSE']._serialized_end=38263 + _globals['_REJECTDRAFTCHUNKREQUEST']._serialized_start=38266 + _globals['_REJECTDRAFTCHUNKREQUEST']._serialized_end=38430 + _globals['_REJECTDRAFTCHUNKRESPONSE']._serialized_start=38432 + _globals['_REJECTDRAFTCHUNKRESPONSE']._serialized_end=38458 + _globals['_DRAFTCHUNKAPPROVAL']._serialized_start=38460 + _globals['_DRAFTCHUNKAPPROVAL']._serialized_end=38520 + _globals['_APPROVEALLDRAFTCHUNKSREQUEST']._serialized_start=38523 + _globals['_APPROVEALLDRAFTCHUNKSREQUEST']._serialized_end=38745 + _globals['_APPROVEALLDRAFTCHUNKSRESPONSE']._serialized_start=38747 + _globals['_APPROVEALLDRAFTCHUNKSRESPONSE']._serialized_end=38872 + _globals['_EDITDRAFTCHUNKREQUEST']._serialized_start=38875 + _globals['_EDITDRAFTCHUNKREQUEST']._serialized_end=39085 + _globals['_EDITDRAFTCHUNKRESPONSE']._serialized_start=39087 + _globals['_EDITDRAFTCHUNKRESPONSE']._serialized_end=39111 + _globals['_UNDODRAFTCHUNKREQUEST']._serialized_start=39114 + _globals['_UNDODRAFTCHUNKREQUEST']._serialized_end=39260 + _globals['_UNDODRAFTCHUNKRESPONSE']._serialized_start=39262 + _globals['_UNDODRAFTCHUNKRESPONSE']._serialized_end=39331 + _globals['_CLEARDRAFTCHUNKSREQUEST']._serialized_start=39334 + _globals['_CLEARDRAFTCHUNKSREQUEST']._serialized_end=39464 + _globals['_CLEARDRAFTCHUNKSRESPONSE']._serialized_start=39466 + _globals['_CLEARDRAFTCHUNKSRESPONSE']._serialized_end=39516 + _globals['_GETDRAFTHISTORYREQUEST']._serialized_start=39518 + _globals['_GETDRAFTHISTORYREQUEST']._serialized_end=39627 + _globals['_DRAFTHISTORYENTRY']._serialized_start=39630 + _globals['_DRAFTHISTORYENTRY']._serialized_end=39776 + _globals['_GETDRAFTHISTORYRESPONSE']._serialized_start=39778 + _globals['_GETDRAFTHISTORYRESPONSE']._serialized_end=39853 + _globals['_CREATEWORKSPACEREQUEST']._serialized_start=39856 + _globals['_CREATEWORKSPACEREQUEST']._serialized_end=40027 + _globals['_CREATEWORKSPACEREQUEST_LABELSENTRY']._serialized_start=3504 + _globals['_CREATEWORKSPACEREQUEST_LABELSENTRY']._serialized_end=3549 + _globals['_CREATEWORKSPACERESPONSE']._serialized_start=40029 + _globals['_CREATEWORKSPACERESPONSE']._serialized_end=40108 + _globals['_GETWORKSPACEREQUEST']._serialized_start=40110 + _globals['_GETWORKSPACEREQUEST']._serialized_end=40145 + _globals['_GETWORKSPACERESPONSE']._serialized_start=40147 + _globals['_GETWORKSPACERESPONSE']._serialized_end=40223 + _globals['_LISTWORKSPACESREQUEST']._serialized_start=40225 + _globals['_LISTWORKSPACESREQUEST']._serialized_end=40311 + _globals['_LISTWORKSPACESRESPONSE']._serialized_start=40313 + _globals['_LISTWORKSPACESRESPONSE']._serialized_end=40417 + _globals['_DELETEWORKSPACEREQUEST']._serialized_start=40419 + _globals['_DELETEWORKSPACEREQUEST']._serialized_end=40500 + _globals['_DELETEWORKSPACERESPONSE']._serialized_start=40502 + _globals['_DELETEWORKSPACERESPONSE']._serialized_end=40590 + _globals['_WORKSPACEMEMBER']._serialized_start=40593 + _globals['_WORKSPACEMEMBER']._serialized_end=40734 + _globals['_ADDWORKSPACEMEMBERREQUEST']._serialized_start=40737 + _globals['_ADDWORKSPACEMEMBERREQUEST']._serialized_end=40922 + _globals['_ADDWORKSPACEMEMBERRESPONSE']._serialized_start=40924 + _globals['_ADDWORKSPACEMEMBERRESPONSE']._serialized_end=40999 + _globals['_REMOVEWORKSPACEMEMBERREQUEST']._serialized_start=41002 + _globals['_REMOVEWORKSPACEMEMBERREQUEST']._serialized_end=41170 + _globals['_REMOVEWORKSPACEMEMBERRESPONSE']._serialized_start=41172 + _globals['_REMOVEWORKSPACEMEMBERRESPONSE']._serialized_end=41266 + _globals['_LISTWORKSPACEMEMBERSREQUEST']._serialized_start=41269 + _globals['_LISTWORKSPACEMEMBERSREQUEST']._serialized_end=41405 + _globals['_LISTWORKSPACEMEMBERSRESPONSE']._serialized_start=41407 + _globals['_LISTWORKSPACEMEMBERSRESPONSE']._serialized_end=41510 + _globals['_EXTENSIONSERVICECREDENTIAL']._serialized_start=41513 + _globals['_EXTENSIONSERVICECREDENTIAL']._serialized_end=41658 + _globals['_ENDPOINTOBSERVATION']._serialized_start=41661 + _globals['_ENDPOINTOBSERVATION']._serialized_end=41797 + _globals['_REPORTENDPOINTSTATUSREQUEST']._serialized_start=41800 + _globals['_REPORTENDPOINTSTATUSREQUEST']._serialized_end=42105 + _globals['_TOKENGRANTSTATUS']._serialized_start=42107 + _globals['_TOKENGRANTSTATUS']._serialized_end=42191 + _globals['_TOKENGRANTFAILUREOBSERVATION']._serialized_start=42194 + _globals['_TOKENGRANTFAILUREOBSERVATION']._serialized_end=42324 + _globals['_REPORTENDPOINTSTATUSRESPONSE']._serialized_start=42326 + _globals['_REPORTENDPOINTSTATUSRESPONSE']._serialized_end=42356 + _globals['_ENDPOINTSTATUS']._serialized_start=42359 + _globals['_ENDPOINTSTATUS']._serialized_end=42623 + _globals['_SANDBOXPROVISIONING']._serialized_start=42626 + _globals['_SANDBOXPROVISIONING']._serialized_end=43325 + _globals['_SANDBOXSERVICEEXPOSURE']._serialized_start=43328 + _globals['_SANDBOXSERVICEEXPOSURE']._serialized_end=43458 + _globals['_ENDPOINTFAILURE']._serialized_start=43461 + _globals['_ENDPOINTFAILURE']._serialized_end=43762 + _globals['_OPENSHELL']._serialized_start=49751 + _globals['_OPENSHELL']._serialized_end=61181 + _globals['_SANDBOXUPDATES']._serialized_start=61184 + _globals['_SANDBOXUPDATES']._serialized_end=61319 +# @@protoc_insertion_point(module_scope) diff --git a/src/openshell/_proto/openshell_pb2.pyi b/src/openshell/_proto/openshell_pb2.pyi new file mode 100644 index 0000000..fda0d1d --- /dev/null +++ b/src/openshell/_proto/openshell_pb2.pyi @@ -0,0 +1,3414 @@ +import datetime + +from . import datamodel_pb2 as _datamodel_pb2 +from google.protobuf import duration_pb2 as _duration_pb2 +from google.protobuf import struct_pb2 as _struct_pb2 +from google.protobuf import timestamp_pb2 as _timestamp_pb2 +from . import options_pb2 as _options_pb2 +from . import sandbox_pb2 as _sandbox_pb2 +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class ExtensionKind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + EXTENSION_KIND_UNSPECIFIED: _ClassVar[ExtensionKind] + EXTENSION_KIND_COMPUTE_DRIVER: _ClassVar[ExtensionKind] + EXTENSION_KIND_CREDENTIAL_DRIVER: _ClassVar[ExtensionKind] + EXTENSION_KIND_GATEWAY_INTERCEPTOR: _ClassVar[ExtensionKind] + EXTENSION_KIND_SUPERVISOR_MIDDLEWARE: _ClassVar[ExtensionKind] + +class SandboxPhase(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + SANDBOX_PHASE_UNSPECIFIED: _ClassVar[SandboxPhase] + SANDBOX_PHASE_PROVISIONING: _ClassVar[SandboxPhase] + SANDBOX_PHASE_READY: _ClassVar[SandboxPhase] + SANDBOX_PHASE_ERROR: _ClassVar[SandboxPhase] + SANDBOX_PHASE_DELETING: _ClassVar[SandboxPhase] + SANDBOX_PHASE_UNKNOWN: _ClassVar[SandboxPhase] + SANDBOX_PHASE_STOPPING: _ClassVar[SandboxPhase] + SANDBOX_PHASE_STOPPED: _ClassVar[SandboxPhase] + SANDBOX_PHASE_STARTING: _ClassVar[SandboxPhase] + SANDBOX_PHASE_COMPLETED: _ClassVar[SandboxPhase] + SANDBOX_PHASE_SUSPENDING: _ClassVar[SandboxPhase] + SANDBOX_PHASE_SUSPENDED: _ClassVar[SandboxPhase] + +class ProviderMutationKind(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_MUTATION_KIND_UNSPECIFIED: _ClassVar[ProviderMutationKind] + PROVIDER_MUTATION_KIND_ATTACH: _ClassVar[ProviderMutationKind] + PROVIDER_MUTATION_KIND_DETACH: _ClassVar[ProviderMutationKind] + PROVIDER_MUTATION_KIND_UPDATE: _ClassVar[ProviderMutationKind] + PROVIDER_MUTATION_KIND_OBSERVE: _ClassVar[ProviderMutationKind] + +class ProviderReadinessState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_READINESS_STATE_UNSPECIFIED: _ClassVar[ProviderReadinessState] + PROVIDER_READINESS_STATE_PERSISTED: _ClassVar[ProviderReadinessState] + PROVIDER_READINESS_STATE_PENDING: _ClassVar[ProviderReadinessState] + PROVIDER_READINESS_STATE_READY: _ClassVar[ProviderReadinessState] + PROVIDER_READINESS_STATE_WITHHELD: _ClassVar[ProviderReadinessState] + PROVIDER_READINESS_STATE_REVOKED: _ClassVar[ProviderReadinessState] + PROVIDER_READINESS_STATE_FAILED: _ClassVar[ProviderReadinessState] + PROVIDER_READINESS_STATE_SUPERSEDED: _ClassVar[ProviderReadinessState] + +class ProviderReadinessReason(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_READINESS_REASON_UNSPECIFIED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_WAITING_FOR_SUPERVISOR: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_WAITING_FOR_CREDENTIALS: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_WAITING_FOR_POLICY: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_WAITING_FOR_PROCESS: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_UNSUPPORTED_SUPERVISOR: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_CREDENTIALS_WITHHELD: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_CREDENTIAL_INSTALL_FAILED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_POLICY_ACTIVATION_FAILED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_PROCESS_INSTALL_FAILED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_SUPERVISOR_DISCONNECTED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_SUPERVISOR_LEASE_EXPIRED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_DESIRED_STATE_CHANGED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_CREDENTIAL_EXPIRED: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_LOCAL_POLICY: _ClassVar[ProviderReadinessReason] + PROVIDER_READINESS_REASON_SNAPSHOT_MISMATCH: _ClassVar[ProviderReadinessReason] + +class ConfigComponent(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + CONFIG_COMPONENT_UNSPECIFIED: _ClassVar[ConfigComponent] + CONFIG_COMPONENT_SANDBOX_CONFIG: _ClassVar[ConfigComponent] + CONFIG_COMPONENT_PROVIDER_ENVIRONMENT: _ClassVar[ConfigComponent] + +class ConfigApplyOutcome(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + CONFIG_APPLY_OUTCOME_UNSPECIFIED: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_APPLIED: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_IGNORED_DUPLICATE: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_IGNORED_STALE: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_RETAINED_LOCAL_OVERRIDE: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_DEGRADED: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_FAILED_RETAINED_LAST_KNOWN_GOOD: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_FAILED_CLOSED: _ClassVar[ConfigApplyOutcome] + CONFIG_APPLY_OUTCOME_UNSUPPORTED: _ClassVar[ConfigApplyOutcome] + +class ConfigUpdateOperationState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + CONFIG_UPDATE_OPERATION_STATE_UNSPECIFIED: _ClassVar[ConfigUpdateOperationState] + CONFIG_UPDATE_OPERATION_STATE_PENDING: _ClassVar[ConfigUpdateOperationState] + CONFIG_UPDATE_OPERATION_STATE_APPLIED: _ClassVar[ConfigUpdateOperationState] + CONFIG_UPDATE_OPERATION_STATE_INACTIVE: _ClassVar[ConfigUpdateOperationState] + CONFIG_UPDATE_OPERATION_STATE_FAILED: _ClassVar[ConfigUpdateOperationState] + CONFIG_UPDATE_OPERATION_STATE_SUPERSEDED: _ClassVar[ConfigUpdateOperationState] + CONFIG_UPDATE_OPERATION_STATE_CANCELLED: _ClassVar[ConfigUpdateOperationState] + +class ProviderCredentialTokenGrantType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_UNSPECIFIED: _ClassVar[ProviderCredentialTokenGrantType] + PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_CLIENT_CREDENTIALS: _ClassVar[ProviderCredentialTokenGrantType] + PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_TOKEN_EXCHANGE: _ClassVar[ProviderCredentialTokenGrantType] + +class ProviderCredentialRefreshStrategy(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_CREDENTIAL_REFRESH_STRATEGY_UNSPECIFIED: _ClassVar[ProviderCredentialRefreshStrategy] + PROVIDER_CREDENTIAL_REFRESH_STRATEGY_STATIC: _ClassVar[ProviderCredentialRefreshStrategy] + PROVIDER_CREDENTIAL_REFRESH_STRATEGY_EXTERNAL: _ClassVar[ProviderCredentialRefreshStrategy] + PROVIDER_CREDENTIAL_REFRESH_STRATEGY_OAUTH2_REFRESH_TOKEN: _ClassVar[ProviderCredentialRefreshStrategy] + PROVIDER_CREDENTIAL_REFRESH_STRATEGY_OAUTH2_CLIENT_CREDENTIALS: _ClassVar[ProviderCredentialRefreshStrategy] + PROVIDER_CREDENTIAL_REFRESH_STRATEGY_GOOGLE_SERVICE_ACCOUNT_JWT: _ClassVar[ProviderCredentialRefreshStrategy] + PROVIDER_CREDENTIAL_REFRESH_STRATEGY_AWS_STS_ASSUME_ROLE: _ClassVar[ProviderCredentialRefreshStrategy] + +class ProviderProfileCategory(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_PROFILE_CATEGORY_UNSPECIFIED: _ClassVar[ProviderProfileCategory] + PROVIDER_PROFILE_CATEGORY_OTHER: _ClassVar[ProviderProfileCategory] + PROVIDER_PROFILE_CATEGORY_INFERENCE: _ClassVar[ProviderProfileCategory] + PROVIDER_PROFILE_CATEGORY_AGENT: _ClassVar[ProviderProfileCategory] + PROVIDER_PROFILE_CATEGORY_SOURCE_CONTROL: _ClassVar[ProviderProfileCategory] + PROVIDER_PROFILE_CATEGORY_MESSAGING: _ClassVar[ProviderProfileCategory] + PROVIDER_PROFILE_CATEGORY_DATA: _ClassVar[ProviderProfileCategory] + PROVIDER_PROFILE_CATEGORY_KNOWLEDGE: _ClassVar[ProviderProfileCategory] + +class ProviderEnvironmentValueClassification(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_UNSPECIFIED: _ClassVar[ProviderEnvironmentValueClassification] + PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_NON_SECRET: _ClassVar[ProviderEnvironmentValueClassification] + PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_STATIC_CREDENTIAL: _ClassVar[ProviderEnvironmentValueClassification] + +class ConfigurationAdmissionState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + CONFIGURATION_ADMISSION_STATE_UNSPECIFIED: _ClassVar[ConfigurationAdmissionState] + CONFIGURATION_ADMISSION_STATE_PENDING: _ClassVar[ConfigurationAdmissionState] + CONFIGURATION_ADMISSION_STATE_ACCEPTED: _ClassVar[ConfigurationAdmissionState] + CONFIGURATION_ADMISSION_STATE_REJECTED: _ClassVar[ConfigurationAdmissionState] + +class PolicyStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + POLICY_STATUS_UNSPECIFIED: _ClassVar[PolicyStatus] + POLICY_STATUS_PENDING: _ClassVar[PolicyStatus] + POLICY_STATUS_LOADED: _ClassVar[PolicyStatus] + POLICY_STATUS_FAILED: _ClassVar[PolicyStatus] + POLICY_STATUS_SUPERSEDED: _ClassVar[PolicyStatus] + +class ServiceStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + SERVICE_STATUS_UNSPECIFIED: _ClassVar[ServiceStatus] + SERVICE_STATUS_HEALTHY: _ClassVar[ServiceStatus] + SERVICE_STATUS_DEGRADED: _ClassVar[ServiceStatus] + SERVICE_STATUS_UNHEALTHY: _ClassVar[ServiceStatus] + +class WorkspaceRole(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + WORKSPACE_ROLE_UNSPECIFIED: _ClassVar[WorkspaceRole] + WORKSPACE_ROLE_USER: _ClassVar[WorkspaceRole] + WORKSPACE_ROLE_ADMIN: _ClassVar[WorkspaceRole] + +class ProviderCredentialRefreshRecoveryAction(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_UNSPECIFIED: _ClassVar[ProviderCredentialRefreshRecoveryAction] + PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_RETRY: _ClassVar[ProviderCredentialRefreshRecoveryAction] + PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_REAUTHORIZE: _ClassVar[ProviderCredentialRefreshRecoveryAction] + PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_FIX_CONFIGURATION: _ClassVar[ProviderCredentialRefreshRecoveryAction] + PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_INVESTIGATE: _ClassVar[ProviderCredentialRefreshRecoveryAction] + +class SandboxRestartPolicy(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + SANDBOX_RESTART_POLICY_UNSPECIFIED: _ClassVar[SandboxRestartPolicy] + SANDBOX_RESTART_POLICY_NEVER: _ClassVar[SandboxRestartPolicy] + SANDBOX_RESTART_POLICY_ON_FAILURE: _ClassVar[SandboxRestartPolicy] + SANDBOX_RESTART_POLICY_ALWAYS: _ClassVar[SandboxRestartPolicy] + +class DeletionOutcome(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + DELETION_OUTCOME_UNSPECIFIED: _ClassVar[DeletionOutcome] + DELETION_OUTCOME_COMPLETED: _ClassVar[DeletionOutcome] + DELETION_OUTCOME_ACCEPTED: _ClassVar[DeletionOutcome] + DELETION_OUTCOME_ALREADY_ABSENT: _ClassVar[DeletionOutcome] + +class EndpointResult(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + ENDPOINT_RESULT_UNSPECIFIED: _ClassVar[EndpointResult] + ENDPOINT_RESULT_NO_OBSERVED_EXCHANGE: _ClassVar[EndpointResult] + ENDPOINT_RESULT_HTTP_RESPONSE_RECEIVED: _ClassVar[EndpointResult] + ENDPOINT_RESULT_POLICY_DENIED: _ClassVar[EndpointResult] + ENDPOINT_RESULT_CREDENTIAL_UNAVAILABLE: _ClassVar[EndpointResult] + ENDPOINT_RESULT_TLS_FAILED: _ClassVar[EndpointResult] + ENDPOINT_RESULT_TRANSPORT_FAILED: _ClassVar[EndpointResult] + ENDPOINT_RESULT_UPSTREAM_REJECTED: _ClassVar[EndpointResult] + +class ServiceAuthorizationMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + SERVICE_AUTHORIZATION_MODE_UNSPECIFIED: _ClassVar[ServiceAuthorizationMode] + SERVICE_AUTHORIZATION_MODE_STRIP: _ClassVar[ServiceAuthorizationMode] + SERVICE_AUTHORIZATION_MODE_BEARER_PASSTHROUGH: _ClassVar[ServiceAuthorizationMode] + +class EndpointFailureDomain(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + ENDPOINT_FAILURE_DOMAIN_UNSPECIFIED: _ClassVar[EndpointFailureDomain] + ENDPOINT_FAILURE_DOMAIN_TOKEN_GRANT: _ClassVar[EndpointFailureDomain] +EXTENSION_KIND_UNSPECIFIED: ExtensionKind +EXTENSION_KIND_COMPUTE_DRIVER: ExtensionKind +EXTENSION_KIND_CREDENTIAL_DRIVER: ExtensionKind +EXTENSION_KIND_GATEWAY_INTERCEPTOR: ExtensionKind +EXTENSION_KIND_SUPERVISOR_MIDDLEWARE: ExtensionKind +SANDBOX_PHASE_UNSPECIFIED: SandboxPhase +SANDBOX_PHASE_PROVISIONING: SandboxPhase +SANDBOX_PHASE_READY: SandboxPhase +SANDBOX_PHASE_ERROR: SandboxPhase +SANDBOX_PHASE_DELETING: SandboxPhase +SANDBOX_PHASE_UNKNOWN: SandboxPhase +SANDBOX_PHASE_STOPPING: SandboxPhase +SANDBOX_PHASE_STOPPED: SandboxPhase +SANDBOX_PHASE_STARTING: SandboxPhase +SANDBOX_PHASE_COMPLETED: SandboxPhase +SANDBOX_PHASE_SUSPENDING: SandboxPhase +SANDBOX_PHASE_SUSPENDED: SandboxPhase +PROVIDER_MUTATION_KIND_UNSPECIFIED: ProviderMutationKind +PROVIDER_MUTATION_KIND_ATTACH: ProviderMutationKind +PROVIDER_MUTATION_KIND_DETACH: ProviderMutationKind +PROVIDER_MUTATION_KIND_UPDATE: ProviderMutationKind +PROVIDER_MUTATION_KIND_OBSERVE: ProviderMutationKind +PROVIDER_READINESS_STATE_UNSPECIFIED: ProviderReadinessState +PROVIDER_READINESS_STATE_PERSISTED: ProviderReadinessState +PROVIDER_READINESS_STATE_PENDING: ProviderReadinessState +PROVIDER_READINESS_STATE_READY: ProviderReadinessState +PROVIDER_READINESS_STATE_WITHHELD: ProviderReadinessState +PROVIDER_READINESS_STATE_REVOKED: ProviderReadinessState +PROVIDER_READINESS_STATE_FAILED: ProviderReadinessState +PROVIDER_READINESS_STATE_SUPERSEDED: ProviderReadinessState +PROVIDER_READINESS_REASON_UNSPECIFIED: ProviderReadinessReason +PROVIDER_READINESS_REASON_WAITING_FOR_SUPERVISOR: ProviderReadinessReason +PROVIDER_READINESS_REASON_WAITING_FOR_CREDENTIALS: ProviderReadinessReason +PROVIDER_READINESS_REASON_WAITING_FOR_POLICY: ProviderReadinessReason +PROVIDER_READINESS_REASON_WAITING_FOR_PROCESS: ProviderReadinessReason +PROVIDER_READINESS_REASON_UNSUPPORTED_SUPERVISOR: ProviderReadinessReason +PROVIDER_READINESS_REASON_CREDENTIALS_WITHHELD: ProviderReadinessReason +PROVIDER_READINESS_REASON_CREDENTIAL_INSTALL_FAILED: ProviderReadinessReason +PROVIDER_READINESS_REASON_POLICY_ACTIVATION_FAILED: ProviderReadinessReason +PROVIDER_READINESS_REASON_PROCESS_INSTALL_FAILED: ProviderReadinessReason +PROVIDER_READINESS_REASON_SUPERVISOR_DISCONNECTED: ProviderReadinessReason +PROVIDER_READINESS_REASON_SUPERVISOR_LEASE_EXPIRED: ProviderReadinessReason +PROVIDER_READINESS_REASON_DESIRED_STATE_CHANGED: ProviderReadinessReason +PROVIDER_READINESS_REASON_CREDENTIAL_EXPIRED: ProviderReadinessReason +PROVIDER_READINESS_REASON_LOCAL_POLICY: ProviderReadinessReason +PROVIDER_READINESS_REASON_SNAPSHOT_MISMATCH: ProviderReadinessReason +CONFIG_COMPONENT_UNSPECIFIED: ConfigComponent +CONFIG_COMPONENT_SANDBOX_CONFIG: ConfigComponent +CONFIG_COMPONENT_PROVIDER_ENVIRONMENT: ConfigComponent +CONFIG_APPLY_OUTCOME_UNSPECIFIED: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_APPLIED: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_IGNORED_DUPLICATE: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_IGNORED_STALE: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_RETAINED_LOCAL_OVERRIDE: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_DEGRADED: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_FAILED_RETAINED_LAST_KNOWN_GOOD: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_FAILED_CLOSED: ConfigApplyOutcome +CONFIG_APPLY_OUTCOME_UNSUPPORTED: ConfigApplyOutcome +CONFIG_UPDATE_OPERATION_STATE_UNSPECIFIED: ConfigUpdateOperationState +CONFIG_UPDATE_OPERATION_STATE_PENDING: ConfigUpdateOperationState +CONFIG_UPDATE_OPERATION_STATE_APPLIED: ConfigUpdateOperationState +CONFIG_UPDATE_OPERATION_STATE_INACTIVE: ConfigUpdateOperationState +CONFIG_UPDATE_OPERATION_STATE_FAILED: ConfigUpdateOperationState +CONFIG_UPDATE_OPERATION_STATE_SUPERSEDED: ConfigUpdateOperationState +CONFIG_UPDATE_OPERATION_STATE_CANCELLED: ConfigUpdateOperationState +PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_UNSPECIFIED: ProviderCredentialTokenGrantType +PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_CLIENT_CREDENTIALS: ProviderCredentialTokenGrantType +PROVIDER_CREDENTIAL_TOKEN_GRANT_TYPE_TOKEN_EXCHANGE: ProviderCredentialTokenGrantType +PROVIDER_CREDENTIAL_REFRESH_STRATEGY_UNSPECIFIED: ProviderCredentialRefreshStrategy +PROVIDER_CREDENTIAL_REFRESH_STRATEGY_STATIC: ProviderCredentialRefreshStrategy +PROVIDER_CREDENTIAL_REFRESH_STRATEGY_EXTERNAL: ProviderCredentialRefreshStrategy +PROVIDER_CREDENTIAL_REFRESH_STRATEGY_OAUTH2_REFRESH_TOKEN: ProviderCredentialRefreshStrategy +PROVIDER_CREDENTIAL_REFRESH_STRATEGY_OAUTH2_CLIENT_CREDENTIALS: ProviderCredentialRefreshStrategy +PROVIDER_CREDENTIAL_REFRESH_STRATEGY_GOOGLE_SERVICE_ACCOUNT_JWT: ProviderCredentialRefreshStrategy +PROVIDER_CREDENTIAL_REFRESH_STRATEGY_AWS_STS_ASSUME_ROLE: ProviderCredentialRefreshStrategy +PROVIDER_PROFILE_CATEGORY_UNSPECIFIED: ProviderProfileCategory +PROVIDER_PROFILE_CATEGORY_OTHER: ProviderProfileCategory +PROVIDER_PROFILE_CATEGORY_INFERENCE: ProviderProfileCategory +PROVIDER_PROFILE_CATEGORY_AGENT: ProviderProfileCategory +PROVIDER_PROFILE_CATEGORY_SOURCE_CONTROL: ProviderProfileCategory +PROVIDER_PROFILE_CATEGORY_MESSAGING: ProviderProfileCategory +PROVIDER_PROFILE_CATEGORY_DATA: ProviderProfileCategory +PROVIDER_PROFILE_CATEGORY_KNOWLEDGE: ProviderProfileCategory +PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_UNSPECIFIED: ProviderEnvironmentValueClassification +PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_NON_SECRET: ProviderEnvironmentValueClassification +PROVIDER_ENVIRONMENT_VALUE_CLASSIFICATION_STATIC_CREDENTIAL: ProviderEnvironmentValueClassification +CONFIGURATION_ADMISSION_STATE_UNSPECIFIED: ConfigurationAdmissionState +CONFIGURATION_ADMISSION_STATE_PENDING: ConfigurationAdmissionState +CONFIGURATION_ADMISSION_STATE_ACCEPTED: ConfigurationAdmissionState +CONFIGURATION_ADMISSION_STATE_REJECTED: ConfigurationAdmissionState +POLICY_STATUS_UNSPECIFIED: PolicyStatus +POLICY_STATUS_PENDING: PolicyStatus +POLICY_STATUS_LOADED: PolicyStatus +POLICY_STATUS_FAILED: PolicyStatus +POLICY_STATUS_SUPERSEDED: PolicyStatus +SERVICE_STATUS_UNSPECIFIED: ServiceStatus +SERVICE_STATUS_HEALTHY: ServiceStatus +SERVICE_STATUS_DEGRADED: ServiceStatus +SERVICE_STATUS_UNHEALTHY: ServiceStatus +WORKSPACE_ROLE_UNSPECIFIED: WorkspaceRole +WORKSPACE_ROLE_USER: WorkspaceRole +WORKSPACE_ROLE_ADMIN: WorkspaceRole +PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_UNSPECIFIED: ProviderCredentialRefreshRecoveryAction +PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_RETRY: ProviderCredentialRefreshRecoveryAction +PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_REAUTHORIZE: ProviderCredentialRefreshRecoveryAction +PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_FIX_CONFIGURATION: ProviderCredentialRefreshRecoveryAction +PROVIDER_CREDENTIAL_REFRESH_RECOVERY_ACTION_INVESTIGATE: ProviderCredentialRefreshRecoveryAction +SANDBOX_RESTART_POLICY_UNSPECIFIED: SandboxRestartPolicy +SANDBOX_RESTART_POLICY_NEVER: SandboxRestartPolicy +SANDBOX_RESTART_POLICY_ON_FAILURE: SandboxRestartPolicy +SANDBOX_RESTART_POLICY_ALWAYS: SandboxRestartPolicy +DELETION_OUTCOME_UNSPECIFIED: DeletionOutcome +DELETION_OUTCOME_COMPLETED: DeletionOutcome +DELETION_OUTCOME_ACCEPTED: DeletionOutcome +DELETION_OUTCOME_ALREADY_ABSENT: DeletionOutcome +ENDPOINT_RESULT_UNSPECIFIED: EndpointResult +ENDPOINT_RESULT_NO_OBSERVED_EXCHANGE: EndpointResult +ENDPOINT_RESULT_HTTP_RESPONSE_RECEIVED: EndpointResult +ENDPOINT_RESULT_POLICY_DENIED: EndpointResult +ENDPOINT_RESULT_CREDENTIAL_UNAVAILABLE: EndpointResult +ENDPOINT_RESULT_TLS_FAILED: EndpointResult +ENDPOINT_RESULT_TRANSPORT_FAILED: EndpointResult +ENDPOINT_RESULT_UPSTREAM_REJECTED: EndpointResult +SERVICE_AUTHORIZATION_MODE_UNSPECIFIED: ServiceAuthorizationMode +SERVICE_AUTHORIZATION_MODE_STRIP: ServiceAuthorizationMode +SERVICE_AUTHORIZATION_MODE_BEARER_PASSTHROUGH: ServiceAuthorizationMode +ENDPOINT_FAILURE_DOMAIN_UNSPECIFIED: EndpointFailureDomain +ENDPOINT_FAILURE_DOMAIN_TOKEN_GRANT: EndpointFailureDomain + +class IssueSandboxTokenRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class IssueSandboxTokenResponse(_message.Message): + __slots__ = ("token", "expiration_time") + TOKEN_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + token: str + expiration_time: _timestamp_pb2.Timestamp + def __init__(self, token: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class RefreshSandboxTokenRequest(_message.Message): + __slots__ = ("extension_service_names",) + EXTENSION_SERVICE_NAMES_FIELD_NUMBER: _ClassVar[int] + extension_service_names: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, extension_service_names: _Optional[_Iterable[str]] = ...) -> None: ... + +class RefreshSandboxTokenResponse(_message.Message): + __slots__ = ("token", "expiration_time", "extension_credentials", "sandbox_token", "sandbox_expiration_time", "session_id", "credential_epoch") + TOKEN_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + EXTENSION_CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + SANDBOX_TOKEN_FIELD_NUMBER: _ClassVar[int] + SANDBOX_EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + SESSION_ID_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_EPOCH_FIELD_NUMBER: _ClassVar[int] + token: str + expiration_time: _timestamp_pb2.Timestamp + extension_credentials: _containers.RepeatedCompositeFieldContainer[ExtensionServiceCredential] + sandbox_token: str + sandbox_expiration_time: _timestamp_pb2.Timestamp + session_id: str + credential_epoch: int + def __init__(self, token: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., extension_credentials: _Optional[_Iterable[_Union[ExtensionServiceCredential, _Mapping]]] = ..., sandbox_token: _Optional[str] = ..., sandbox_expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., session_id: _Optional[str] = ..., credential_epoch: _Optional[int] = ...) -> None: ... + +class HealthRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class HealthResponse(_message.Message): + __slots__ = ("status", "version") + STATUS_FIELD_NUMBER: _ClassVar[int] + VERSION_FIELD_NUMBER: _ClassVar[int] + status: ServiceStatus + version: str + def __init__(self, status: _Optional[_Union[ServiceStatus, str]] = ..., version: _Optional[str] = ...) -> None: ... + +class GetCurrentUserRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GetCurrentUserResponse(_message.Message): + __slots__ = ("subject", "display_name", "roles", "scopes", "identity_provider") + SUBJECT_FIELD_NUMBER: _ClassVar[int] + DISPLAY_NAME_FIELD_NUMBER: _ClassVar[int] + ROLES_FIELD_NUMBER: _ClassVar[int] + SCOPES_FIELD_NUMBER: _ClassVar[int] + IDENTITY_PROVIDER_FIELD_NUMBER: _ClassVar[int] + subject: str + display_name: str + roles: _containers.RepeatedScalarFieldContainer[str] + scopes: _containers.RepeatedScalarFieldContainer[str] + identity_provider: str + def __init__(self, subject: _Optional[str] = ..., display_name: _Optional[str] = ..., roles: _Optional[_Iterable[str]] = ..., scopes: _Optional[_Iterable[str]] = ..., identity_provider: _Optional[str] = ...) -> None: ... + +class GetGatewayInfoRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GetGatewayInfoResponse(_message.Message): + __slots__ = ("status", "gateway_version", "compute_drivers", "extensions") + STATUS_FIELD_NUMBER: _ClassVar[int] + GATEWAY_VERSION_FIELD_NUMBER: _ClassVar[int] + COMPUTE_DRIVERS_FIELD_NUMBER: _ClassVar[int] + EXTENSIONS_FIELD_NUMBER: _ClassVar[int] + status: ServiceStatus + gateway_version: str + compute_drivers: _containers.RepeatedCompositeFieldContainer[ComputeDriverInfo] + extensions: _containers.RepeatedCompositeFieldContainer[NegotiatedExtensionInfo] + def __init__(self, status: _Optional[_Union[ServiceStatus, str]] = ..., gateway_version: _Optional[str] = ..., compute_drivers: _Optional[_Iterable[_Union[ComputeDriverInfo, _Mapping]]] = ..., extensions: _Optional[_Iterable[_Union[NegotiatedExtensionInfo, _Mapping]]] = ...) -> None: ... + +class NegotiatedExtensionInfo(_message.Message): + __slots__ = ("kind", "configured_name", "implementation_name", "implementation_version", "protocol_major", "protocol_minor", "supported_capabilities", "required_capabilities") + KIND_FIELD_NUMBER: _ClassVar[int] + CONFIGURED_NAME_FIELD_NUMBER: _ClassVar[int] + IMPLEMENTATION_NAME_FIELD_NUMBER: _ClassVar[int] + IMPLEMENTATION_VERSION_FIELD_NUMBER: _ClassVar[int] + PROTOCOL_MAJOR_FIELD_NUMBER: _ClassVar[int] + PROTOCOL_MINOR_FIELD_NUMBER: _ClassVar[int] + SUPPORTED_CAPABILITIES_FIELD_NUMBER: _ClassVar[int] + REQUIRED_CAPABILITIES_FIELD_NUMBER: _ClassVar[int] + kind: ExtensionKind + configured_name: str + implementation_name: str + implementation_version: str + protocol_major: int + protocol_minor: int + supported_capabilities: _containers.RepeatedScalarFieldContainer[str] + required_capabilities: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, kind: _Optional[_Union[ExtensionKind, str]] = ..., configured_name: _Optional[str] = ..., implementation_name: _Optional[str] = ..., implementation_version: _Optional[str] = ..., protocol_major: _Optional[int] = ..., protocol_minor: _Optional[int] = ..., supported_capabilities: _Optional[_Iterable[str]] = ..., required_capabilities: _Optional[_Iterable[str]] = ...) -> None: ... + +class ComputeDriverInfo(_message.Message): + __slots__ = ("name", "capabilities") + NAME_FIELD_NUMBER: _ClassVar[int] + CAPABILITIES_FIELD_NUMBER: _ClassVar[int] + name: str + capabilities: ComputeDriverCapabilities + def __init__(self, name: _Optional[str] = ..., capabilities: _Optional[_Union[ComputeDriverCapabilities, _Mapping]] = ...) -> None: ... + +class ComputeDriverCapabilities(_message.Message): + __slots__ = ("driver_name", "driver_version", "resource_capabilities") + DRIVER_NAME_FIELD_NUMBER: _ClassVar[int] + DRIVER_VERSION_FIELD_NUMBER: _ClassVar[int] + RESOURCE_CAPABILITIES_FIELD_NUMBER: _ClassVar[int] + driver_name: str + driver_version: str + resource_capabilities: ResourceCapabilities + def __init__(self, driver_name: _Optional[str] = ..., driver_version: _Optional[str] = ..., resource_capabilities: _Optional[_Union[ResourceCapabilities, _Mapping]] = ...) -> None: ... + +class ResourceCapabilities(_message.Message): + __slots__ = ("cpu", "memory", "gpu") + CPU_FIELD_NUMBER: _ClassVar[int] + MEMORY_FIELD_NUMBER: _ClassVar[int] + GPU_FIELD_NUMBER: _ClassVar[int] + cpu: CpuResourceCapabilities + memory: MemoryResourceCapabilities + gpu: GpuResourceCapabilities + def __init__(self, cpu: _Optional[_Union[CpuResourceCapabilities, _Mapping]] = ..., memory: _Optional[_Union[MemoryResourceCapabilities, _Mapping]] = ..., gpu: _Optional[_Union[GpuResourceCapabilities, _Mapping]] = ...) -> None: ... + +class CpuResourceCapabilities(_message.Message): + __slots__ = ("limit_supported",) + LIMIT_SUPPORTED_FIELD_NUMBER: _ClassVar[int] + limit_supported: bool + def __init__(self, limit_supported: bool = ...) -> None: ... + +class MemoryResourceCapabilities(_message.Message): + __slots__ = ("limit_supported",) + LIMIT_SUPPORTED_FIELD_NUMBER: _ClassVar[int] + limit_supported: bool + def __init__(self, limit_supported: bool = ...) -> None: ... + +class GpuResourceCapabilities(_message.Message): + __slots__ = ("default_selection_supported", "count_selection_supported") + DEFAULT_SELECTION_SUPPORTED_FIELD_NUMBER: _ClassVar[int] + COUNT_SELECTION_SUPPORTED_FIELD_NUMBER: _ClassVar[int] + default_selection_supported: bool + count_selection_supported: bool + def __init__(self, default_selection_supported: bool = ..., count_selection_supported: bool = ...) -> None: ... + +class Sandbox(_message.Message): + __slots__ = ("metadata", "spec", "status", "host_key_fingerprint", "created_from_workload_template") + METADATA_FIELD_NUMBER: _ClassVar[int] + SPEC_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + HOST_KEY_FINGERPRINT_FIELD_NUMBER: _ClassVar[int] + CREATED_FROM_WORKLOAD_TEMPLATE_FIELD_NUMBER: _ClassVar[int] + metadata: _datamodel_pb2.ObjectMeta + spec: SandboxSpec + status: SandboxStatus + host_key_fingerprint: str + created_from_workload_template: SandboxWorkloadTemplateProvenance + def __init__(self, metadata: _Optional[_Union[_datamodel_pb2.ObjectMeta, _Mapping]] = ..., spec: _Optional[_Union[SandboxSpec, _Mapping]] = ..., status: _Optional[_Union[SandboxStatus, _Mapping]] = ..., host_key_fingerprint: _Optional[str] = ..., created_from_workload_template: _Optional[_Union[SandboxWorkloadTemplateProvenance, _Mapping]] = ...) -> None: ... + +class SandboxSpec(_message.Message): + __slots__ = ("log_level", "environment", "template", "policy", "providers", "resource_requirements", "command", "tty", "provider_attachment_epoch", "restart_policy") + class EnvironmentEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + LOG_LEVEL_FIELD_NUMBER: _ClassVar[int] + ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + TEMPLATE_FIELD_NUMBER: _ClassVar[int] + POLICY_FIELD_NUMBER: _ClassVar[int] + PROVIDERS_FIELD_NUMBER: _ClassVar[int] + RESOURCE_REQUIREMENTS_FIELD_NUMBER: _ClassVar[int] + COMMAND_FIELD_NUMBER: _ClassVar[int] + TTY_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ATTACHMENT_EPOCH_FIELD_NUMBER: _ClassVar[int] + RESTART_POLICY_FIELD_NUMBER: _ClassVar[int] + log_level: str + environment: _containers.ScalarMap[str, str] + template: SandboxTemplate + policy: _sandbox_pb2.SandboxPolicy + providers: _containers.RepeatedScalarFieldContainer[str] + resource_requirements: ResourceRequirements + command: _containers.RepeatedScalarFieldContainer[str] + tty: bool + provider_attachment_epoch: str + restart_policy: SandboxRestartPolicy + def __init__(self, log_level: _Optional[str] = ..., environment: _Optional[_Mapping[str, str]] = ..., template: _Optional[_Union[SandboxTemplate, _Mapping]] = ..., policy: _Optional[_Union[_sandbox_pb2.SandboxPolicy, _Mapping]] = ..., providers: _Optional[_Iterable[str]] = ..., resource_requirements: _Optional[_Union[ResourceRequirements, _Mapping]] = ..., command: _Optional[_Iterable[str]] = ..., tty: bool = ..., provider_attachment_epoch: _Optional[str] = ..., restart_policy: _Optional[_Union[SandboxRestartPolicy, str]] = ...) -> None: ... + +class ResourceRequirements(_message.Message): + __slots__ = ("gpu",) + GPU_FIELD_NUMBER: _ClassVar[int] + gpu: GpuResourceRequirements + def __init__(self, gpu: _Optional[_Union[GpuResourceRequirements, _Mapping]] = ...) -> None: ... + +class GpuResourceRequirements(_message.Message): + __slots__ = ("count",) + COUNT_FIELD_NUMBER: _ClassVar[int] + count: int + def __init__(self, count: _Optional[int] = ...) -> None: ... + +class SandboxTemplate(_message.Message): + __slots__ = ("image", "runtime_class_name", "agent_socket", "labels", "annotations", "environment", "resources", "user_namespaces", "driver_config") + class LabelsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + class AnnotationsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + class EnvironmentEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + IMAGE_FIELD_NUMBER: _ClassVar[int] + RUNTIME_CLASS_NAME_FIELD_NUMBER: _ClassVar[int] + AGENT_SOCKET_FIELD_NUMBER: _ClassVar[int] + LABELS_FIELD_NUMBER: _ClassVar[int] + ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] + ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + RESOURCES_FIELD_NUMBER: _ClassVar[int] + USER_NAMESPACES_FIELD_NUMBER: _ClassVar[int] + DRIVER_CONFIG_FIELD_NUMBER: _ClassVar[int] + image: str + runtime_class_name: str + agent_socket: str + labels: _containers.ScalarMap[str, str] + annotations: _containers.ScalarMap[str, str] + environment: _containers.ScalarMap[str, str] + resources: _struct_pb2.Struct + user_namespaces: bool + driver_config: _struct_pb2.Struct + def __init__(self, image: _Optional[str] = ..., runtime_class_name: _Optional[str] = ..., agent_socket: _Optional[str] = ..., labels: _Optional[_Mapping[str, str]] = ..., annotations: _Optional[_Mapping[str, str]] = ..., environment: _Optional[_Mapping[str, str]] = ..., resources: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., user_namespaces: bool = ..., driver_config: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ...) -> None: ... + +class SandboxWorkloadTemplate(_message.Message): + __slots__ = ("metadata", "spec") + METADATA_FIELD_NUMBER: _ClassVar[int] + SPEC_FIELD_NUMBER: _ClassVar[int] + metadata: _datamodel_pb2.ObjectMeta + spec: SandboxWorkloadTemplateSpec + def __init__(self, metadata: _Optional[_Union[_datamodel_pb2.ObjectMeta, _Mapping]] = ..., spec: _Optional[_Union[SandboxWorkloadTemplateSpec, _Mapping]] = ...) -> None: ... + +class SandboxWorkloadTemplateSpec(_message.Message): + __slots__ = ("workload", "driver_config", "desired_service_level") + WORKLOAD_FIELD_NUMBER: _ClassVar[int] + DRIVER_CONFIG_FIELD_NUMBER: _ClassVar[int] + DESIRED_SERVICE_LEVEL_FIELD_NUMBER: _ClassVar[int] + workload: SandboxWorkloadConfig + driver_config: _struct_pb2.Struct + desired_service_level: SandboxServiceLevel + def __init__(self, workload: _Optional[_Union[SandboxWorkloadConfig, _Mapping]] = ..., driver_config: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., desired_service_level: _Optional[_Union[SandboxServiceLevel, _Mapping]] = ...) -> None: ... + +class SandboxWorkloadConfig(_message.Message): + __slots__ = ("image", "environment", "resources") + class EnvironmentEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + IMAGE_FIELD_NUMBER: _ClassVar[int] + ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + RESOURCES_FIELD_NUMBER: _ClassVar[int] + image: str + environment: _containers.ScalarMap[str, str] + resources: SandboxResources + def __init__(self, image: _Optional[str] = ..., environment: _Optional[_Mapping[str, str]] = ..., resources: _Optional[_Union[SandboxResources, _Mapping]] = ...) -> None: ... + +class SandboxResources(_message.Message): + __slots__ = ("cpu", "memory", "gpu") + CPU_FIELD_NUMBER: _ClassVar[int] + MEMORY_FIELD_NUMBER: _ClassVar[int] + GPU_FIELD_NUMBER: _ClassVar[int] + cpu: str + memory: str + gpu: GpuResourceRequirements + def __init__(self, cpu: _Optional[str] = ..., memory: _Optional[str] = ..., gpu: _Optional[_Union[GpuResourceRequirements, _Mapping]] = ...) -> None: ... + +class SandboxServiceLevel(_message.Message): + __slots__ = ("startup",) + STARTUP_FIELD_NUMBER: _ClassVar[int] + startup: SandboxStartup + def __init__(self, startup: _Optional[_Union[SandboxStartup, _Mapping]] = ...) -> None: ... + +class SandboxStartup(_message.Message): + __slots__ = ("ready_within", "max_burst") + READY_WITHIN_FIELD_NUMBER: _ClassVar[int] + MAX_BURST_FIELD_NUMBER: _ClassVar[int] + ready_within: _duration_pb2.Duration + max_burst: int + def __init__(self, ready_within: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_burst: _Optional[int] = ...) -> None: ... + +class SandboxWorkloadTemplateProvenance(_message.Message): + __slots__ = ("name", "resource_version") + NAME_FIELD_NUMBER: _ClassVar[int] + RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + name: str + resource_version: str + def __init__(self, name: _Optional[str] = ..., resource_version: _Optional[str] = ...) -> None: ... + +class SandboxStatus(_message.Message): + __slots__ = ("agent_pod", "agent_fd", "sandbox_fd", "conditions", "phase", "current_policy_version", "main_process_instance_id", "exit_code", "endpoint_statuses", "configuration_admission", "configuration_activated", "provisioning", "restart_count", "next_restart_time", "main_process_started_time", "last_token_grant_failure") + AGENT_POD_FIELD_NUMBER: _ClassVar[int] + AGENT_FD_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FD_FIELD_NUMBER: _ClassVar[int] + CONDITIONS_FIELD_NUMBER: _ClassVar[int] + PHASE_FIELD_NUMBER: _ClassVar[int] + CURRENT_POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + MAIN_PROCESS_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + EXIT_CODE_FIELD_NUMBER: _ClassVar[int] + ENDPOINT_STATUSES_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_ADMISSION_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_ACTIVATED_FIELD_NUMBER: _ClassVar[int] + PROVISIONING_FIELD_NUMBER: _ClassVar[int] + RESTART_COUNT_FIELD_NUMBER: _ClassVar[int] + NEXT_RESTART_TIME_FIELD_NUMBER: _ClassVar[int] + MAIN_PROCESS_STARTED_TIME_FIELD_NUMBER: _ClassVar[int] + LAST_TOKEN_GRANT_FAILURE_FIELD_NUMBER: _ClassVar[int] + agent_pod: str + agent_fd: str + sandbox_fd: str + conditions: _containers.RepeatedCompositeFieldContainer[SandboxCondition] + phase: SandboxPhase + current_policy_version: int + main_process_instance_id: str + exit_code: int + endpoint_statuses: _containers.RepeatedCompositeFieldContainer[EndpointStatus] + configuration_admission: SandboxConfigurationAdmission + configuration_activated: bool + provisioning: SandboxProvisioning + restart_count: int + next_restart_time: _timestamp_pb2.Timestamp + main_process_started_time: _timestamp_pb2.Timestamp + last_token_grant_failure: TokenGrantFailureObservation + def __init__(self, agent_pod: _Optional[str] = ..., agent_fd: _Optional[str] = ..., sandbox_fd: _Optional[str] = ..., conditions: _Optional[_Iterable[_Union[SandboxCondition, _Mapping]]] = ..., phase: _Optional[_Union[SandboxPhase, str]] = ..., current_policy_version: _Optional[int] = ..., main_process_instance_id: _Optional[str] = ..., exit_code: _Optional[int] = ..., endpoint_statuses: _Optional[_Iterable[_Union[EndpointStatus, _Mapping]]] = ..., configuration_admission: _Optional[_Union[SandboxConfigurationAdmission, _Mapping]] = ..., configuration_activated: bool = ..., provisioning: _Optional[_Union[SandboxProvisioning, _Mapping]] = ..., restart_count: _Optional[int] = ..., next_restart_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., main_process_started_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., last_token_grant_failure: _Optional[_Union[TokenGrantFailureObservation, _Mapping]] = ...) -> None: ... + +class SandboxCondition(_message.Message): + __slots__ = ("type", "status", "reason", "message", "transition_time") + TYPE_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + MESSAGE_FIELD_NUMBER: _ClassVar[int] + TRANSITION_TIME_FIELD_NUMBER: _ClassVar[int] + type: str + status: str + reason: str + message: str + transition_time: _timestamp_pb2.Timestamp + def __init__(self, type: _Optional[str] = ..., status: _Optional[str] = ..., reason: _Optional[str] = ..., message: _Optional[str] = ..., transition_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class PlatformEvent(_message.Message): + __slots__ = ("event_time", "source", "type", "reason", "message", "metadata") + class MetadataEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + EVENT_TIME_FIELD_NUMBER: _ClassVar[int] + SOURCE_FIELD_NUMBER: _ClassVar[int] + TYPE_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + MESSAGE_FIELD_NUMBER: _ClassVar[int] + METADATA_FIELD_NUMBER: _ClassVar[int] + event_time: _timestamp_pb2.Timestamp + source: str + type: str + reason: str + message: str + metadata: _containers.ScalarMap[str, str] + def __init__(self, event_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., source: _Optional[str] = ..., type: _Optional[str] = ..., reason: _Optional[str] = ..., message: _Optional[str] = ..., metadata: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class CreateSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "spec", "name", "labels", "annotations", "await_main_process_attachment", "workload_template", "request_id", "service_exposures") + class LabelsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + class AnnotationsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SPEC_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + LABELS_FIELD_NUMBER: _ClassVar[int] + ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] + AWAIT_MAIN_PROCESS_ATTACHMENT_FIELD_NUMBER: _ClassVar[int] + WORKLOAD_TEMPLATE_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + SERVICE_EXPOSURES_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + spec: SandboxSpec + name: str + labels: _containers.ScalarMap[str, str] + annotations: _containers.ScalarMap[str, str] + await_main_process_attachment: bool + workload_template: str + request_id: str + service_exposures: _containers.RepeatedCompositeFieldContainer[SandboxServiceExposure] + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., spec: _Optional[_Union[SandboxSpec, _Mapping]] = ..., name: _Optional[str] = ..., labels: _Optional[_Mapping[str, str]] = ..., annotations: _Optional[_Mapping[str, str]] = ..., await_main_process_attachment: bool = ..., workload_template: _Optional[str] = ..., request_id: _Optional[str] = ..., service_exposures: _Optional[_Iterable[_Union[SandboxServiceExposure, _Mapping]]] = ...) -> None: ... + +class UpdateSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "image", "command", "environment", "labels", "annotations", "expected_resource_version", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + IMAGE_FIELD_NUMBER: _ClassVar[int] + COMMAND_FIELD_NUMBER: _ClassVar[int] + ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + LABELS_FIELD_NUMBER: _ClassVar[int] + ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] + EXPECTED_RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + image: str + command: SandboxCommandUpdate + environment: SandboxMapUpdate + labels: SandboxMapUpdate + annotations: SandboxMapUpdate + expected_resource_version: int + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., image: _Optional[str] = ..., command: _Optional[_Union[SandboxCommandUpdate, _Mapping]] = ..., environment: _Optional[_Union[SandboxMapUpdate, _Mapping]] = ..., labels: _Optional[_Union[SandboxMapUpdate, _Mapping]] = ..., annotations: _Optional[_Union[SandboxMapUpdate, _Mapping]] = ..., expected_resource_version: _Optional[int] = ..., request_id: _Optional[str] = ...) -> None: ... + +class SandboxCommandUpdate(_message.Message): + __slots__ = ("argv",) + ARGV_FIELD_NUMBER: _ClassVar[int] + argv: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, argv: _Optional[_Iterable[str]] = ...) -> None: ... + +class SandboxMapUpdate(_message.Message): + __slots__ = ("values",) + class ValuesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + VALUES_FIELD_NUMBER: _ClassVar[int] + values: _containers.ScalarMap[str, str] + def __init__(self, values: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class CreateSandboxTemplateRequest(_message.Message): + __slots__ = ("workspace_scope", "template", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + TEMPLATE_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + template: SandboxWorkloadTemplate + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., template: _Optional[_Union[SandboxWorkloadTemplate, _Mapping]] = ..., request_id: _Optional[str] = ...) -> None: ... + +class GetSandboxTemplateRequest(_message.Message): + __slots__ = ("workspace_scope", "name") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ...) -> None: ... + +class ListSandboxTemplatesRequest(_message.Message): + __slots__ = ("workspace_scope", "page_size", "page_token", "label_selector") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + LABEL_SELECTOR_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + page_size: int + page_token: str + label_selector: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ..., label_selector: _Optional[str] = ...) -> None: ... + +class DeleteSandboxTemplateRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "allow_missing", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + allow_missing: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class SandboxTemplateResponse(_message.Message): + __slots__ = ("template",) + TEMPLATE_FIELD_NUMBER: _ClassVar[int] + template: SandboxWorkloadTemplate + def __init__(self, template: _Optional[_Union[SandboxWorkloadTemplate, _Mapping]] = ...) -> None: ... + +class ListSandboxTemplatesResponse(_message.Message): + __slots__ = ("templates", "next_page_token") + TEMPLATES_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + templates: _containers.RepeatedCompositeFieldContainer[SandboxWorkloadTemplate] + next_page_token: str + def __init__(self, templates: _Optional[_Iterable[_Union[SandboxWorkloadTemplate, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class DeleteSandboxTemplateResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class BeginRootfsTarStagingRequest(_message.Message): + __slots__ = ("workspace_scope", "file_name", "size_bytes") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + FILE_NAME_FIELD_NUMBER: _ClassVar[int] + SIZE_BYTES_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + file_name: str + size_bytes: int + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., file_name: _Optional[str] = ..., size_bytes: _Optional[int] = ...) -> None: ... + +class BeginRootfsTarStagingResponse(_message.Message): + __slots__ = ("staging_token", "upload_path", "max_bytes", "expiration_time") + STAGING_TOKEN_FIELD_NUMBER: _ClassVar[int] + UPLOAD_PATH_FIELD_NUMBER: _ClassVar[int] + MAX_BYTES_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + staging_token: str + upload_path: str + max_bytes: int + expiration_time: _timestamp_pb2.Timestamp + def __init__(self, staging_token: _Optional[str] = ..., upload_path: _Optional[str] = ..., max_bytes: _Optional[int] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class GetSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "name") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ...) -> None: ... + +class ListSandboxesRequest(_message.Message): + __slots__ = ("workspace_scope", "page_size", "page_token", "label_selector") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + LABEL_SELECTOR_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + page_size: int + page_token: str + label_selector: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ..., label_selector: _Optional[str] = ...) -> None: ... + +class ListSandboxProvidersRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "page_size", "page_token") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + page_size: int + page_token: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ...) -> None: ... + +class AttachSandboxProviderRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "provider", "expected_resource_version", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + EXPECTED_RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + provider: str + expected_resource_version: int + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., provider: _Optional[str] = ..., expected_resource_version: _Optional[int] = ..., request_id: _Optional[str] = ...) -> None: ... + +class DetachSandboxProviderRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "provider", "expected_resource_version", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + EXPECTED_RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + provider: str + expected_resource_version: int + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., provider: _Optional[str] = ..., expected_resource_version: _Optional[int] = ..., request_id: _Optional[str] = ...) -> None: ... + +class DeleteSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "allow_missing", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + allow_missing: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class StopSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class StartSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class SuspendSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "name") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ...) -> None: ... + +class ResumeSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "restart_if_restore_fails") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + RESTART_IF_RESTORE_FAILS_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + restart_if_restore_fails: bool + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., restart_if_restore_fails: bool = ...) -> None: ... + +class SandboxResponse(_message.Message): + __slots__ = ("sandbox", "service_urls") + class ServiceUrlsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + SANDBOX_FIELD_NUMBER: _ClassVar[int] + SERVICE_URLS_FIELD_NUMBER: _ClassVar[int] + sandbox: Sandbox + service_urls: _containers.ScalarMap[str, str] + def __init__(self, sandbox: _Optional[_Union[Sandbox, _Mapping]] = ..., service_urls: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class ListSandboxesResponse(_message.Message): + __slots__ = ("sandboxes", "next_page_token") + SANDBOXES_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + sandboxes: _containers.RepeatedCompositeFieldContainer[Sandbox] + next_page_token: str + def __init__(self, sandboxes: _Optional[_Iterable[_Union[Sandbox, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class ListSandboxProvidersResponse(_message.Message): + __slots__ = ("providers", "next_page_token") + PROVIDERS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + providers: _containers.RepeatedCompositeFieldContainer[_datamodel_pb2.Provider] + next_page_token: str + def __init__(self, providers: _Optional[_Iterable[_Union[_datamodel_pb2.Provider, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class AttachSandboxProviderResponse(_message.Message): + __slots__ = ("sandbox", "attached", "receipt") + SANDBOX_FIELD_NUMBER: _ClassVar[int] + ATTACHED_FIELD_NUMBER: _ClassVar[int] + RECEIPT_FIELD_NUMBER: _ClassVar[int] + sandbox: Sandbox + attached: bool + receipt: ProviderMutationReceipt + def __init__(self, sandbox: _Optional[_Union[Sandbox, _Mapping]] = ..., attached: bool = ..., receipt: _Optional[_Union[ProviderMutationReceipt, _Mapping]] = ...) -> None: ... + +class DetachSandboxProviderResponse(_message.Message): + __slots__ = ("sandbox", "detached", "receipt") + SANDBOX_FIELD_NUMBER: _ClassVar[int] + DETACHED_FIELD_NUMBER: _ClassVar[int] + RECEIPT_FIELD_NUMBER: _ClassVar[int] + sandbox: Sandbox + detached: bool + receipt: ProviderMutationReceipt + def __init__(self, sandbox: _Optional[_Union[Sandbox, _Mapping]] = ..., detached: bool = ..., receipt: _Optional[_Union[ProviderMutationReceipt, _Mapping]] = ...) -> None: ... + +class ProviderDesiredIdentity(_message.Message): + __slots__ = ("sandbox_id", "sandbox", "attachment_epoch", "provider_id", "provider_resource_version", "provider_env_revision", "config_revision", "policy_hash") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + ATTACHMENT_EPOCH_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] + PROVIDER_RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + CONFIG_REVISION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + sandbox: str + attachment_epoch: str + provider_id: str + provider_resource_version: int + provider_env_revision: int + config_revision: int + policy_hash: str + def __init__(self, sandbox_id: _Optional[str] = ..., sandbox: _Optional[str] = ..., attachment_epoch: _Optional[str] = ..., provider_id: _Optional[str] = ..., provider_resource_version: _Optional[int] = ..., provider_env_revision: _Optional[int] = ..., config_revision: _Optional[int] = ..., policy_hash: _Optional[str] = ...) -> None: ... + +class ConfigSnapshotRevision(_message.Message): + __slots__ = ("sandbox_config", "provider_environment", "provider_target") + SANDBOX_CONFIG_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + PROVIDER_TARGET_FIELD_NUMBER: _ClassVar[int] + sandbox_config: SandboxConfigRevision + provider_environment: int + provider_target: ProviderDesiredIdentity + def __init__(self, sandbox_config: _Optional[_Union[SandboxConfigRevision, _Mapping]] = ..., provider_environment: _Optional[int] = ..., provider_target: _Optional[_Union[ProviderDesiredIdentity, _Mapping]] = ...) -> None: ... + +class SandboxConfigRevision(_message.Message): + __slots__ = ("config_revision", "policy_version", "policy_source", "global_policy_version", "settings_revision") + CONFIG_REVISION_FIELD_NUMBER: _ClassVar[int] + POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_SOURCE_FIELD_NUMBER: _ClassVar[int] + GLOBAL_POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + SETTINGS_REVISION_FIELD_NUMBER: _ClassVar[int] + config_revision: int + policy_version: int + policy_source: _sandbox_pb2.PolicySource + global_policy_version: int + settings_revision: int + def __init__(self, config_revision: _Optional[int] = ..., policy_version: _Optional[int] = ..., policy_source: _Optional[_Union[_sandbox_pb2.PolicySource, str]] = ..., global_policy_version: _Optional[int] = ..., settings_revision: _Optional[int] = ...) -> None: ... + +class ConfigUpdateOperation(_message.Message): + __slots__ = ("operation_id", "sandbox_id", "component", "target_revision", "state", "outcome", "sanitized_error", "created_time", "updated_time", "completed_time") + OPERATION_ID_FIELD_NUMBER: _ClassVar[int] + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + COMPONENT_FIELD_NUMBER: _ClassVar[int] + TARGET_REVISION_FIELD_NUMBER: _ClassVar[int] + STATE_FIELD_NUMBER: _ClassVar[int] + OUTCOME_FIELD_NUMBER: _ClassVar[int] + SANITIZED_ERROR_FIELD_NUMBER: _ClassVar[int] + CREATED_TIME_FIELD_NUMBER: _ClassVar[int] + UPDATED_TIME_FIELD_NUMBER: _ClassVar[int] + COMPLETED_TIME_FIELD_NUMBER: _ClassVar[int] + operation_id: str + sandbox_id: str + component: ConfigComponent + target_revision: ConfigSnapshotRevision + state: ConfigUpdateOperationState + outcome: ConfigApplyOutcome + sanitized_error: str + created_time: _timestamp_pb2.Timestamp + updated_time: _timestamp_pb2.Timestamp + completed_time: _timestamp_pb2.Timestamp + def __init__(self, operation_id: _Optional[str] = ..., sandbox_id: _Optional[str] = ..., component: _Optional[_Union[ConfigComponent, str]] = ..., target_revision: _Optional[_Union[ConfigSnapshotRevision, _Mapping]] = ..., state: _Optional[_Union[ConfigUpdateOperationState, str]] = ..., outcome: _Optional[_Union[ConfigApplyOutcome, str]] = ..., sanitized_error: _Optional[str] = ..., created_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., updated_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., completed_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProviderMutationReceipt(_message.Message): + __slots__ = ("receipt_id", "mutation_id", "provider", "workspace", "kind", "desired", "persisted_time") + RECEIPT_ID_FIELD_NUMBER: _ClassVar[int] + MUTATION_ID_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + KIND_FIELD_NUMBER: _ClassVar[int] + DESIRED_FIELD_NUMBER: _ClassVar[int] + PERSISTED_TIME_FIELD_NUMBER: _ClassVar[int] + receipt_id: str + mutation_id: str + provider: str + workspace: str + kind: ProviderMutationKind + desired: ProviderDesiredIdentity + persisted_time: _timestamp_pb2.Timestamp + def __init__(self, receipt_id: _Optional[str] = ..., mutation_id: _Optional[str] = ..., provider: _Optional[str] = ..., workspace: _Optional[str] = ..., kind: _Optional[_Union[ProviderMutationKind, str]] = ..., desired: _Optional[_Union[ProviderDesiredIdentity, _Mapping]] = ..., persisted_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProviderReadinessObservation(_message.Message): + __slots__ = ("session_id", "sequence", "attachment_epoch", "provider_env_revision", "config_revision", "policy_hash", "credentials_installed", "policy_active", "launch_environment_installed", "process_instance_id", "reason") + SESSION_ID_FIELD_NUMBER: _ClassVar[int] + SEQUENCE_FIELD_NUMBER: _ClassVar[int] + ATTACHMENT_EPOCH_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + CONFIG_REVISION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + CREDENTIALS_INSTALLED_FIELD_NUMBER: _ClassVar[int] + POLICY_ACTIVE_FIELD_NUMBER: _ClassVar[int] + LAUNCH_ENVIRONMENT_INSTALLED_FIELD_NUMBER: _ClassVar[int] + PROCESS_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + session_id: str + sequence: int + attachment_epoch: str + provider_env_revision: int + config_revision: int + policy_hash: str + credentials_installed: bool + policy_active: bool + launch_environment_installed: bool + process_instance_id: str + reason: ProviderReadinessReason + def __init__(self, session_id: _Optional[str] = ..., sequence: _Optional[int] = ..., attachment_epoch: _Optional[str] = ..., provider_env_revision: _Optional[int] = ..., config_revision: _Optional[int] = ..., policy_hash: _Optional[str] = ..., credentials_installed: bool = ..., policy_active: bool = ..., launch_environment_installed: bool = ..., process_instance_id: _Optional[str] = ..., reason: _Optional[_Union[ProviderReadinessReason, str]] = ...) -> None: ... + +class ProviderReadinessStatus(_message.Message): + __slots__ = ("receipt", "state", "reason", "observed", "network_instance_id", "observed_time", "evaluated_time", "operation") + RECEIPT_FIELD_NUMBER: _ClassVar[int] + STATE_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + OBSERVED_FIELD_NUMBER: _ClassVar[int] + NETWORK_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + OBSERVED_TIME_FIELD_NUMBER: _ClassVar[int] + EVALUATED_TIME_FIELD_NUMBER: _ClassVar[int] + OPERATION_FIELD_NUMBER: _ClassVar[int] + receipt: ProviderMutationReceipt + state: ProviderReadinessState + reason: ProviderReadinessReason + observed: ProviderReadinessObservation + network_instance_id: str + observed_time: _timestamp_pb2.Timestamp + evaluated_time: _timestamp_pb2.Timestamp + operation: ConfigUpdateOperation + def __init__(self, receipt: _Optional[_Union[ProviderMutationReceipt, _Mapping]] = ..., state: _Optional[_Union[ProviderReadinessState, str]] = ..., reason: _Optional[_Union[ProviderReadinessReason, str]] = ..., observed: _Optional[_Union[ProviderReadinessObservation, _Mapping]] = ..., network_instance_id: _Optional[str] = ..., observed_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., evaluated_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., operation: _Optional[_Union[ConfigUpdateOperation, _Mapping]] = ...) -> None: ... + +class GetSandboxProviderStatusRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "provider", "receipt_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + RECEIPT_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + provider: str + receipt_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., provider: _Optional[str] = ..., receipt_id: _Optional[str] = ...) -> None: ... + +class GetSandboxProviderStatusResponse(_message.Message): + __slots__ = ("status",) + STATUS_FIELD_NUMBER: _ClassVar[int] + status: ProviderReadinessStatus + def __init__(self, status: _Optional[_Union[ProviderReadinessStatus, _Mapping]] = ...) -> None: ... + +class ReportProviderReadinessRequest(_message.Message): + __slots__ = ("sandbox_id", "observation") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + OBSERVATION_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + observation: ProviderReadinessObservation + def __init__(self, sandbox_id: _Optional[str] = ..., observation: _Optional[_Union[ProviderReadinessObservation, _Mapping]] = ...) -> None: ... + +class ReportProviderReadinessResponse(_message.Message): + __slots__ = ("accepted_sequence", "report_interval", "observation_ttl") + ACCEPTED_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + REPORT_INTERVAL_FIELD_NUMBER: _ClassVar[int] + OBSERVATION_TTL_FIELD_NUMBER: _ClassVar[int] + accepted_sequence: int + report_interval: _duration_pb2.Duration + observation_ttl: _duration_pb2.Duration + def __init__(self, accepted_sequence: _Optional[int] = ..., report_interval: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., observation_ttl: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class DeleteSandboxResponse(_message.Message): + __slots__ = ("outcome", "sandbox_id") + OUTCOME_FIELD_NUMBER: _ClassVar[int] + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + sandbox_id: str + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ..., sandbox_id: _Optional[str] = ...) -> None: ... + +class CreateSshSessionRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ...) -> None: ... + +class CreateSshSessionResponse(_message.Message): + __slots__ = ("sandbox_id", "token", "gateway_host", "gateway_port", "gateway_scheme", "host_key_fingerprint", "expiration_time") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + TOKEN_FIELD_NUMBER: _ClassVar[int] + GATEWAY_HOST_FIELD_NUMBER: _ClassVar[int] + GATEWAY_PORT_FIELD_NUMBER: _ClassVar[int] + GATEWAY_SCHEME_FIELD_NUMBER: _ClassVar[int] + HOST_KEY_FINGERPRINT_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + token: str + gateway_host: str + gateway_port: int + gateway_scheme: str + host_key_fingerprint: str + expiration_time: _timestamp_pb2.Timestamp + def __init__(self, sandbox_id: _Optional[str] = ..., token: _Optional[str] = ..., gateway_host: _Optional[str] = ..., gateway_port: _Optional[int] = ..., gateway_scheme: _Optional[str] = ..., host_key_fingerprint: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ExposeServiceRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "target_port", "domain", "sandbox", "request_id", "authorization_mode") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + TARGET_PORT_FIELD_NUMBER: _ClassVar[int] + DOMAIN_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + AUTHORIZATION_MODE_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + target_port: int + domain: bool + sandbox: str + request_id: str + authorization_mode: ServiceAuthorizationMode + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., target_port: _Optional[int] = ..., domain: bool = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ..., authorization_mode: _Optional[_Union[ServiceAuthorizationMode, str]] = ...) -> None: ... + +class GetServiceRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "sandbox") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + sandbox: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., sandbox: _Optional[str] = ...) -> None: ... + +class ListServicesRequest(_message.Message): + __slots__ = ("workspace_scope", "page_size", "page_token", "sandbox") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + page_size: int + page_token: str + sandbox: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ..., sandbox: _Optional[str] = ...) -> None: ... + +class ListServicesResponse(_message.Message): + __slots__ = ("services", "next_page_token") + SERVICES_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + services: _containers.RepeatedCompositeFieldContainer[ServiceEndpointResponse] + next_page_token: str + def __init__(self, services: _Optional[_Iterable[_Union[ServiceEndpointResponse, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class DeleteServiceRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "sandbox", "allow_missing", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + sandbox: str + allow_missing: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., sandbox: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class DeleteServiceResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class ServiceEndpoint(_message.Message): + __slots__ = ("metadata", "sandbox_id", "sandbox", "name", "target_port", "domain", "authorization_mode") + METADATA_FIELD_NUMBER: _ClassVar[int] + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + TARGET_PORT_FIELD_NUMBER: _ClassVar[int] + DOMAIN_FIELD_NUMBER: _ClassVar[int] + AUTHORIZATION_MODE_FIELD_NUMBER: _ClassVar[int] + metadata: _datamodel_pb2.ObjectMeta + sandbox_id: str + sandbox: str + name: str + target_port: int + domain: bool + authorization_mode: ServiceAuthorizationMode + def __init__(self, metadata: _Optional[_Union[_datamodel_pb2.ObjectMeta, _Mapping]] = ..., sandbox_id: _Optional[str] = ..., sandbox: _Optional[str] = ..., name: _Optional[str] = ..., target_port: _Optional[int] = ..., domain: bool = ..., authorization_mode: _Optional[_Union[ServiceAuthorizationMode, str]] = ...) -> None: ... + +class ServiceEndpointResponse(_message.Message): + __slots__ = ("endpoint", "url") + ENDPOINT_FIELD_NUMBER: _ClassVar[int] + URL_FIELD_NUMBER: _ClassVar[int] + endpoint: ServiceEndpoint + url: str + def __init__(self, endpoint: _Optional[_Union[ServiceEndpoint, _Mapping]] = ..., url: _Optional[str] = ...) -> None: ... + +class RevokeSshSessionRequest(_message.Message): + __slots__ = ("token", "allow_missing") + TOKEN_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + token: str + allow_missing: bool + def __init__(self, token: _Optional[str] = ..., allow_missing: bool = ...) -> None: ... + +class RevokeSshSessionResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class ExecSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "command", "workdir", "environment", "execution_timeout", "stdin", "tty", "cols", "rows", "no_login_shell", "request_id") + class EnvironmentEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + COMMAND_FIELD_NUMBER: _ClassVar[int] + WORKDIR_FIELD_NUMBER: _ClassVar[int] + ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + EXECUTION_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + STDIN_FIELD_NUMBER: _ClassVar[int] + TTY_FIELD_NUMBER: _ClassVar[int] + COLS_FIELD_NUMBER: _ClassVar[int] + ROWS_FIELD_NUMBER: _ClassVar[int] + NO_LOGIN_SHELL_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + command: _containers.RepeatedScalarFieldContainer[str] + workdir: str + environment: _containers.ScalarMap[str, str] + execution_timeout: _duration_pb2.Duration + stdin: bytes + tty: bool + cols: int + rows: int + no_login_shell: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., command: _Optional[_Iterable[str]] = ..., workdir: _Optional[str] = ..., environment: _Optional[_Mapping[str, str]] = ..., execution_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., stdin: _Optional[bytes] = ..., tty: bool = ..., cols: _Optional[int] = ..., rows: _Optional[int] = ..., no_login_shell: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class ExecSandboxStdout(_message.Message): + __slots__ = ("data",) + DATA_FIELD_NUMBER: _ClassVar[int] + data: bytes + def __init__(self, data: _Optional[bytes] = ...) -> None: ... + +class ExecSandboxStderr(_message.Message): + __slots__ = ("data",) + DATA_FIELD_NUMBER: _ClassVar[int] + data: bytes + def __init__(self, data: _Optional[bytes] = ...) -> None: ... + +class ExecSandboxExit(_message.Message): + __slots__ = ("exit_code",) + EXIT_CODE_FIELD_NUMBER: _ClassVar[int] + exit_code: int + def __init__(self, exit_code: _Optional[int] = ...) -> None: ... + +class ExecSandboxEvent(_message.Message): + __slots__ = ("stdout", "stderr", "exit") + STDOUT_FIELD_NUMBER: _ClassVar[int] + STDERR_FIELD_NUMBER: _ClassVar[int] + EXIT_FIELD_NUMBER: _ClassVar[int] + stdout: ExecSandboxStdout + stderr: ExecSandboxStderr + exit: ExecSandboxExit + def __init__(self, stdout: _Optional[_Union[ExecSandboxStdout, _Mapping]] = ..., stderr: _Optional[_Union[ExecSandboxStderr, _Mapping]] = ..., exit: _Optional[_Union[ExecSandboxExit, _Mapping]] = ...) -> None: ... + +class TcpForwardInit(_message.Message): + __slots__ = ("sandbox", "workspace", "service_id", "ssh", "tcp", "authorization_token") + SANDBOX_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + SERVICE_ID_FIELD_NUMBER: _ClassVar[int] + SSH_FIELD_NUMBER: _ClassVar[int] + TCP_FIELD_NUMBER: _ClassVar[int] + AUTHORIZATION_TOKEN_FIELD_NUMBER: _ClassVar[int] + sandbox: str + workspace: str + service_id: str + ssh: SshRelayTarget + tcp: TcpRelayTarget + authorization_token: str + def __init__(self, sandbox: _Optional[str] = ..., workspace: _Optional[str] = ..., service_id: _Optional[str] = ..., ssh: _Optional[_Union[SshRelayTarget, _Mapping]] = ..., tcp: _Optional[_Union[TcpRelayTarget, _Mapping]] = ..., authorization_token: _Optional[str] = ...) -> None: ... + +class TcpForwardFrame(_message.Message): + __slots__ = ("init", "data") + INIT_FIELD_NUMBER: _ClassVar[int] + DATA_FIELD_NUMBER: _ClassVar[int] + init: TcpForwardInit + data: bytes + def __init__(self, init: _Optional[_Union[TcpForwardInit, _Mapping]] = ..., data: _Optional[bytes] = ...) -> None: ... + +class ExecSandboxInput(_message.Message): + __slots__ = ("start", "stdin", "resize") + START_FIELD_NUMBER: _ClassVar[int] + STDIN_FIELD_NUMBER: _ClassVar[int] + RESIZE_FIELD_NUMBER: _ClassVar[int] + start: ExecSandboxRequest + stdin: bytes + resize: ExecSandboxWindowResize + def __init__(self, start: _Optional[_Union[ExecSandboxRequest, _Mapping]] = ..., stdin: _Optional[bytes] = ..., resize: _Optional[_Union[ExecSandboxWindowResize, _Mapping]] = ...) -> None: ... + +class ExecSandboxWindowResize(_message.Message): + __slots__ = ("cols", "rows") + COLS_FIELD_NUMBER: _ClassVar[int] + ROWS_FIELD_NUMBER: _ClassVar[int] + cols: int + rows: int + def __init__(self, cols: _Optional[int] = ..., rows: _Optional[int] = ...) -> None: ... + +class SshSession(_message.Message): + __slots__ = ("metadata", "sandbox_id", "token", "expiration_time", "revoked") + METADATA_FIELD_NUMBER: _ClassVar[int] + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + TOKEN_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + REVOKED_FIELD_NUMBER: _ClassVar[int] + metadata: _datamodel_pb2.ObjectMeta + sandbox_id: str + token: str + expiration_time: _timestamp_pb2.Timestamp + revoked: bool + def __init__(self, metadata: _Optional[_Union[_datamodel_pb2.ObjectMeta, _Mapping]] = ..., sandbox_id: _Optional[str] = ..., token: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., revoked: bool = ...) -> None: ... + +class WatchSandboxRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "follow_status", "follow_logs", "follow_events", "log_tail_lines", "event_tail", "stop_on_terminal", "since_time", "log_sources", "log_min_level", "resume_after_cursor") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + FOLLOW_STATUS_FIELD_NUMBER: _ClassVar[int] + FOLLOW_LOGS_FIELD_NUMBER: _ClassVar[int] + FOLLOW_EVENTS_FIELD_NUMBER: _ClassVar[int] + LOG_TAIL_LINES_FIELD_NUMBER: _ClassVar[int] + EVENT_TAIL_FIELD_NUMBER: _ClassVar[int] + STOP_ON_TERMINAL_FIELD_NUMBER: _ClassVar[int] + SINCE_TIME_FIELD_NUMBER: _ClassVar[int] + LOG_SOURCES_FIELD_NUMBER: _ClassVar[int] + LOG_MIN_LEVEL_FIELD_NUMBER: _ClassVar[int] + RESUME_AFTER_CURSOR_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + follow_status: bool + follow_logs: bool + follow_events: bool + log_tail_lines: int + event_tail: int + stop_on_terminal: bool + since_time: _timestamp_pb2.Timestamp + log_sources: _containers.RepeatedScalarFieldContainer[str] + log_min_level: str + resume_after_cursor: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., follow_status: bool = ..., follow_logs: bool = ..., follow_events: bool = ..., log_tail_lines: _Optional[int] = ..., event_tail: _Optional[int] = ..., stop_on_terminal: bool = ..., since_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., log_sources: _Optional[_Iterable[str]] = ..., log_min_level: _Optional[str] = ..., resume_after_cursor: _Optional[str] = ...) -> None: ... + +class SandboxStreamEvent(_message.Message): + __slots__ = ("sandbox", "log", "event", "warning", "draft_policy_update", "cursor") + SANDBOX_FIELD_NUMBER: _ClassVar[int] + LOG_FIELD_NUMBER: _ClassVar[int] + EVENT_FIELD_NUMBER: _ClassVar[int] + WARNING_FIELD_NUMBER: _ClassVar[int] + DRAFT_POLICY_UPDATE_FIELD_NUMBER: _ClassVar[int] + CURSOR_FIELD_NUMBER: _ClassVar[int] + sandbox: Sandbox + log: SandboxLogLine + event: PlatformEvent + warning: SandboxStreamWarning + draft_policy_update: DraftPolicyUpdate + cursor: str + def __init__(self, sandbox: _Optional[_Union[Sandbox, _Mapping]] = ..., log: _Optional[_Union[SandboxLogLine, _Mapping]] = ..., event: _Optional[_Union[PlatformEvent, _Mapping]] = ..., warning: _Optional[_Union[SandboxStreamWarning, _Mapping]] = ..., draft_policy_update: _Optional[_Union[DraftPolicyUpdate, _Mapping]] = ..., cursor: _Optional[str] = ...) -> None: ... + +class SandboxLogLine(_message.Message): + __slots__ = ("sandbox_id", "event_time", "level", "target", "message", "source", "fields") + class FieldsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + EVENT_TIME_FIELD_NUMBER: _ClassVar[int] + LEVEL_FIELD_NUMBER: _ClassVar[int] + TARGET_FIELD_NUMBER: _ClassVar[int] + MESSAGE_FIELD_NUMBER: _ClassVar[int] + SOURCE_FIELD_NUMBER: _ClassVar[int] + FIELDS_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + event_time: _timestamp_pb2.Timestamp + level: str + target: str + message: str + source: str + fields: _containers.ScalarMap[str, str] + def __init__(self, sandbox_id: _Optional[str] = ..., event_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., level: _Optional[str] = ..., target: _Optional[str] = ..., message: _Optional[str] = ..., source: _Optional[str] = ..., fields: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class SandboxStreamWarning(_message.Message): + __slots__ = ("message",) + MESSAGE_FIELD_NUMBER: _ClassVar[int] + message: str + def __init__(self, message: _Optional[str] = ...) -> None: ... + +class CreateProviderRequest(_message.Message): + __slots__ = ("workspace_scope", "provider", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + provider: _datamodel_pb2.Provider + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., provider: _Optional[_Union[_datamodel_pb2.Provider, _Mapping]] = ..., request_id: _Optional[str] = ...) -> None: ... + +class GetProviderRequest(_message.Message): + __slots__ = ("workspace_scope", "name") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ...) -> None: ... + +class GetProviderCredentialsRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "credential_keys", "minimum_remaining_lifetime") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEYS_FIELD_NUMBER: _ClassVar[int] + MINIMUM_REMAINING_LIFETIME_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + credential_keys: _containers.RepeatedScalarFieldContainer[str] + minimum_remaining_lifetime: _duration_pb2.Duration + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., credential_keys: _Optional[_Iterable[str]] = ..., minimum_remaining_lifetime: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class ProviderCredentialValue(_message.Message): + __slots__ = ("value", "expiration_time") + VALUE_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + value: str + expiration_time: _timestamp_pb2.Timestamp + def __init__(self, value: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class GetProviderCredentialsResponse(_message.Message): + __slots__ = ("credentials",) + class CredentialsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ProviderCredentialValue + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ProviderCredentialValue, _Mapping]] = ...) -> None: ... + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + credentials: _containers.MessageMap[str, ProviderCredentialValue] + def __init__(self, credentials: _Optional[_Mapping[str, ProviderCredentialValue]] = ...) -> None: ... + +class ListProvidersRequest(_message.Message): + __slots__ = ("workspace_scope", "page_size", "page_token", "label_selector") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + LABEL_SELECTOR_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + page_size: int + page_token: str + label_selector: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ..., label_selector: _Optional[str] = ...) -> None: ... + +class UpdateProviderRequest(_message.Message): + __slots__ = ("workspace_scope", "provider", "credential_expiration_times", "clear_credential_expiration_keys", "request_id") + class CredentialExpirationTimesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _timestamp_pb2.Timestamp + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_EXPIRATION_TIMES_FIELD_NUMBER: _ClassVar[int] + CLEAR_CREDENTIAL_EXPIRATION_KEYS_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + provider: _datamodel_pb2.Provider + credential_expiration_times: _containers.MessageMap[str, _timestamp_pb2.Timestamp] + clear_credential_expiration_keys: _containers.RepeatedScalarFieldContainer[str] + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., provider: _Optional[_Union[_datamodel_pb2.Provider, _Mapping]] = ..., credential_expiration_times: _Optional[_Mapping[str, _timestamp_pb2.Timestamp]] = ..., clear_credential_expiration_keys: _Optional[_Iterable[str]] = ..., request_id: _Optional[str] = ...) -> None: ... + +class DeleteProviderRequest(_message.Message): + __slots__ = ("workspace_scope", "name", "allow_missing", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + allow_missing: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class ProviderResponse(_message.Message): + __slots__ = ("provider", "target_receipts", "mutation_id") + PROVIDER_FIELD_NUMBER: _ClassVar[int] + TARGET_RECEIPTS_FIELD_NUMBER: _ClassVar[int] + MUTATION_ID_FIELD_NUMBER: _ClassVar[int] + provider: _datamodel_pb2.Provider + target_receipts: _containers.RepeatedCompositeFieldContainer[ProviderMutationReceipt] + mutation_id: str + def __init__(self, provider: _Optional[_Union[_datamodel_pb2.Provider, _Mapping]] = ..., target_receipts: _Optional[_Iterable[_Union[ProviderMutationReceipt, _Mapping]]] = ..., mutation_id: _Optional[str] = ...) -> None: ... + +class ListProvidersResponse(_message.Message): + __slots__ = ("providers", "next_page_token") + PROVIDERS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + providers: _containers.RepeatedCompositeFieldContainer[_datamodel_pb2.Provider] + next_page_token: str + def __init__(self, providers: _Optional[_Iterable[_Union[_datamodel_pb2.Provider, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class ListProviderProfilesRequest(_message.Message): + __slots__ = ("workspace_scope", "page_size", "page_token") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + page_size: int + page_token: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ...) -> None: ... + +class GetProviderProfileRequest(_message.Message): + __slots__ = ("workspace_scope", "id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., id: _Optional[str] = ...) -> None: ... + +class ProviderProfileImportItem(_message.Message): + __slots__ = ("profile", "source") + PROFILE_FIELD_NUMBER: _ClassVar[int] + SOURCE_FIELD_NUMBER: _ClassVar[int] + profile: ProviderProfile + source: str + def __init__(self, profile: _Optional[_Union[ProviderProfile, _Mapping]] = ..., source: _Optional[str] = ...) -> None: ... + +class ProviderProfileDiagnostic(_message.Message): + __slots__ = ("source", "profile_id", "field", "message", "severity") + SOURCE_FIELD_NUMBER: _ClassVar[int] + PROFILE_ID_FIELD_NUMBER: _ClassVar[int] + FIELD_FIELD_NUMBER: _ClassVar[int] + MESSAGE_FIELD_NUMBER: _ClassVar[int] + SEVERITY_FIELD_NUMBER: _ClassVar[int] + source: str + profile_id: str + field: str + message: str + severity: str + def __init__(self, source: _Optional[str] = ..., profile_id: _Optional[str] = ..., field: _Optional[str] = ..., message: _Optional[str] = ..., severity: _Optional[str] = ...) -> None: ... + +class ProviderCredentialTokenGrantAudienceOverride(_message.Message): + __slots__ = ("host", "port", "path", "audience", "scopes") + HOST_FIELD_NUMBER: _ClassVar[int] + PORT_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + AUDIENCE_FIELD_NUMBER: _ClassVar[int] + SCOPES_FIELD_NUMBER: _ClassVar[int] + host: str + port: int + path: str + audience: str + scopes: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, host: _Optional[str] = ..., port: _Optional[int] = ..., path: _Optional[str] = ..., audience: _Optional[str] = ..., scopes: _Optional[_Iterable[str]] = ...) -> None: ... + +class ProviderCredentialTokenGrantSubjectToken(_message.Message): + __slots__ = ("source", "credential", "subject_token_type") + SOURCE_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_FIELD_NUMBER: _ClassVar[int] + SUBJECT_TOKEN_TYPE_FIELD_NUMBER: _ClassVar[int] + source: str + credential: str + subject_token_type: str + def __init__(self, source: _Optional[str] = ..., credential: _Optional[str] = ..., subject_token_type: _Optional[str] = ...) -> None: ... + +class ProviderCredentialTokenGrant(_message.Message): + __slots__ = ("token_endpoint", "audience", "jwt_svid_audience", "scopes", "cache_ttl", "audience_overrides", "client_assertion_type", "grant_type", "subject_token", "requested_token_type") + TOKEN_ENDPOINT_FIELD_NUMBER: _ClassVar[int] + AUDIENCE_FIELD_NUMBER: _ClassVar[int] + JWT_SVID_AUDIENCE_FIELD_NUMBER: _ClassVar[int] + SCOPES_FIELD_NUMBER: _ClassVar[int] + CACHE_TTL_FIELD_NUMBER: _ClassVar[int] + AUDIENCE_OVERRIDES_FIELD_NUMBER: _ClassVar[int] + CLIENT_ASSERTION_TYPE_FIELD_NUMBER: _ClassVar[int] + GRANT_TYPE_FIELD_NUMBER: _ClassVar[int] + SUBJECT_TOKEN_FIELD_NUMBER: _ClassVar[int] + REQUESTED_TOKEN_TYPE_FIELD_NUMBER: _ClassVar[int] + token_endpoint: str + audience: str + jwt_svid_audience: str + scopes: _containers.RepeatedScalarFieldContainer[str] + cache_ttl: _duration_pb2.Duration + audience_overrides: _containers.RepeatedCompositeFieldContainer[ProviderCredentialTokenGrantAudienceOverride] + client_assertion_type: str + grant_type: ProviderCredentialTokenGrantType + subject_token: ProviderCredentialTokenGrantSubjectToken + requested_token_type: str + def __init__(self, token_endpoint: _Optional[str] = ..., audience: _Optional[str] = ..., jwt_svid_audience: _Optional[str] = ..., scopes: _Optional[_Iterable[str]] = ..., cache_ttl: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., audience_overrides: _Optional[_Iterable[_Union[ProviderCredentialTokenGrantAudienceOverride, _Mapping]]] = ..., client_assertion_type: _Optional[str] = ..., grant_type: _Optional[_Union[ProviderCredentialTokenGrantType, str]] = ..., subject_token: _Optional[_Union[ProviderCredentialTokenGrantSubjectToken, _Mapping]] = ..., requested_token_type: _Optional[str] = ...) -> None: ... + +class ProviderProfileCredential(_message.Message): + __slots__ = ("name", "description", "env_vars", "required", "auth_style", "header_name", "query_param", "refresh", "path_template", "token_grant", "token_grant_owners", "stable_placeholder") + NAME_FIELD_NUMBER: _ClassVar[int] + DESCRIPTION_FIELD_NUMBER: _ClassVar[int] + ENV_VARS_FIELD_NUMBER: _ClassVar[int] + REQUIRED_FIELD_NUMBER: _ClassVar[int] + AUTH_STYLE_FIELD_NUMBER: _ClassVar[int] + HEADER_NAME_FIELD_NUMBER: _ClassVar[int] + QUERY_PARAM_FIELD_NUMBER: _ClassVar[int] + REFRESH_FIELD_NUMBER: _ClassVar[int] + PATH_TEMPLATE_FIELD_NUMBER: _ClassVar[int] + TOKEN_GRANT_FIELD_NUMBER: _ClassVar[int] + TOKEN_GRANT_OWNERS_FIELD_NUMBER: _ClassVar[int] + STABLE_PLACEHOLDER_FIELD_NUMBER: _ClassVar[int] + name: str + description: str + env_vars: _containers.RepeatedScalarFieldContainer[str] + required: bool + auth_style: str + header_name: str + query_param: str + refresh: ProviderCredentialRefresh + path_template: str + token_grant: ProviderCredentialTokenGrant + token_grant_owners: _containers.RepeatedScalarFieldContainer[str] + stable_placeholder: bool + def __init__(self, name: _Optional[str] = ..., description: _Optional[str] = ..., env_vars: _Optional[_Iterable[str]] = ..., required: bool = ..., auth_style: _Optional[str] = ..., header_name: _Optional[str] = ..., query_param: _Optional[str] = ..., refresh: _Optional[_Union[ProviderCredentialRefresh, _Mapping]] = ..., path_template: _Optional[str] = ..., token_grant: _Optional[_Union[ProviderCredentialTokenGrant, _Mapping]] = ..., token_grant_owners: _Optional[_Iterable[str]] = ..., stable_placeholder: bool = ...) -> None: ... + +class ProviderCredentialRefreshMaterial(_message.Message): + __slots__ = ("name", "description", "required", "secret") + NAME_FIELD_NUMBER: _ClassVar[int] + DESCRIPTION_FIELD_NUMBER: _ClassVar[int] + REQUIRED_FIELD_NUMBER: _ClassVar[int] + SECRET_FIELD_NUMBER: _ClassVar[int] + name: str + description: str + required: bool + secret: bool + def __init__(self, name: _Optional[str] = ..., description: _Optional[str] = ..., required: bool = ..., secret: bool = ...) -> None: ... + +class ProviderCredentialRefreshOutput(_message.Message): + __slots__ = ("output", "credential") + OUTPUT_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_FIELD_NUMBER: _ClassVar[int] + output: str + credential: str + def __init__(self, output: _Optional[str] = ..., credential: _Optional[str] = ...) -> None: ... + +class ProviderCredentialRefresh(_message.Message): + __slots__ = ("strategy", "token_url", "scopes", "refresh_before", "max_lifetime", "material", "additional_outputs") + STRATEGY_FIELD_NUMBER: _ClassVar[int] + TOKEN_URL_FIELD_NUMBER: _ClassVar[int] + SCOPES_FIELD_NUMBER: _ClassVar[int] + REFRESH_BEFORE_FIELD_NUMBER: _ClassVar[int] + MAX_LIFETIME_FIELD_NUMBER: _ClassVar[int] + MATERIAL_FIELD_NUMBER: _ClassVar[int] + ADDITIONAL_OUTPUTS_FIELD_NUMBER: _ClassVar[int] + strategy: ProviderCredentialRefreshStrategy + token_url: str + scopes: _containers.RepeatedScalarFieldContainer[str] + refresh_before: _duration_pb2.Duration + max_lifetime: _duration_pb2.Duration + material: _containers.RepeatedCompositeFieldContainer[ProviderCredentialRefreshMaterial] + additional_outputs: _containers.RepeatedCompositeFieldContainer[ProviderCredentialRefreshOutput] + def __init__(self, strategy: _Optional[_Union[ProviderCredentialRefreshStrategy, str]] = ..., token_url: _Optional[str] = ..., scopes: _Optional[_Iterable[str]] = ..., refresh_before: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., max_lifetime: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., material: _Optional[_Iterable[_Union[ProviderCredentialRefreshMaterial, _Mapping]]] = ..., additional_outputs: _Optional[_Iterable[_Union[ProviderCredentialRefreshOutput, _Mapping]]] = ...) -> None: ... + +class ProviderCredentialRefreshStatus(_message.Message): + __slots__ = ("provider", "provider_id", "credential_key", "strategy", "status", "expiration_time", "next_refresh_time", "last_refresh_time", "last_error", "recovery_action", "failure_code", "provider_error_subtype", "last_error_time") + PROVIDER_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + STRATEGY_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + NEXT_REFRESH_TIME_FIELD_NUMBER: _ClassVar[int] + LAST_REFRESH_TIME_FIELD_NUMBER: _ClassVar[int] + LAST_ERROR_FIELD_NUMBER: _ClassVar[int] + RECOVERY_ACTION_FIELD_NUMBER: _ClassVar[int] + FAILURE_CODE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ERROR_SUBTYPE_FIELD_NUMBER: _ClassVar[int] + LAST_ERROR_TIME_FIELD_NUMBER: _ClassVar[int] + provider: str + provider_id: str + credential_key: str + strategy: ProviderCredentialRefreshStrategy + status: str + expiration_time: _timestamp_pb2.Timestamp + next_refresh_time: _timestamp_pb2.Timestamp + last_refresh_time: _timestamp_pb2.Timestamp + last_error: str + recovery_action: ProviderCredentialRefreshRecoveryAction + failure_code: str + provider_error_subtype: str + last_error_time: _timestamp_pb2.Timestamp + def __init__(self, provider: _Optional[str] = ..., provider_id: _Optional[str] = ..., credential_key: _Optional[str] = ..., strategy: _Optional[_Union[ProviderCredentialRefreshStrategy, str]] = ..., status: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., next_refresh_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., last_refresh_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., last_error: _Optional[str] = ..., recovery_action: _Optional[_Union[ProviderCredentialRefreshRecoveryAction, str]] = ..., failure_code: _Optional[str] = ..., provider_error_subtype: _Optional[str] = ..., last_error_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ProviderProfileDiscovery(_message.Message): + __slots__ = ("credentials",) + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + credentials: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, credentials: _Optional[_Iterable[str]] = ...) -> None: ... + +class GetProviderRefreshStatusRequest(_message.Message): + __slots__ = ("workspace_scope", "provider", "credential_key") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + provider: str + credential_key: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., provider: _Optional[str] = ..., credential_key: _Optional[str] = ...) -> None: ... + +class GetProviderRefreshStatusResponse(_message.Message): + __slots__ = ("credentials",) + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + credentials: _containers.RepeatedCompositeFieldContainer[ProviderCredentialRefreshStatus] + def __init__(self, credentials: _Optional[_Iterable[_Union[ProviderCredentialRefreshStatus, _Mapping]]] = ...) -> None: ... + +class ConfigureProviderRefreshRequest(_message.Message): + __slots__ = ("workspace_scope", "provider", "credential_key", "strategy", "material", "secret_material_keys", "expiration_time", "request_id") + class MaterialEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + STRATEGY_FIELD_NUMBER: _ClassVar[int] + MATERIAL_FIELD_NUMBER: _ClassVar[int] + SECRET_MATERIAL_KEYS_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + provider: str + credential_key: str + strategy: ProviderCredentialRefreshStrategy + material: _containers.ScalarMap[str, str] + secret_material_keys: _containers.RepeatedScalarFieldContainer[str] + expiration_time: _timestamp_pb2.Timestamp + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., strategy: _Optional[_Union[ProviderCredentialRefreshStrategy, str]] = ..., material: _Optional[_Mapping[str, str]] = ..., secret_material_keys: _Optional[_Iterable[str]] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., request_id: _Optional[str] = ...) -> None: ... + +class ConfigureProviderRefreshResponse(_message.Message): + __slots__ = ("status",) + STATUS_FIELD_NUMBER: _ClassVar[int] + status: ProviderCredentialRefreshStatus + def __init__(self, status: _Optional[_Union[ProviderCredentialRefreshStatus, _Mapping]] = ...) -> None: ... + +class RotateProviderCredentialRequest(_message.Message): + __slots__ = ("workspace_scope", "provider", "credential_key", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + provider: str + credential_key: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class RotateProviderCredentialResponse(_message.Message): + __slots__ = ("status",) + STATUS_FIELD_NUMBER: _ClassVar[int] + status: ProviderCredentialRefreshStatus + def __init__(self, status: _Optional[_Union[ProviderCredentialRefreshStatus, _Mapping]] = ...) -> None: ... + +class DeleteProviderRefreshRequest(_message.Message): + __slots__ = ("workspace_scope", "provider", "credential_key", "allow_missing", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + provider: str + credential_key: str + allow_missing: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class DeleteProviderRefreshResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class ProviderProfile(_message.Message): + __slots__ = ("id", "display_name", "description", "category", "credentials", "endpoints", "binaries", "inference_capable", "discovery", "resource_version", "annotations", "source", "scope", "files") + class AnnotationsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + ID_FIELD_NUMBER: _ClassVar[int] + DISPLAY_NAME_FIELD_NUMBER: _ClassVar[int] + DESCRIPTION_FIELD_NUMBER: _ClassVar[int] + CATEGORY_FIELD_NUMBER: _ClassVar[int] + CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + ENDPOINTS_FIELD_NUMBER: _ClassVar[int] + BINARIES_FIELD_NUMBER: _ClassVar[int] + INFERENCE_CAPABLE_FIELD_NUMBER: _ClassVar[int] + DISCOVERY_FIELD_NUMBER: _ClassVar[int] + RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] + SOURCE_FIELD_NUMBER: _ClassVar[int] + SCOPE_FIELD_NUMBER: _ClassVar[int] + FILES_FIELD_NUMBER: _ClassVar[int] + id: str + display_name: str + description: str + category: ProviderProfileCategory + credentials: _containers.RepeatedCompositeFieldContainer[ProviderProfileCredential] + endpoints: _containers.RepeatedCompositeFieldContainer[_sandbox_pb2.NetworkEndpoint] + binaries: _containers.RepeatedCompositeFieldContainer[_sandbox_pb2.NetworkBinary] + inference_capable: bool + discovery: ProviderProfileDiscovery + resource_version: int + annotations: _containers.ScalarMap[str, str] + source: str + scope: str + files: _containers.RepeatedCompositeFieldContainer[ProviderProfileFile] + def __init__(self, id: _Optional[str] = ..., display_name: _Optional[str] = ..., description: _Optional[str] = ..., category: _Optional[_Union[ProviderProfileCategory, str]] = ..., credentials: _Optional[_Iterable[_Union[ProviderProfileCredential, _Mapping]]] = ..., endpoints: _Optional[_Iterable[_Union[_sandbox_pb2.NetworkEndpoint, _Mapping]]] = ..., binaries: _Optional[_Iterable[_Union[_sandbox_pb2.NetworkBinary, _Mapping]]] = ..., inference_capable: bool = ..., discovery: _Optional[_Union[ProviderProfileDiscovery, _Mapping]] = ..., resource_version: _Optional[int] = ..., annotations: _Optional[_Mapping[str, str]] = ..., source: _Optional[str] = ..., scope: _Optional[str] = ..., files: _Optional[_Iterable[_Union[ProviderProfileFile, _Mapping]]] = ...) -> None: ... + +class ProviderProfileFile(_message.Message): + __slots__ = ("path", "content", "env_var") + PATH_FIELD_NUMBER: _ClassVar[int] + CONTENT_FIELD_NUMBER: _ClassVar[int] + ENV_VAR_FIELD_NUMBER: _ClassVar[int] + path: str + content: str + env_var: str + def __init__(self, path: _Optional[str] = ..., content: _Optional[str] = ..., env_var: _Optional[str] = ...) -> None: ... + +class ProviderProfileResponse(_message.Message): + __slots__ = ("profile",) + PROFILE_FIELD_NUMBER: _ClassVar[int] + profile: ProviderProfile + def __init__(self, profile: _Optional[_Union[ProviderProfile, _Mapping]] = ...) -> None: ... + +class ListProviderProfilesResponse(_message.Message): + __slots__ = ("profiles", "next_page_token") + PROFILES_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + profiles: _containers.RepeatedCompositeFieldContainer[ProviderProfile] + next_page_token: str + def __init__(self, profiles: _Optional[_Iterable[_Union[ProviderProfile, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class ImportProviderProfilesRequest(_message.Message): + __slots__ = ("workspace_scope", "profiles", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROFILES_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + profiles: _containers.RepeatedCompositeFieldContainer[ProviderProfileImportItem] + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., profiles: _Optional[_Iterable[_Union[ProviderProfileImportItem, _Mapping]]] = ..., request_id: _Optional[str] = ...) -> None: ... + +class ImportProviderProfilesResponse(_message.Message): + __slots__ = ("diagnostics", "profiles", "imported") + DIAGNOSTICS_FIELD_NUMBER: _ClassVar[int] + PROFILES_FIELD_NUMBER: _ClassVar[int] + IMPORTED_FIELD_NUMBER: _ClassVar[int] + diagnostics: _containers.RepeatedCompositeFieldContainer[ProviderProfileDiagnostic] + profiles: _containers.RepeatedCompositeFieldContainer[ProviderProfile] + imported: bool + def __init__(self, diagnostics: _Optional[_Iterable[_Union[ProviderProfileDiagnostic, _Mapping]]] = ..., profiles: _Optional[_Iterable[_Union[ProviderProfile, _Mapping]]] = ..., imported: bool = ...) -> None: ... + +class UpdateProviderProfilesRequest(_message.Message): + __slots__ = ("workspace_scope", "profile", "expected_resource_version", "id", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROFILE_FIELD_NUMBER: _ClassVar[int] + EXPECTED_RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + ID_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + profile: ProviderProfileImportItem + expected_resource_version: int + id: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., profile: _Optional[_Union[ProviderProfileImportItem, _Mapping]] = ..., expected_resource_version: _Optional[int] = ..., id: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class UpdateProviderProfilesResponse(_message.Message): + __slots__ = ("diagnostics", "profile", "updated") + DIAGNOSTICS_FIELD_NUMBER: _ClassVar[int] + PROFILE_FIELD_NUMBER: _ClassVar[int] + UPDATED_FIELD_NUMBER: _ClassVar[int] + diagnostics: _containers.RepeatedCompositeFieldContainer[ProviderProfileDiagnostic] + profile: ProviderProfile + updated: bool + def __init__(self, diagnostics: _Optional[_Iterable[_Union[ProviderProfileDiagnostic, _Mapping]]] = ..., profile: _Optional[_Union[ProviderProfile, _Mapping]] = ..., updated: bool = ...) -> None: ... + +class LintProviderProfilesRequest(_message.Message): + __slots__ = ("workspace_scope", "profiles") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PROFILES_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + profiles: _containers.RepeatedCompositeFieldContainer[ProviderProfileImportItem] + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., profiles: _Optional[_Iterable[_Union[ProviderProfileImportItem, _Mapping]]] = ...) -> None: ... + +class LintProviderProfilesResponse(_message.Message): + __slots__ = ("diagnostics", "valid", "supports_stable_placeholder") + DIAGNOSTICS_FIELD_NUMBER: _ClassVar[int] + VALID_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_STABLE_PLACEHOLDER_FIELD_NUMBER: _ClassVar[int] + diagnostics: _containers.RepeatedCompositeFieldContainer[ProviderProfileDiagnostic] + valid: bool + supports_stable_placeholder: bool + def __init__(self, diagnostics: _Optional[_Iterable[_Union[ProviderProfileDiagnostic, _Mapping]]] = ..., valid: bool = ..., supports_stable_placeholder: bool = ...) -> None: ... + +class DeleteProviderResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class DeleteProviderProfileRequest(_message.Message): + __slots__ = ("workspace_scope", "id", "allow_missing", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + ID_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + id: str + allow_missing: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., id: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class DeleteProviderProfileResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class GetSandboxProviderEnvironmentRequest(_message.Message): + __slots__ = ("sandbox_id", "supports_static_credential_bindings", "supports_stable_placeholder_environment_keys") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_STATIC_CREDENTIAL_BINDINGS_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_STABLE_PLACEHOLDER_ENVIRONMENT_KEYS_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + supports_static_credential_bindings: bool + supports_stable_placeholder_environment_keys: bool + def __init__(self, sandbox_id: _Optional[str] = ..., supports_static_credential_bindings: bool = ..., supports_stable_placeholder_environment_keys: bool = ...) -> None: ... + +class StaticCredentialEndpointBinding(_message.Message): + __slots__ = ("host", "port", "path") + HOST_FIELD_NUMBER: _ClassVar[int] + PORT_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + host: str + port: int + path: str + def __init__(self, host: _Optional[str] = ..., port: _Optional[int] = ..., path: _Optional[str] = ...) -> None: ... + +class StaticCredentialBinding(_message.Message): + __slots__ = ("endpoints", "credential_identity", "workload_credential_handle") + ENDPOINTS_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_IDENTITY_FIELD_NUMBER: _ClassVar[int] + WORKLOAD_CREDENTIAL_HANDLE_FIELD_NUMBER: _ClassVar[int] + endpoints: _containers.RepeatedCompositeFieldContainer[StaticCredentialEndpointBinding] + credential_identity: str + workload_credential_handle: str + def __init__(self, endpoints: _Optional[_Iterable[_Union[StaticCredentialEndpointBinding, _Mapping]]] = ..., credential_identity: _Optional[str] = ..., workload_credential_handle: _Optional[str] = ...) -> None: ... + +class GetSandboxProviderEnvironmentResponse(_message.Message): + __slots__ = ("environment", "provider_env_revision", "credential_expiration_times", "dynamic_credentials", "static_credential_bindings", "non_secret_environment_keys", "provider_attachment_epoch", "policy_hash", "readiness_reason", "files", "stable_placeholder_environment_keys", "supports_stable_placeholder_environment_keys") + class EnvironmentEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + class CredentialExpirationTimesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: _timestamp_pb2.Timestamp + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + class DynamicCredentialsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ProviderProfileCredential + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ProviderProfileCredential, _Mapping]] = ...) -> None: ... + class StaticCredentialBindingsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: StaticCredentialBinding + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[StaticCredentialBinding, _Mapping]] = ...) -> None: ... + class FilesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_EXPIRATION_TIMES_FIELD_NUMBER: _ClassVar[int] + DYNAMIC_CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + STATIC_CREDENTIAL_BINDINGS_FIELD_NUMBER: _ClassVar[int] + NON_SECRET_ENVIRONMENT_KEYS_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ATTACHMENT_EPOCH_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + READINESS_REASON_FIELD_NUMBER: _ClassVar[int] + FILES_FIELD_NUMBER: _ClassVar[int] + STABLE_PLACEHOLDER_ENVIRONMENT_KEYS_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_STABLE_PLACEHOLDER_ENVIRONMENT_KEYS_FIELD_NUMBER: _ClassVar[int] + environment: _containers.ScalarMap[str, str] + provider_env_revision: int + credential_expiration_times: _containers.MessageMap[str, _timestamp_pb2.Timestamp] + dynamic_credentials: _containers.MessageMap[str, ProviderProfileCredential] + static_credential_bindings: _containers.MessageMap[str, StaticCredentialBinding] + non_secret_environment_keys: _containers.RepeatedScalarFieldContainer[str] + provider_attachment_epoch: str + policy_hash: str + readiness_reason: ProviderReadinessReason + files: _containers.ScalarMap[str, str] + stable_placeholder_environment_keys: _containers.RepeatedScalarFieldContainer[str] + supports_stable_placeholder_environment_keys: bool + def __init__(self, environment: _Optional[_Mapping[str, str]] = ..., provider_env_revision: _Optional[int] = ..., credential_expiration_times: _Optional[_Mapping[str, _timestamp_pb2.Timestamp]] = ..., dynamic_credentials: _Optional[_Mapping[str, ProviderProfileCredential]] = ..., static_credential_bindings: _Optional[_Mapping[str, StaticCredentialBinding]] = ..., non_secret_environment_keys: _Optional[_Iterable[str]] = ..., provider_attachment_epoch: _Optional[str] = ..., policy_hash: _Optional[str] = ..., readiness_reason: _Optional[_Union[ProviderReadinessReason, str]] = ..., files: _Optional[_Mapping[str, str]] = ..., stable_placeholder_environment_keys: _Optional[_Iterable[str]] = ..., supports_stable_placeholder_environment_keys: bool = ...) -> None: ... + +class ProviderEnvironmentValue(_message.Message): + __slots__ = ("name", "value", "classification", "static_credential_binding", "expiration_time", "stable_placeholder") + NAME_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + CLASSIFICATION_FIELD_NUMBER: _ClassVar[int] + STATIC_CREDENTIAL_BINDING_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + STABLE_PLACEHOLDER_FIELD_NUMBER: _ClassVar[int] + name: str + value: str + classification: ProviderEnvironmentValueClassification + static_credential_binding: StaticCredentialBinding + expiration_time: _timestamp_pb2.Timestamp + stable_placeholder: bool + def __init__(self, name: _Optional[str] = ..., value: _Optional[str] = ..., classification: _Optional[_Union[ProviderEnvironmentValueClassification, str]] = ..., static_credential_binding: _Optional[_Union[StaticCredentialBinding, _Mapping]] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., stable_placeholder: bool = ...) -> None: ... + +class ProviderEnvironmentSnapshot(_message.Message): + __slots__ = ("provider_env_revision", "values", "dynamic_credentials", "provider_attachment_epoch", "policy_hash", "readiness_reason", "files") + class DynamicCredentialsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: ProviderProfileCredential + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ProviderProfileCredential, _Mapping]] = ...) -> None: ... + class FilesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + VALUES_FIELD_NUMBER: _ClassVar[int] + DYNAMIC_CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ATTACHMENT_EPOCH_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + READINESS_REASON_FIELD_NUMBER: _ClassVar[int] + FILES_FIELD_NUMBER: _ClassVar[int] + provider_env_revision: int + values: _containers.RepeatedCompositeFieldContainer[ProviderEnvironmentValue] + dynamic_credentials: _containers.MessageMap[str, ProviderProfileCredential] + provider_attachment_epoch: str + policy_hash: str + readiness_reason: ProviderReadinessReason + files: _containers.ScalarMap[str, str] + def __init__(self, provider_env_revision: _Optional[int] = ..., values: _Optional[_Iterable[_Union[ProviderEnvironmentValue, _Mapping]]] = ..., dynamic_credentials: _Optional[_Mapping[str, ProviderProfileCredential]] = ..., provider_attachment_epoch: _Optional[str] = ..., policy_hash: _Optional[str] = ..., readiness_reason: _Optional[_Union[ProviderReadinessReason, str]] = ..., files: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class ExchangeProviderSubjectTokenRequest(_message.Message): + __slots__ = ("sandbox_id", "provider", "credential_key", "supervisor_jwt_svid") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + SUPERVISOR_JWT_SVID_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + provider: str + credential_key: str + supervisor_jwt_svid: str + def __init__(self, sandbox_id: _Optional[str] = ..., provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., supervisor_jwt_svid: _Optional[str] = ...) -> None: ... + +class ExchangeProviderSubjectTokenResponse(_message.Message): + __slots__ = ("access_token", "expires_after", "token_type") + ACCESS_TOKEN_FIELD_NUMBER: _ClassVar[int] + EXPIRES_AFTER_FIELD_NUMBER: _ClassVar[int] + TOKEN_TYPE_FIELD_NUMBER: _ClassVar[int] + access_token: str + expires_after: _duration_pb2.Duration + token_type: str + def __init__(self, access_token: _Optional[str] = ..., expires_after: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., token_type: _Optional[str] = ...) -> None: ... + +class UpdateConfigRequest(_message.Message): + __slots__ = ("workspace_scope", "policy", "setting_key", "setting_value", "delete_setting", "merge_operations", "expected_resource_version", "annotations", "sandbox", "request_id") + class AnnotationsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + POLICY_FIELD_NUMBER: _ClassVar[int] + SETTING_KEY_FIELD_NUMBER: _ClassVar[int] + SETTING_VALUE_FIELD_NUMBER: _ClassVar[int] + DELETE_SETTING_FIELD_NUMBER: _ClassVar[int] + GLOBAL_FIELD_NUMBER: _ClassVar[int] + MERGE_OPERATIONS_FIELD_NUMBER: _ClassVar[int] + EXPECTED_RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + policy: _sandbox_pb2.SandboxPolicy + setting_key: str + setting_value: _sandbox_pb2.SettingValue + delete_setting: bool + merge_operations: _containers.RepeatedCompositeFieldContainer[PolicyMergeOperation] + expected_resource_version: int + annotations: _containers.ScalarMap[str, str] + sandbox: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., policy: _Optional[_Union[_sandbox_pb2.SandboxPolicy, _Mapping]] = ..., setting_key: _Optional[str] = ..., setting_value: _Optional[_Union[_sandbox_pb2.SettingValue, _Mapping]] = ..., delete_setting: bool = ..., merge_operations: _Optional[_Iterable[_Union[PolicyMergeOperation, _Mapping]]] = ..., expected_resource_version: _Optional[int] = ..., annotations: _Optional[_Mapping[str, str]] = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ..., **kwargs) -> None: ... + +class PolicyMergeOperation(_message.Message): + __slots__ = ("add_rule", "remove_endpoint", "remove_rule", "add_deny_rules", "add_allow_rules", "remove_binary") + ADD_RULE_FIELD_NUMBER: _ClassVar[int] + REMOVE_ENDPOINT_FIELD_NUMBER: _ClassVar[int] + REMOVE_RULE_FIELD_NUMBER: _ClassVar[int] + ADD_DENY_RULES_FIELD_NUMBER: _ClassVar[int] + ADD_ALLOW_RULES_FIELD_NUMBER: _ClassVar[int] + REMOVE_BINARY_FIELD_NUMBER: _ClassVar[int] + add_rule: AddNetworkRule + remove_endpoint: RemoveNetworkEndpoint + remove_rule: RemoveNetworkRule + add_deny_rules: AddDenyRules + add_allow_rules: AddAllowRules + remove_binary: RemoveNetworkBinary + def __init__(self, add_rule: _Optional[_Union[AddNetworkRule, _Mapping]] = ..., remove_endpoint: _Optional[_Union[RemoveNetworkEndpoint, _Mapping]] = ..., remove_rule: _Optional[_Union[RemoveNetworkRule, _Mapping]] = ..., add_deny_rules: _Optional[_Union[AddDenyRules, _Mapping]] = ..., add_allow_rules: _Optional[_Union[AddAllowRules, _Mapping]] = ..., remove_binary: _Optional[_Union[RemoveNetworkBinary, _Mapping]] = ...) -> None: ... + +class AddNetworkRule(_message.Message): + __slots__ = ("rule_name", "rule") + RULE_NAME_FIELD_NUMBER: _ClassVar[int] + RULE_FIELD_NUMBER: _ClassVar[int] + rule_name: str + rule: _sandbox_pb2.NetworkPolicyRule + def __init__(self, rule_name: _Optional[str] = ..., rule: _Optional[_Union[_sandbox_pb2.NetworkPolicyRule, _Mapping]] = ...) -> None: ... + +class RemoveNetworkEndpoint(_message.Message): + __slots__ = ("rule_name", "host", "port") + RULE_NAME_FIELD_NUMBER: _ClassVar[int] + HOST_FIELD_NUMBER: _ClassVar[int] + PORT_FIELD_NUMBER: _ClassVar[int] + rule_name: str + host: str + port: int + def __init__(self, rule_name: _Optional[str] = ..., host: _Optional[str] = ..., port: _Optional[int] = ...) -> None: ... + +class RemoveNetworkRule(_message.Message): + __slots__ = ("rule_name",) + RULE_NAME_FIELD_NUMBER: _ClassVar[int] + rule_name: str + def __init__(self, rule_name: _Optional[str] = ...) -> None: ... + +class L7RuleTarget(_message.Message): + __slots__ = ("rule_name", "host", "ports", "path", "binaries", "any_binary") + RULE_NAME_FIELD_NUMBER: _ClassVar[int] + HOST_FIELD_NUMBER: _ClassVar[int] + PORTS_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + BINARIES_FIELD_NUMBER: _ClassVar[int] + ANY_BINARY_FIELD_NUMBER: _ClassVar[int] + rule_name: str + host: str + ports: _containers.RepeatedScalarFieldContainer[int] + path: str + binaries: _containers.RepeatedCompositeFieldContainer[_sandbox_pb2.NetworkBinary] + any_binary: bool + def __init__(self, rule_name: _Optional[str] = ..., host: _Optional[str] = ..., ports: _Optional[_Iterable[int]] = ..., path: _Optional[str] = ..., binaries: _Optional[_Iterable[_Union[_sandbox_pb2.NetworkBinary, _Mapping]]] = ..., any_binary: bool = ...) -> None: ... + +class AddDenyRules(_message.Message): + __slots__ = ("deny_rules", "target") + DENY_RULES_FIELD_NUMBER: _ClassVar[int] + TARGET_FIELD_NUMBER: _ClassVar[int] + deny_rules: _containers.RepeatedCompositeFieldContainer[_sandbox_pb2.L7DenyRule] + target: L7RuleTarget + def __init__(self, deny_rules: _Optional[_Iterable[_Union[_sandbox_pb2.L7DenyRule, _Mapping]]] = ..., target: _Optional[_Union[L7RuleTarget, _Mapping]] = ...) -> None: ... + +class AddAllowRules(_message.Message): + __slots__ = ("rules", "target") + RULES_FIELD_NUMBER: _ClassVar[int] + TARGET_FIELD_NUMBER: _ClassVar[int] + rules: _containers.RepeatedCompositeFieldContainer[_sandbox_pb2.L7Rule] + target: L7RuleTarget + def __init__(self, rules: _Optional[_Iterable[_Union[_sandbox_pb2.L7Rule, _Mapping]]] = ..., target: _Optional[_Union[L7RuleTarget, _Mapping]] = ...) -> None: ... + +class RemoveNetworkBinary(_message.Message): + __slots__ = ("rule_name", "binary_path") + RULE_NAME_FIELD_NUMBER: _ClassVar[int] + BINARY_PATH_FIELD_NUMBER: _ClassVar[int] + rule_name: str + binary_path: str + def __init__(self, rule_name: _Optional[str] = ..., binary_path: _Optional[str] = ...) -> None: ... + +class UpdateConfigResponse(_message.Message): + __slots__ = ("version", "policy_hash", "settings_revision", "deleted", "annotations") + class AnnotationsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + SETTINGS_REVISION_FIELD_NUMBER: _ClassVar[int] + DELETED_FIELD_NUMBER: _ClassVar[int] + ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] + version: int + policy_hash: str + settings_revision: int + deleted: bool + annotations: _containers.ScalarMap[str, str] + def __init__(self, version: _Optional[int] = ..., policy_hash: _Optional[str] = ..., settings_revision: _Optional[int] = ..., deleted: bool = ..., annotations: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class GetSandboxPolicyStatusRequest(_message.Message): + __slots__ = ("workspace_scope", "version", "sandbox") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + VERSION_FIELD_NUMBER: _ClassVar[int] + GLOBAL_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + version: int + sandbox: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., version: _Optional[int] = ..., sandbox: _Optional[str] = ..., **kwargs) -> None: ... + +class GetSandboxPolicyStatusResponse(_message.Message): + __slots__ = ("revision", "active_version") + REVISION_FIELD_NUMBER: _ClassVar[int] + ACTIVE_VERSION_FIELD_NUMBER: _ClassVar[int] + revision: SandboxPolicyRevision + active_version: int + def __init__(self, revision: _Optional[_Union[SandboxPolicyRevision, _Mapping]] = ..., active_version: _Optional[int] = ...) -> None: ... + +class ListSandboxPoliciesRequest(_message.Message): + __slots__ = ("workspace_scope", "page_size", "page_token", "sandbox") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + GLOBAL_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + page_size: int + page_token: str + sandbox: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ..., sandbox: _Optional[str] = ..., **kwargs) -> None: ... + +class ListSandboxPoliciesResponse(_message.Message): + __slots__ = ("revisions", "next_page_token") + REVISIONS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + revisions: _containers.RepeatedCompositeFieldContainer[SandboxPolicyRevision] + next_page_token: str + def __init__(self, revisions: _Optional[_Iterable[_Union[SandboxPolicyRevision, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class ReportPolicyStatusRequest(_message.Message): + __slots__ = ("sandbox_id", "version", "status", "load_error") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + VERSION_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + LOAD_ERROR_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + version: int + status: PolicyStatus + load_error: str + def __init__(self, sandbox_id: _Optional[str] = ..., version: _Optional[int] = ..., status: _Optional[_Union[PolicyStatus, str]] = ..., load_error: _Optional[str] = ...) -> None: ... + +class ReportPolicyStatusResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SandboxConfigurationAdmission(_message.Message): + __slots__ = ("instance_id", "state", "policy_version", "policy_hash", "config_revision", "provider_env_revision", "error") + INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + STATE_FIELD_NUMBER: _ClassVar[int] + POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + CONFIG_REVISION_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + ERROR_FIELD_NUMBER: _ClassVar[int] + instance_id: str + state: ConfigurationAdmissionState + policy_version: int + policy_hash: str + config_revision: int + provider_env_revision: int + error: str + def __init__(self, instance_id: _Optional[str] = ..., state: _Optional[_Union[ConfigurationAdmissionState, str]] = ..., policy_version: _Optional[int] = ..., policy_hash: _Optional[str] = ..., config_revision: _Optional[int] = ..., provider_env_revision: _Optional[int] = ..., error: _Optional[str] = ...) -> None: ... + +class ReportSandboxConfigurationRequest(_message.Message): + __slots__ = ("sandbox_id", "admission", "expected_instance_id") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + ADMISSION_FIELD_NUMBER: _ClassVar[int] + EXPECTED_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + admission: SandboxConfigurationAdmission + expected_instance_id: str + def __init__(self, sandbox_id: _Optional[str] = ..., admission: _Optional[_Union[SandboxConfigurationAdmission, _Mapping]] = ..., expected_instance_id: _Optional[str] = ...) -> None: ... + +class ReportSandboxConfigurationResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class SandboxPolicyRevision(_message.Message): + __slots__ = ("version", "policy_hash", "status", "load_error", "created_time", "loaded_time", "policy", "provenance") + class ProvenanceEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + LOAD_ERROR_FIELD_NUMBER: _ClassVar[int] + CREATED_TIME_FIELD_NUMBER: _ClassVar[int] + LOADED_TIME_FIELD_NUMBER: _ClassVar[int] + POLICY_FIELD_NUMBER: _ClassVar[int] + PROVENANCE_FIELD_NUMBER: _ClassVar[int] + version: int + policy_hash: str + status: PolicyStatus + load_error: str + created_time: _timestamp_pb2.Timestamp + loaded_time: _timestamp_pb2.Timestamp + policy: _sandbox_pb2.SandboxPolicy + provenance: _containers.ScalarMap[str, str] + def __init__(self, version: _Optional[int] = ..., policy_hash: _Optional[str] = ..., status: _Optional[_Union[PolicyStatus, str]] = ..., load_error: _Optional[str] = ..., created_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., loaded_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., policy: _Optional[_Union[_sandbox_pb2.SandboxPolicy, _Mapping]] = ..., provenance: _Optional[_Mapping[str, str]] = ...) -> None: ... + +class GetSandboxLogsRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "lines", "since_time", "sources", "min_level") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + LINES_FIELD_NUMBER: _ClassVar[int] + SINCE_TIME_FIELD_NUMBER: _ClassVar[int] + SOURCES_FIELD_NUMBER: _ClassVar[int] + MIN_LEVEL_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + lines: int + since_time: _timestamp_pb2.Timestamp + sources: _containers.RepeatedScalarFieldContainer[str] + min_level: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., lines: _Optional[int] = ..., since_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., sources: _Optional[_Iterable[str]] = ..., min_level: _Optional[str] = ...) -> None: ... + +class PushSandboxLogsRequest(_message.Message): + __slots__ = ("sandbox_id", "logs") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + LOGS_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + logs: _containers.RepeatedCompositeFieldContainer[SandboxLogLine] + def __init__(self, sandbox_id: _Optional[str] = ..., logs: _Optional[_Iterable[_Union[SandboxLogLine, _Mapping]]] = ...) -> None: ... + +class PushSandboxLogsResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GetSandboxLogsResponse(_message.Message): + __slots__ = ("logs", "buffer_total") + LOGS_FIELD_NUMBER: _ClassVar[int] + BUFFER_TOTAL_FIELD_NUMBER: _ClassVar[int] + logs: _containers.RepeatedCompositeFieldContainer[SandboxLogLine] + buffer_total: int + def __init__(self, logs: _Optional[_Iterable[_Union[SandboxLogLine, _Mapping]]] = ..., buffer_total: _Optional[int] = ...) -> None: ... + +class SupervisorMessage(_message.Message): + __slots__ = ("hello", "heartbeat", "relay_open_result", "relay_close", "config_update_result") + HELLO_FIELD_NUMBER: _ClassVar[int] + HEARTBEAT_FIELD_NUMBER: _ClassVar[int] + RELAY_OPEN_RESULT_FIELD_NUMBER: _ClassVar[int] + RELAY_CLOSE_FIELD_NUMBER: _ClassVar[int] + CONFIG_UPDATE_RESULT_FIELD_NUMBER: _ClassVar[int] + hello: SupervisorHello + heartbeat: SupervisorHeartbeat + relay_open_result: RelayOpenResult + relay_close: RelayClose + config_update_result: ConfigUpdateResult + def __init__(self, hello: _Optional[_Union[SupervisorHello, _Mapping]] = ..., heartbeat: _Optional[_Union[SupervisorHeartbeat, _Mapping]] = ..., relay_open_result: _Optional[_Union[RelayOpenResult, _Mapping]] = ..., relay_close: _Optional[_Union[RelayClose, _Mapping]] = ..., config_update_result: _Optional[_Union[ConfigUpdateResult, _Mapping]] = ...) -> None: ... + +class GatewayMessage(_message.Message): + __slots__ = ("session_accepted", "session_rejected", "heartbeat", "relay_open", "relay_close", "session_redirect", "config_update") + SESSION_ACCEPTED_FIELD_NUMBER: _ClassVar[int] + SESSION_REJECTED_FIELD_NUMBER: _ClassVar[int] + HEARTBEAT_FIELD_NUMBER: _ClassVar[int] + RELAY_OPEN_FIELD_NUMBER: _ClassVar[int] + RELAY_CLOSE_FIELD_NUMBER: _ClassVar[int] + SESSION_REDIRECT_FIELD_NUMBER: _ClassVar[int] + CONFIG_UPDATE_FIELD_NUMBER: _ClassVar[int] + session_accepted: SessionAccepted + session_rejected: SessionRejected + heartbeat: GatewayHeartbeat + relay_open: RelayOpen + relay_close: RelayClose + session_redirect: SessionRedirect + config_update: ConfigUpdate + def __init__(self, session_accepted: _Optional[_Union[SessionAccepted, _Mapping]] = ..., session_rejected: _Optional[_Union[SessionRejected, _Mapping]] = ..., heartbeat: _Optional[_Union[GatewayHeartbeat, _Mapping]] = ..., relay_open: _Optional[_Union[RelayOpen, _Mapping]] = ..., relay_close: _Optional[_Union[RelayClose, _Mapping]] = ..., session_redirect: _Optional[_Union[SessionRedirect, _Mapping]] = ..., config_update: _Optional[_Union[ConfigUpdate, _Mapping]] = ...) -> None: ... + +class SupervisorHello(_message.Message): + __slots__ = ("sandbox_id", "instance_id", "connection_epoch", "supports_provider_readiness", "redirected", "supports_session_redirect", "supports_config_push") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + CONNECTION_EPOCH_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_PROVIDER_READINESS_FIELD_NUMBER: _ClassVar[int] + REDIRECTED_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_SESSION_REDIRECT_FIELD_NUMBER: _ClassVar[int] + SUPPORTS_CONFIG_PUSH_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + instance_id: str + connection_epoch: int + supports_provider_readiness: bool + redirected: bool + supports_session_redirect: bool + supports_config_push: bool + def __init__(self, sandbox_id: _Optional[str] = ..., instance_id: _Optional[str] = ..., connection_epoch: _Optional[int] = ..., supports_provider_readiness: bool = ..., redirected: bool = ..., supports_session_redirect: bool = ..., supports_config_push: bool = ...) -> None: ... + +class SessionAccepted(_message.Message): + __slots__ = ("session_id", "bootstrap", "config_push_enabled", "heartbeat_interval") + SESSION_ID_FIELD_NUMBER: _ClassVar[int] + BOOTSTRAP_FIELD_NUMBER: _ClassVar[int] + CONFIG_PUSH_ENABLED_FIELD_NUMBER: _ClassVar[int] + HEARTBEAT_INTERVAL_FIELD_NUMBER: _ClassVar[int] + session_id: str + bootstrap: ConfigUpdate + config_push_enabled: bool + heartbeat_interval: _duration_pb2.Duration + def __init__(self, session_id: _Optional[str] = ..., bootstrap: _Optional[_Union[ConfigUpdate, _Mapping]] = ..., config_push_enabled: bool = ..., heartbeat_interval: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ...) -> None: ... + +class ConfigUpdate(_message.Message): + __slots__ = ("update_id", "sandbox_config", "provider_environment") + UPDATE_ID_FIELD_NUMBER: _ClassVar[int] + SANDBOX_CONFIG_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENVIRONMENT_FIELD_NUMBER: _ClassVar[int] + update_id: str + sandbox_config: _sandbox_pb2.SandboxConfigSnapshot + provider_environment: ProviderEnvironmentSnapshot + def __init__(self, update_id: _Optional[str] = ..., sandbox_config: _Optional[_Union[_sandbox_pb2.SandboxConfigSnapshot, _Mapping]] = ..., provider_environment: _Optional[_Union[ProviderEnvironmentSnapshot, _Mapping]] = ...) -> None: ... + +class ConfigApplyFailure(_message.Message): + __slots__ = ("code", "message", "retryable") + CODE_FIELD_NUMBER: _ClassVar[int] + MESSAGE_FIELD_NUMBER: _ClassVar[int] + RETRYABLE_FIELD_NUMBER: _ClassVar[int] + code: str + message: str + retryable: bool + def __init__(self, code: _Optional[str] = ..., message: _Optional[str] = ..., retryable: bool = ...) -> None: ... + +class ConfigUpdateResult(_message.Message): + __slots__ = ("update_id", "outcome", "failure", "admission", "policy_load") + UPDATE_ID_FIELD_NUMBER: _ClassVar[int] + OUTCOME_FIELD_NUMBER: _ClassVar[int] + FAILURE_FIELD_NUMBER: _ClassVar[int] + ADMISSION_FIELD_NUMBER: _ClassVar[int] + POLICY_LOAD_FIELD_NUMBER: _ClassVar[int] + update_id: str + outcome: ConfigApplyOutcome + failure: ConfigApplyFailure + admission: SandboxConfigurationAdmission + policy_load: PolicyLoadResult + def __init__(self, update_id: _Optional[str] = ..., outcome: _Optional[_Union[ConfigApplyOutcome, str]] = ..., failure: _Optional[_Union[ConfigApplyFailure, _Mapping]] = ..., admission: _Optional[_Union[SandboxConfigurationAdmission, _Mapping]] = ..., policy_load: _Optional[_Union[PolicyLoadResult, _Mapping]] = ...) -> None: ... + +class PolicyLoadResult(_message.Message): + __slots__ = ("version", "loaded", "error") + VERSION_FIELD_NUMBER: _ClassVar[int] + LOADED_FIELD_NUMBER: _ClassVar[int] + ERROR_FIELD_NUMBER: _ClassVar[int] + version: int + loaded: bool + error: str + def __init__(self, version: _Optional[int] = ..., loaded: bool = ..., error: _Optional[str] = ...) -> None: ... + +class SessionRejected(_message.Message): + __slots__ = ("reason",) + REASON_FIELD_NUMBER: _ClassVar[int] + reason: str + def __init__(self, reason: _Optional[str] = ...) -> None: ... + +class SessionRedirect(_message.Message): + __slots__ = ("peer_endpoint", "owner_replica_id") + PEER_ENDPOINT_FIELD_NUMBER: _ClassVar[int] + OWNER_REPLICA_ID_FIELD_NUMBER: _ClassVar[int] + peer_endpoint: str + owner_replica_id: str + def __init__(self, peer_endpoint: _Optional[str] = ..., owner_replica_id: _Optional[str] = ...) -> None: ... + +class SupervisorHeartbeat(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GatewayHeartbeat(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class ReportMainProcessExitRequest(_message.Message): + __slots__ = ("sandbox_id", "instance_id", "exit_code") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + EXIT_CODE_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + instance_id: str + exit_code: int + def __init__(self, sandbox_id: _Optional[str] = ..., instance_id: _Optional[str] = ..., exit_code: _Optional[int] = ...) -> None: ... + +class ReportMainProcessExitResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class FinalizeMainProcessExitRequest(_message.Message): + __slots__ = ("sandbox_id", "instance_id") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + instance_id: str + def __init__(self, sandbox_id: _Optional[str] = ..., instance_id: _Optional[str] = ...) -> None: ... + +class FinalizeMainProcessExitResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class RelayOpen(_message.Message): + __slots__ = ("channel_id", "ssh", "tcp", "service_id") + CHANNEL_ID_FIELD_NUMBER: _ClassVar[int] + SSH_FIELD_NUMBER: _ClassVar[int] + TCP_FIELD_NUMBER: _ClassVar[int] + SERVICE_ID_FIELD_NUMBER: _ClassVar[int] + channel_id: str + ssh: SshRelayTarget + tcp: TcpRelayTarget + service_id: str + def __init__(self, channel_id: _Optional[str] = ..., ssh: _Optional[_Union[SshRelayTarget, _Mapping]] = ..., tcp: _Optional[_Union[TcpRelayTarget, _Mapping]] = ..., service_id: _Optional[str] = ...) -> None: ... + +class SshRelayTarget(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class TcpRelayTarget(_message.Message): + __slots__ = ("host", "port") + HOST_FIELD_NUMBER: _ClassVar[int] + PORT_FIELD_NUMBER: _ClassVar[int] + host: str + port: int + def __init__(self, host: _Optional[str] = ..., port: _Optional[int] = ...) -> None: ... + +class RelayInit(_message.Message): + __slots__ = ("channel_id",) + CHANNEL_ID_FIELD_NUMBER: _ClassVar[int] + channel_id: str + def __init__(self, channel_id: _Optional[str] = ...) -> None: ... + +class RelayFrame(_message.Message): + __slots__ = ("init", "data") + INIT_FIELD_NUMBER: _ClassVar[int] + DATA_FIELD_NUMBER: _ClassVar[int] + init: RelayInit + data: bytes + def __init__(self, init: _Optional[_Union[RelayInit, _Mapping]] = ..., data: _Optional[bytes] = ...) -> None: ... + +class PeerRelayInit(_message.Message): + __slots__ = ("sandbox_id", "relay_open", "requester_replica_id") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + RELAY_OPEN_FIELD_NUMBER: _ClassVar[int] + REQUESTER_REPLICA_ID_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + relay_open: RelayOpen + requester_replica_id: str + def __init__(self, sandbox_id: _Optional[str] = ..., relay_open: _Optional[_Union[RelayOpen, _Mapping]] = ..., requester_replica_id: _Optional[str] = ...) -> None: ... + +class PeerRelayFrame(_message.Message): + __slots__ = ("init", "data") + INIT_FIELD_NUMBER: _ClassVar[int] + DATA_FIELD_NUMBER: _ClassVar[int] + init: PeerRelayInit + data: bytes + def __init__(self, init: _Optional[_Union[PeerRelayInit, _Mapping]] = ..., data: _Optional[bytes] = ...) -> None: ... + +class PeerConfigSandboxTarget(_message.Message): + __slots__ = ("sandbox_id", "session_id") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + SESSION_ID_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + session_id: str + def __init__(self, sandbox_id: _Optional[str] = ..., session_id: _Optional[str] = ...) -> None: ... + +class PeerConfigProviderTarget(_message.Message): + __slots__ = ("workspace", "name") + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + workspace: str + name: str + def __init__(self, workspace: _Optional[str] = ..., name: _Optional[str] = ...) -> None: ... + +class PeerNotifyConfigUpdateRequest(_message.Message): + __slots__ = ("sandbox", "workspace", "all_connected", "provider") + SANDBOX_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + ALL_CONNECTED_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + sandbox: PeerConfigSandboxTarget + workspace: str + all_connected: bool + provider: PeerConfigProviderTarget + def __init__(self, sandbox: _Optional[_Union[PeerConfigSandboxTarget, _Mapping]] = ..., workspace: _Optional[str] = ..., all_connected: bool = ..., provider: _Optional[_Union[PeerConfigProviderTarget, _Mapping]] = ...) -> None: ... + +class PeerNotifyConfigUpdateResponse(_message.Message): + __slots__ = ("stale_owner",) + STALE_OWNER_FIELD_NUMBER: _ClassVar[int] + stale_owner: bool + def __init__(self, stale_owner: bool = ...) -> None: ... + +class RelayOpenResult(_message.Message): + __slots__ = ("channel_id", "success", "error") + CHANNEL_ID_FIELD_NUMBER: _ClassVar[int] + SUCCESS_FIELD_NUMBER: _ClassVar[int] + ERROR_FIELD_NUMBER: _ClassVar[int] + channel_id: str + success: bool + error: str + def __init__(self, channel_id: _Optional[str] = ..., success: bool = ..., error: _Optional[str] = ...) -> None: ... + +class RelayClose(_message.Message): + __slots__ = ("channel_id", "reason") + CHANNEL_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + channel_id: str + reason: str + def __init__(self, channel_id: _Optional[str] = ..., reason: _Optional[str] = ...) -> None: ... + +class L7RequestSample(_message.Message): + __slots__ = ("method", "path", "decision", "count") + METHOD_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + DECISION_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + method: str + path: str + decision: str + count: int + def __init__(self, method: _Optional[str] = ..., path: _Optional[str] = ..., decision: _Optional[str] = ..., count: _Optional[int] = ...) -> None: ... + +class DenialSummary(_message.Message): + __slots__ = ("sandbox_id", "host", "port", "binary", "ancestors", "deny_reason", "first_seen_time", "last_seen_time", "count", "suppressed_count", "total_count", "sample_cmdlines", "binary_sha256", "persistent", "denial_stage", "l7_request_samples", "l7_inspection_active") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + HOST_FIELD_NUMBER: _ClassVar[int] + PORT_FIELD_NUMBER: _ClassVar[int] + BINARY_FIELD_NUMBER: _ClassVar[int] + ANCESTORS_FIELD_NUMBER: _ClassVar[int] + DENY_REASON_FIELD_NUMBER: _ClassVar[int] + FIRST_SEEN_TIME_FIELD_NUMBER: _ClassVar[int] + LAST_SEEN_TIME_FIELD_NUMBER: _ClassVar[int] + COUNT_FIELD_NUMBER: _ClassVar[int] + SUPPRESSED_COUNT_FIELD_NUMBER: _ClassVar[int] + TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] + SAMPLE_CMDLINES_FIELD_NUMBER: _ClassVar[int] + BINARY_SHA256_FIELD_NUMBER: _ClassVar[int] + PERSISTENT_FIELD_NUMBER: _ClassVar[int] + DENIAL_STAGE_FIELD_NUMBER: _ClassVar[int] + L7_REQUEST_SAMPLES_FIELD_NUMBER: _ClassVar[int] + L7_INSPECTION_ACTIVE_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + host: str + port: int + binary: str + ancestors: _containers.RepeatedScalarFieldContainer[str] + deny_reason: str + first_seen_time: _timestamp_pb2.Timestamp + last_seen_time: _timestamp_pb2.Timestamp + count: int + suppressed_count: int + total_count: int + sample_cmdlines: _containers.RepeatedScalarFieldContainer[str] + binary_sha256: str + persistent: bool + denial_stage: str + l7_request_samples: _containers.RepeatedCompositeFieldContainer[L7RequestSample] + l7_inspection_active: bool + def __init__(self, sandbox_id: _Optional[str] = ..., host: _Optional[str] = ..., port: _Optional[int] = ..., binary: _Optional[str] = ..., ancestors: _Optional[_Iterable[str]] = ..., deny_reason: _Optional[str] = ..., first_seen_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., last_seen_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., count: _Optional[int] = ..., suppressed_count: _Optional[int] = ..., total_count: _Optional[int] = ..., sample_cmdlines: _Optional[_Iterable[str]] = ..., binary_sha256: _Optional[str] = ..., persistent: bool = ..., denial_stage: _Optional[str] = ..., l7_request_samples: _Optional[_Iterable[_Union[L7RequestSample, _Mapping]]] = ..., l7_inspection_active: bool = ...) -> None: ... + +class DenialGroupCount(_message.Message): + __slots__ = ("deny_group", "denied_count") + DENY_GROUP_FIELD_NUMBER: _ClassVar[int] + DENIED_COUNT_FIELD_NUMBER: _ClassVar[int] + deny_group: str + denied_count: int + def __init__(self, deny_group: _Optional[str] = ..., denied_count: _Optional[int] = ...) -> None: ... + +class NetworkActivitySummary(_message.Message): + __slots__ = ("network_activity_count", "denied_action_count", "denials_by_group") + NETWORK_ACTIVITY_COUNT_FIELD_NUMBER: _ClassVar[int] + DENIED_ACTION_COUNT_FIELD_NUMBER: _ClassVar[int] + DENIALS_BY_GROUP_FIELD_NUMBER: _ClassVar[int] + network_activity_count: int + denied_action_count: int + denials_by_group: _containers.RepeatedCompositeFieldContainer[DenialGroupCount] + def __init__(self, network_activity_count: _Optional[int] = ..., denied_action_count: _Optional[int] = ..., denials_by_group: _Optional[_Iterable[_Union[DenialGroupCount, _Mapping]]] = ...) -> None: ... + +class PolicyChunk(_message.Message): + __slots__ = ("id", "status", "rule_name", "proposed_rule", "rationale", "security_notes", "confidence", "denial_summary_ids", "created_time", "decided_time", "stage", "supersedes_chunk_id", "hit_count", "first_seen_time", "last_seen_time", "binary", "validation_result", "rejection_reason", "application_error", "review_token", "current_effective_policy_hash", "candidate_effective_policy_hash", "current_effective_policy", "candidate_effective_policy") + ID_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + RULE_NAME_FIELD_NUMBER: _ClassVar[int] + PROPOSED_RULE_FIELD_NUMBER: _ClassVar[int] + RATIONALE_FIELD_NUMBER: _ClassVar[int] + SECURITY_NOTES_FIELD_NUMBER: _ClassVar[int] + CONFIDENCE_FIELD_NUMBER: _ClassVar[int] + DENIAL_SUMMARY_IDS_FIELD_NUMBER: _ClassVar[int] + CREATED_TIME_FIELD_NUMBER: _ClassVar[int] + DECIDED_TIME_FIELD_NUMBER: _ClassVar[int] + STAGE_FIELD_NUMBER: _ClassVar[int] + SUPERSEDES_CHUNK_ID_FIELD_NUMBER: _ClassVar[int] + HIT_COUNT_FIELD_NUMBER: _ClassVar[int] + FIRST_SEEN_TIME_FIELD_NUMBER: _ClassVar[int] + LAST_SEEN_TIME_FIELD_NUMBER: _ClassVar[int] + BINARY_FIELD_NUMBER: _ClassVar[int] + VALIDATION_RESULT_FIELD_NUMBER: _ClassVar[int] + REJECTION_REASON_FIELD_NUMBER: _ClassVar[int] + APPLICATION_ERROR_FIELD_NUMBER: _ClassVar[int] + REVIEW_TOKEN_FIELD_NUMBER: _ClassVar[int] + CURRENT_EFFECTIVE_POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + CANDIDATE_EFFECTIVE_POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + CURRENT_EFFECTIVE_POLICY_FIELD_NUMBER: _ClassVar[int] + CANDIDATE_EFFECTIVE_POLICY_FIELD_NUMBER: _ClassVar[int] + id: str + status: str + rule_name: str + proposed_rule: _sandbox_pb2.NetworkPolicyRule + rationale: str + security_notes: str + confidence: float + denial_summary_ids: _containers.RepeatedScalarFieldContainer[str] + created_time: _timestamp_pb2.Timestamp + decided_time: _timestamp_pb2.Timestamp + stage: str + supersedes_chunk_id: str + hit_count: int + first_seen_time: _timestamp_pb2.Timestamp + last_seen_time: _timestamp_pb2.Timestamp + binary: str + validation_result: str + rejection_reason: str + application_error: str + review_token: str + current_effective_policy_hash: str + candidate_effective_policy_hash: str + current_effective_policy: _sandbox_pb2.SandboxPolicy + candidate_effective_policy: _sandbox_pb2.SandboxPolicy + def __init__(self, id: _Optional[str] = ..., status: _Optional[str] = ..., rule_name: _Optional[str] = ..., proposed_rule: _Optional[_Union[_sandbox_pb2.NetworkPolicyRule, _Mapping]] = ..., rationale: _Optional[str] = ..., security_notes: _Optional[str] = ..., confidence: _Optional[float] = ..., denial_summary_ids: _Optional[_Iterable[str]] = ..., created_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., decided_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., stage: _Optional[str] = ..., supersedes_chunk_id: _Optional[str] = ..., hit_count: _Optional[int] = ..., first_seen_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., last_seen_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., binary: _Optional[str] = ..., validation_result: _Optional[str] = ..., rejection_reason: _Optional[str] = ..., application_error: _Optional[str] = ..., review_token: _Optional[str] = ..., current_effective_policy_hash: _Optional[str] = ..., candidate_effective_policy_hash: _Optional[str] = ..., current_effective_policy: _Optional[_Union[_sandbox_pb2.SandboxPolicy, _Mapping]] = ..., candidate_effective_policy: _Optional[_Union[_sandbox_pb2.SandboxPolicy, _Mapping]] = ...) -> None: ... + +class DraftPolicyUpdate(_message.Message): + __slots__ = ("draft_version", "new_chunks", "total_pending", "summary") + DRAFT_VERSION_FIELD_NUMBER: _ClassVar[int] + NEW_CHUNKS_FIELD_NUMBER: _ClassVar[int] + TOTAL_PENDING_FIELD_NUMBER: _ClassVar[int] + SUMMARY_FIELD_NUMBER: _ClassVar[int] + draft_version: int + new_chunks: int + total_pending: int + summary: str + def __init__(self, draft_version: _Optional[int] = ..., new_chunks: _Optional[int] = ..., total_pending: _Optional[int] = ..., summary: _Optional[str] = ...) -> None: ... + +class SubmitPolicyAnalysisRequest(_message.Message): + __slots__ = ("workspace_scope", "summaries", "proposed_chunks", "analysis_mode", "name", "network_activity_summaries") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SUMMARIES_FIELD_NUMBER: _ClassVar[int] + PROPOSED_CHUNKS_FIELD_NUMBER: _ClassVar[int] + ANALYSIS_MODE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + NETWORK_ACTIVITY_SUMMARIES_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + summaries: _containers.RepeatedCompositeFieldContainer[DenialSummary] + proposed_chunks: _containers.RepeatedCompositeFieldContainer[PolicyChunk] + analysis_mode: str + name: str + network_activity_summaries: _containers.RepeatedCompositeFieldContainer[NetworkActivitySummary] + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., summaries: _Optional[_Iterable[_Union[DenialSummary, _Mapping]]] = ..., proposed_chunks: _Optional[_Iterable[_Union[PolicyChunk, _Mapping]]] = ..., analysis_mode: _Optional[str] = ..., name: _Optional[str] = ..., network_activity_summaries: _Optional[_Iterable[_Union[NetworkActivitySummary, _Mapping]]] = ...) -> None: ... + +class SubmitPolicyAnalysisResponse(_message.Message): + __slots__ = ("accepted_chunks", "rejected_chunks", "rejection_reasons", "accepted_chunk_ids") + ACCEPTED_CHUNKS_FIELD_NUMBER: _ClassVar[int] + REJECTED_CHUNKS_FIELD_NUMBER: _ClassVar[int] + REJECTION_REASONS_FIELD_NUMBER: _ClassVar[int] + ACCEPTED_CHUNK_IDS_FIELD_NUMBER: _ClassVar[int] + accepted_chunks: int + rejected_chunks: int + rejection_reasons: _containers.RepeatedScalarFieldContainer[str] + accepted_chunk_ids: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, accepted_chunks: _Optional[int] = ..., rejected_chunks: _Optional[int] = ..., rejection_reasons: _Optional[_Iterable[str]] = ..., accepted_chunk_ids: _Optional[_Iterable[str]] = ...) -> None: ... + +class GetDraftPolicyRequest(_message.Message): + __slots__ = ("workspace_scope", "status_filter", "sandbox") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + STATUS_FILTER_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + status_filter: str + sandbox: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., status_filter: _Optional[str] = ..., sandbox: _Optional[str] = ...) -> None: ... + +class GetDraftPolicyResponse(_message.Message): + __slots__ = ("chunks", "rolling_summary", "draft_version", "last_analyzed_time") + CHUNKS_FIELD_NUMBER: _ClassVar[int] + ROLLING_SUMMARY_FIELD_NUMBER: _ClassVar[int] + DRAFT_VERSION_FIELD_NUMBER: _ClassVar[int] + LAST_ANALYZED_TIME_FIELD_NUMBER: _ClassVar[int] + chunks: _containers.RepeatedCompositeFieldContainer[PolicyChunk] + rolling_summary: str + draft_version: int + last_analyzed_time: _timestamp_pb2.Timestamp + def __init__(self, chunks: _Optional[_Iterable[_Union[PolicyChunk, _Mapping]]] = ..., rolling_summary: _Optional[str] = ..., draft_version: _Optional[int] = ..., last_analyzed_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class ApproveDraftChunkRequest(_message.Message): + __slots__ = ("workspace_scope", "chunk_id", "review_token", "sandbox", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + CHUNK_ID_FIELD_NUMBER: _ClassVar[int] + REVIEW_TOKEN_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + chunk_id: str + review_token: str + sandbox: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., chunk_id: _Optional[str] = ..., review_token: _Optional[str] = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class ApproveDraftChunkResponse(_message.Message): + __slots__ = ("policy_version", "policy_hash") + POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + policy_version: int + policy_hash: str + def __init__(self, policy_version: _Optional[int] = ..., policy_hash: _Optional[str] = ...) -> None: ... + +class RejectDraftChunkRequest(_message.Message): + __slots__ = ("workspace_scope", "chunk_id", "reason", "sandbox", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + CHUNK_ID_FIELD_NUMBER: _ClassVar[int] + REASON_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + chunk_id: str + reason: str + sandbox: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., chunk_id: _Optional[str] = ..., reason: _Optional[str] = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class RejectDraftChunkResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DraftChunkApproval(_message.Message): + __slots__ = ("chunk_id", "review_token") + CHUNK_ID_FIELD_NUMBER: _ClassVar[int] + REVIEW_TOKEN_FIELD_NUMBER: _ClassVar[int] + chunk_id: str + review_token: str + def __init__(self, chunk_id: _Optional[str] = ..., review_token: _Optional[str] = ...) -> None: ... + +class ApproveAllDraftChunksRequest(_message.Message): + __slots__ = ("workspace_scope", "include_security_flagged", "approvals", "sandbox", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + INCLUDE_SECURITY_FLAGGED_FIELD_NUMBER: _ClassVar[int] + APPROVALS_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + include_security_flagged: bool + approvals: _containers.RepeatedCompositeFieldContainer[DraftChunkApproval] + sandbox: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., include_security_flagged: bool = ..., approvals: _Optional[_Iterable[_Union[DraftChunkApproval, _Mapping]]] = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class ApproveAllDraftChunksResponse(_message.Message): + __slots__ = ("policy_version", "policy_hash", "chunks_approved", "chunks_skipped") + POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + CHUNKS_APPROVED_FIELD_NUMBER: _ClassVar[int] + CHUNKS_SKIPPED_FIELD_NUMBER: _ClassVar[int] + policy_version: int + policy_hash: str + chunks_approved: int + chunks_skipped: int + def __init__(self, policy_version: _Optional[int] = ..., policy_hash: _Optional[str] = ..., chunks_approved: _Optional[int] = ..., chunks_skipped: _Optional[int] = ...) -> None: ... + +class EditDraftChunkRequest(_message.Message): + __slots__ = ("workspace_scope", "chunk_id", "proposed_rule", "sandbox", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + CHUNK_ID_FIELD_NUMBER: _ClassVar[int] + PROPOSED_RULE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + chunk_id: str + proposed_rule: _sandbox_pb2.NetworkPolicyRule + sandbox: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., chunk_id: _Optional[str] = ..., proposed_rule: _Optional[_Union[_sandbox_pb2.NetworkPolicyRule, _Mapping]] = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class EditDraftChunkResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class UndoDraftChunkRequest(_message.Message): + __slots__ = ("workspace_scope", "chunk_id", "sandbox", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + CHUNK_ID_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + chunk_id: str + sandbox: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., chunk_id: _Optional[str] = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class UndoDraftChunkResponse(_message.Message): + __slots__ = ("policy_version", "policy_hash") + POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + policy_version: int + policy_hash: str + def __init__(self, policy_version: _Optional[int] = ..., policy_hash: _Optional[str] = ...) -> None: ... + +class ClearDraftChunksRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ..., request_id: _Optional[str] = ...) -> None: ... + +class ClearDraftChunksResponse(_message.Message): + __slots__ = ("chunks_cleared",) + CHUNKS_CLEARED_FIELD_NUMBER: _ClassVar[int] + chunks_cleared: int + def __init__(self, chunks_cleared: _Optional[int] = ...) -> None: ... + +class GetDraftHistoryRequest(_message.Message): + __slots__ = ("workspace_scope", "sandbox") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + SANDBOX_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + sandbox: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., sandbox: _Optional[str] = ...) -> None: ... + +class DraftHistoryEntry(_message.Message): + __slots__ = ("event_time", "event_type", "description", "chunk_id") + EVENT_TIME_FIELD_NUMBER: _ClassVar[int] + EVENT_TYPE_FIELD_NUMBER: _ClassVar[int] + DESCRIPTION_FIELD_NUMBER: _ClassVar[int] + CHUNK_ID_FIELD_NUMBER: _ClassVar[int] + event_time: _timestamp_pb2.Timestamp + event_type: str + description: str + chunk_id: str + def __init__(self, event_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., event_type: _Optional[str] = ..., description: _Optional[str] = ..., chunk_id: _Optional[str] = ...) -> None: ... + +class GetDraftHistoryResponse(_message.Message): + __slots__ = ("entries",) + ENTRIES_FIELD_NUMBER: _ClassVar[int] + entries: _containers.RepeatedCompositeFieldContainer[DraftHistoryEntry] + def __init__(self, entries: _Optional[_Iterable[_Union[DraftHistoryEntry, _Mapping]]] = ...) -> None: ... + +class CreateWorkspaceRequest(_message.Message): + __slots__ = ("name", "labels", "request_id") + class LabelsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: str + def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... + NAME_FIELD_NUMBER: _ClassVar[int] + LABELS_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + name: str + labels: _containers.ScalarMap[str, str] + request_id: str + def __init__(self, name: _Optional[str] = ..., labels: _Optional[_Mapping[str, str]] = ..., request_id: _Optional[str] = ...) -> None: ... + +class CreateWorkspaceResponse(_message.Message): + __slots__ = ("workspace",) + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + workspace: _datamodel_pb2.Workspace + def __init__(self, workspace: _Optional[_Union[_datamodel_pb2.Workspace, _Mapping]] = ...) -> None: ... + +class GetWorkspaceRequest(_message.Message): + __slots__ = ("name",) + NAME_FIELD_NUMBER: _ClassVar[int] + name: str + def __init__(self, name: _Optional[str] = ...) -> None: ... + +class GetWorkspaceResponse(_message.Message): + __slots__ = ("workspace",) + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + workspace: _datamodel_pb2.Workspace + def __init__(self, workspace: _Optional[_Union[_datamodel_pb2.Workspace, _Mapping]] = ...) -> None: ... + +class ListWorkspacesRequest(_message.Message): + __slots__ = ("page_size", "page_token", "label_selector") + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + LABEL_SELECTOR_FIELD_NUMBER: _ClassVar[int] + page_size: int + page_token: str + label_selector: str + def __init__(self, page_size: _Optional[int] = ..., page_token: _Optional[str] = ..., label_selector: _Optional[str] = ...) -> None: ... + +class ListWorkspacesResponse(_message.Message): + __slots__ = ("workspaces", "next_page_token") + WORKSPACES_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + workspaces: _containers.RepeatedCompositeFieldContainer[_datamodel_pb2.Workspace] + next_page_token: str + def __init__(self, workspaces: _Optional[_Iterable[_Union[_datamodel_pb2.Workspace, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class DeleteWorkspaceRequest(_message.Message): + __slots__ = ("name", "allow_missing", "request_id") + NAME_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + name: str + allow_missing: bool + request_id: str + def __init__(self, name: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class DeleteWorkspaceResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class WorkspaceMember(_message.Message): + __slots__ = ("metadata", "principal_subject", "role") + METADATA_FIELD_NUMBER: _ClassVar[int] + PRINCIPAL_SUBJECT_FIELD_NUMBER: _ClassVar[int] + ROLE_FIELD_NUMBER: _ClassVar[int] + metadata: _datamodel_pb2.ObjectMeta + principal_subject: str + role: WorkspaceRole + def __init__(self, metadata: _Optional[_Union[_datamodel_pb2.ObjectMeta, _Mapping]] = ..., principal_subject: _Optional[str] = ..., role: _Optional[_Union[WorkspaceRole, str]] = ...) -> None: ... + +class AddWorkspaceMemberRequest(_message.Message): + __slots__ = ("workspace_scope", "principal_subject", "role", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PRINCIPAL_SUBJECT_FIELD_NUMBER: _ClassVar[int] + ROLE_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + principal_subject: str + role: WorkspaceRole + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., principal_subject: _Optional[str] = ..., role: _Optional[_Union[WorkspaceRole, str]] = ..., request_id: _Optional[str] = ...) -> None: ... + +class AddWorkspaceMemberResponse(_message.Message): + __slots__ = ("member",) + MEMBER_FIELD_NUMBER: _ClassVar[int] + member: WorkspaceMember + def __init__(self, member: _Optional[_Union[WorkspaceMember, _Mapping]] = ...) -> None: ... + +class RemoveWorkspaceMemberRequest(_message.Message): + __slots__ = ("workspace_scope", "principal_subject", "allow_missing", "request_id") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PRINCIPAL_SUBJECT_FIELD_NUMBER: _ClassVar[int] + ALLOW_MISSING_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + principal_subject: str + allow_missing: bool + request_id: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., principal_subject: _Optional[str] = ..., allow_missing: bool = ..., request_id: _Optional[str] = ...) -> None: ... + +class RemoveWorkspaceMemberResponse(_message.Message): + __slots__ = ("outcome",) + OUTCOME_FIELD_NUMBER: _ClassVar[int] + outcome: DeletionOutcome + def __init__(self, outcome: _Optional[_Union[DeletionOutcome, str]] = ...) -> None: ... + +class ListWorkspaceMembersRequest(_message.Message): + __slots__ = ("workspace_scope", "page_size", "page_token") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + PAGE_SIZE_FIELD_NUMBER: _ClassVar[int] + PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + page_size: int + page_token: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., page_size: _Optional[int] = ..., page_token: _Optional[str] = ...) -> None: ... + +class ListWorkspaceMembersResponse(_message.Message): + __slots__ = ("members", "next_page_token") + MEMBERS_FIELD_NUMBER: _ClassVar[int] + NEXT_PAGE_TOKEN_FIELD_NUMBER: _ClassVar[int] + members: _containers.RepeatedCompositeFieldContainer[WorkspaceMember] + next_page_token: str + def __init__(self, members: _Optional[_Iterable[_Union[WorkspaceMember, _Mapping]]] = ..., next_page_token: _Optional[str] = ...) -> None: ... + +class ExtensionServiceCredential(_message.Message): + __slots__ = ("service_name", "token", "expiration_time") + SERVICE_NAME_FIELD_NUMBER: _ClassVar[int] + TOKEN_FIELD_NUMBER: _ClassVar[int] + EXPIRATION_TIME_FIELD_NUMBER: _ClassVar[int] + service_name: str + token: str + expiration_time: _timestamp_pb2.Timestamp + def __init__(self, service_name: _Optional[str] = ..., token: _Optional[str] = ..., expiration_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ...) -> None: ... + +class EndpointObservation(_message.Message): + __slots__ = ("endpoint_id", "result", "failure") + ENDPOINT_ID_FIELD_NUMBER: _ClassVar[int] + RESULT_FIELD_NUMBER: _ClassVar[int] + FAILURE_FIELD_NUMBER: _ClassVar[int] + endpoint_id: str + result: EndpointResult + failure: EndpointFailure + def __init__(self, endpoint_id: _Optional[str] = ..., result: _Optional[_Union[EndpointResult, str]] = ..., failure: _Optional[_Union[EndpointFailure, _Mapping]] = ...) -> None: ... + +class ReportEndpointStatusRequest(_message.Message): + __slots__ = ("sandbox_id", "policy_hash", "provider_env_revision", "observations", "observed_endpoint_ids", "supervisor_session_id", "report_sequence", "token_grant_status") + SANDBOX_ID_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + OBSERVATIONS_FIELD_NUMBER: _ClassVar[int] + OBSERVED_ENDPOINT_IDS_FIELD_NUMBER: _ClassVar[int] + SUPERVISOR_SESSION_ID_FIELD_NUMBER: _ClassVar[int] + REPORT_SEQUENCE_FIELD_NUMBER: _ClassVar[int] + TOKEN_GRANT_STATUS_FIELD_NUMBER: _ClassVar[int] + sandbox_id: str + policy_hash: str + provider_env_revision: int + observations: _containers.RepeatedCompositeFieldContainer[EndpointObservation] + observed_endpoint_ids: _containers.RepeatedScalarFieldContainer[str] + supervisor_session_id: str + report_sequence: int + token_grant_status: TokenGrantStatus + def __init__(self, sandbox_id: _Optional[str] = ..., policy_hash: _Optional[str] = ..., provider_env_revision: _Optional[int] = ..., observations: _Optional[_Iterable[_Union[EndpointObservation, _Mapping]]] = ..., observed_endpoint_ids: _Optional[_Iterable[str]] = ..., supervisor_session_id: _Optional[str] = ..., report_sequence: _Optional[int] = ..., token_grant_status: _Optional[_Union[TokenGrantStatus, _Mapping]] = ...) -> None: ... + +class TokenGrantStatus(_message.Message): + __slots__ = ("last_failure",) + LAST_FAILURE_FIELD_NUMBER: _ClassVar[int] + last_failure: TokenGrantFailureObservation + def __init__(self, last_failure: _Optional[_Union[TokenGrantFailureObservation, _Mapping]] = ...) -> None: ... + +class TokenGrantFailureObservation(_message.Message): + __slots__ = ("destination_host", "destination_port", "failure") + DESTINATION_HOST_FIELD_NUMBER: _ClassVar[int] + DESTINATION_PORT_FIELD_NUMBER: _ClassVar[int] + FAILURE_FIELD_NUMBER: _ClassVar[int] + destination_host: str + destination_port: int + failure: EndpointFailure + def __init__(self, destination_host: _Optional[str] = ..., destination_port: _Optional[int] = ..., failure: _Optional[_Union[EndpointFailure, _Mapping]] = ...) -> None: ... + +class ReportEndpointStatusResponse(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class EndpointStatus(_message.Message): + __slots__ = ("endpoint_id", "host", "ports", "path", "last_result", "last_reported_time", "last_failure") + ENDPOINT_ID_FIELD_NUMBER: _ClassVar[int] + HOST_FIELD_NUMBER: _ClassVar[int] + PORTS_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + LAST_RESULT_FIELD_NUMBER: _ClassVar[int] + LAST_REPORTED_TIME_FIELD_NUMBER: _ClassVar[int] + LAST_FAILURE_FIELD_NUMBER: _ClassVar[int] + endpoint_id: str + host: str + ports: _containers.RepeatedScalarFieldContainer[int] + path: str + last_result: EndpointResult + last_reported_time: _timestamp_pb2.Timestamp + last_failure: EndpointFailure + def __init__(self, endpoint_id: _Optional[str] = ..., host: _Optional[str] = ..., ports: _Optional[_Iterable[int]] = ..., path: _Optional[str] = ..., last_result: _Optional[_Union[EndpointResult, str]] = ..., last_reported_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., last_failure: _Optional[_Union[EndpointFailure, _Mapping]] = ...) -> None: ... + +class SandboxProvisioning(_message.Message): + __slots__ = ("attempt_id", "configuration_change_id", "configuration_change_time", "first_rejection_time", "deadline", "timeout_time", "cleanup_completed_time", "cleanup_error", "cleanup_retry_time", "attachment_change_id", "attachment_change_time", "preparation_deadline", "admission_start_time", "driver_operation_pending", "driver_operation_id") + ATTEMPT_ID_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_CHANGE_ID_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_CHANGE_TIME_FIELD_NUMBER: _ClassVar[int] + FIRST_REJECTION_TIME_FIELD_NUMBER: _ClassVar[int] + DEADLINE_FIELD_NUMBER: _ClassVar[int] + TIMEOUT_TIME_FIELD_NUMBER: _ClassVar[int] + CLEANUP_COMPLETED_TIME_FIELD_NUMBER: _ClassVar[int] + CLEANUP_ERROR_FIELD_NUMBER: _ClassVar[int] + CLEANUP_RETRY_TIME_FIELD_NUMBER: _ClassVar[int] + ATTACHMENT_CHANGE_ID_FIELD_NUMBER: _ClassVar[int] + ATTACHMENT_CHANGE_TIME_FIELD_NUMBER: _ClassVar[int] + PREPARATION_DEADLINE_FIELD_NUMBER: _ClassVar[int] + ADMISSION_START_TIME_FIELD_NUMBER: _ClassVar[int] + DRIVER_OPERATION_PENDING_FIELD_NUMBER: _ClassVar[int] + DRIVER_OPERATION_ID_FIELD_NUMBER: _ClassVar[int] + attempt_id: str + configuration_change_id: str + configuration_change_time: _timestamp_pb2.Timestamp + first_rejection_time: _timestamp_pb2.Timestamp + deadline: _timestamp_pb2.Timestamp + timeout_time: _timestamp_pb2.Timestamp + cleanup_completed_time: _timestamp_pb2.Timestamp + cleanup_error: str + cleanup_retry_time: _timestamp_pb2.Timestamp + attachment_change_id: str + attachment_change_time: _timestamp_pb2.Timestamp + preparation_deadline: _timestamp_pb2.Timestamp + admission_start_time: _timestamp_pb2.Timestamp + driver_operation_pending: bool + driver_operation_id: str + def __init__(self, attempt_id: _Optional[str] = ..., configuration_change_id: _Optional[str] = ..., configuration_change_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., first_rejection_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., deadline: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., timeout_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., cleanup_completed_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., cleanup_error: _Optional[str] = ..., cleanup_retry_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., attachment_change_id: _Optional[str] = ..., attachment_change_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., preparation_deadline: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., admission_start_time: _Optional[_Union[datetime.datetime, _timestamp_pb2.Timestamp, _Mapping]] = ..., driver_operation_pending: bool = ..., driver_operation_id: _Optional[str] = ...) -> None: ... + +class SandboxServiceExposure(_message.Message): + __slots__ = ("service", "target_port", "authorization_mode") + SERVICE_FIELD_NUMBER: _ClassVar[int] + TARGET_PORT_FIELD_NUMBER: _ClassVar[int] + AUTHORIZATION_MODE_FIELD_NUMBER: _ClassVar[int] + service: str + target_port: int + authorization_mode: ServiceAuthorizationMode + def __init__(self, service: _Optional[str] = ..., target_port: _Optional[int] = ..., authorization_mode: _Optional[_Union[ServiceAuthorizationMode, str]] = ...) -> None: ... + +class EndpointFailure(_message.Message): + __slots__ = ("domain", "code", "recovery_action", "provider", "credential_key", "stage", "upstream_http_status", "request_id") + DOMAIN_FIELD_NUMBER: _ClassVar[int] + CODE_FIELD_NUMBER: _ClassVar[int] + RECOVERY_ACTION_FIELD_NUMBER: _ClassVar[int] + PROVIDER_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_KEY_FIELD_NUMBER: _ClassVar[int] + STAGE_FIELD_NUMBER: _ClassVar[int] + UPSTREAM_HTTP_STATUS_FIELD_NUMBER: _ClassVar[int] + REQUEST_ID_FIELD_NUMBER: _ClassVar[int] + domain: EndpointFailureDomain + code: str + recovery_action: ProviderCredentialRefreshRecoveryAction + provider: str + credential_key: str + stage: str + upstream_http_status: int + request_id: str + def __init__(self, domain: _Optional[_Union[EndpointFailureDomain, str]] = ..., code: _Optional[str] = ..., recovery_action: _Optional[_Union[ProviderCredentialRefreshRecoveryAction, str]] = ..., provider: _Optional[str] = ..., credential_key: _Optional[str] = ..., stage: _Optional[str] = ..., upstream_http_status: _Optional[int] = ..., request_id: _Optional[str] = ...) -> None: ... diff --git a/src/openshell/_proto/openshell_pb2_grpc.py b/src/openshell/_proto/openshell_pb2_grpc.py new file mode 100644 index 0000000..51eee4a --- /dev/null +++ b/src/openshell/_proto/openshell_pb2_grpc.py @@ -0,0 +1,4014 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +from . import openshell_pb2 as openshell__pb2 +from . import sandbox_pb2 as sandbox__pb2 + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in openshell_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class OpenShellStub(object): + """OpenShell service provides sandbox, provider, and runtime management capabilities. + + Conventions: + - This file owns the public API resource model exposed to OpenShell clients. + - `Sandbox`, `SandboxSpec`, `SandboxStatus`, and `SandboxPhase` are gateway-owned + public types. Internal compute drivers must not import or return them directly. + - The gateway translates internal compute-driver observations into these public + resource messages before persisting or returning them to clients. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Health = channel.unary_unary( + '/openshell.v1.OpenShell/Health', + request_serializer=openshell__pb2.HealthRequest.SerializeToString, + response_deserializer=openshell__pb2.HealthResponse.FromString, + _registered_method=True) + self.GetCurrentUser = channel.unary_unary( + '/openshell.v1.OpenShell/GetCurrentUser', + request_serializer=openshell__pb2.GetCurrentUserRequest.SerializeToString, + response_deserializer=openshell__pb2.GetCurrentUserResponse.FromString, + _registered_method=True) + self.GetGatewayInfo = channel.unary_unary( + '/openshell.v1.OpenShell/GetGatewayInfo', + request_serializer=openshell__pb2.GetGatewayInfoRequest.SerializeToString, + response_deserializer=openshell__pb2.GetGatewayInfoResponse.FromString, + _registered_method=True) + self.CreateSandbox = channel.unary_unary( + '/openshell.v1.OpenShell/CreateSandbox', + request_serializer=openshell__pb2.CreateSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxResponse.FromString, + _registered_method=True) + self.BeginRootfsTarStaging = channel.unary_unary( + '/openshell.v1.OpenShell/BeginRootfsTarStaging', + request_serializer=openshell__pb2.BeginRootfsTarStagingRequest.SerializeToString, + response_deserializer=openshell__pb2.BeginRootfsTarStagingResponse.FromString, + _registered_method=True) + self.GetSandbox = channel.unary_unary( + '/openshell.v1.OpenShell/GetSandbox', + request_serializer=openshell__pb2.GetSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxResponse.FromString, + _registered_method=True) + self.ListSandboxes = channel.unary_unary( + '/openshell.v1.OpenShell/ListSandboxes', + request_serializer=openshell__pb2.ListSandboxesRequest.SerializeToString, + response_deserializer=openshell__pb2.ListSandboxesResponse.FromString, + _registered_method=True) + self.CreateSandboxTemplate = channel.unary_unary( + '/openshell.v1.OpenShell/CreateSandboxTemplate', + request_serializer=openshell__pb2.CreateSandboxTemplateRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxTemplateResponse.FromString, + _registered_method=True) + self.GetSandboxTemplate = channel.unary_unary( + '/openshell.v1.OpenShell/GetSandboxTemplate', + request_serializer=openshell__pb2.GetSandboxTemplateRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxTemplateResponse.FromString, + _registered_method=True) + self.ListSandboxTemplates = channel.unary_unary( + '/openshell.v1.OpenShell/ListSandboxTemplates', + request_serializer=openshell__pb2.ListSandboxTemplatesRequest.SerializeToString, + response_deserializer=openshell__pb2.ListSandboxTemplatesResponse.FromString, + _registered_method=True) + self.DeleteSandboxTemplate = channel.unary_unary( + '/openshell.v1.OpenShell/DeleteSandboxTemplate', + request_serializer=openshell__pb2.DeleteSandboxTemplateRequest.SerializeToString, + response_deserializer=openshell__pb2.DeleteSandboxTemplateResponse.FromString, + _registered_method=True) + self.ListSandboxProviders = channel.unary_unary( + '/openshell.v1.OpenShell/ListSandboxProviders', + request_serializer=openshell__pb2.ListSandboxProvidersRequest.SerializeToString, + response_deserializer=openshell__pb2.ListSandboxProvidersResponse.FromString, + _registered_method=True) + self.AttachSandboxProvider = channel.unary_unary( + '/openshell.v1.OpenShell/AttachSandboxProvider', + request_serializer=openshell__pb2.AttachSandboxProviderRequest.SerializeToString, + response_deserializer=openshell__pb2.AttachSandboxProviderResponse.FromString, + _registered_method=True) + self.DetachSandboxProvider = channel.unary_unary( + '/openshell.v1.OpenShell/DetachSandboxProvider', + request_serializer=openshell__pb2.DetachSandboxProviderRequest.SerializeToString, + response_deserializer=openshell__pb2.DetachSandboxProviderResponse.FromString, + _registered_method=True) + self.GetSandboxProviderStatus = channel.unary_unary( + '/openshell.v1.OpenShell/GetSandboxProviderStatus', + request_serializer=openshell__pb2.GetSandboxProviderStatusRequest.SerializeToString, + response_deserializer=openshell__pb2.GetSandboxProviderStatusResponse.FromString, + _registered_method=True) + self.DeleteSandbox = channel.unary_unary( + '/openshell.v1.OpenShell/DeleteSandbox', + request_serializer=openshell__pb2.DeleteSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.DeleteSandboxResponse.FromString, + _registered_method=True) + self.StopSandbox = channel.unary_unary( + '/openshell.v1.OpenShell/StopSandbox', + request_serializer=openshell__pb2.StopSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxResponse.FromString, + _registered_method=True) + self.StartSandbox = channel.unary_unary( + '/openshell.v1.OpenShell/StartSandbox', + request_serializer=openshell__pb2.StartSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxResponse.FromString, + _registered_method=True) + self.SuspendSandbox = channel.unary_unary( + '/openshell.v1.OpenShell/SuspendSandbox', + request_serializer=openshell__pb2.SuspendSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxResponse.FromString, + _registered_method=True) + self.ResumeSandbox = channel.unary_unary( + '/openshell.v1.OpenShell/ResumeSandbox', + request_serializer=openshell__pb2.ResumeSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxResponse.FromString, + _registered_method=True) + self.CreateSshSession = channel.unary_unary( + '/openshell.v1.OpenShell/CreateSshSession', + request_serializer=openshell__pb2.CreateSshSessionRequest.SerializeToString, + response_deserializer=openshell__pb2.CreateSshSessionResponse.FromString, + _registered_method=True) + self.ExposeService = channel.unary_unary( + '/openshell.v1.OpenShell/ExposeService', + request_serializer=openshell__pb2.ExposeServiceRequest.SerializeToString, + response_deserializer=openshell__pb2.ServiceEndpointResponse.FromString, + _registered_method=True) + self.GetService = channel.unary_unary( + '/openshell.v1.OpenShell/GetService', + request_serializer=openshell__pb2.GetServiceRequest.SerializeToString, + response_deserializer=openshell__pb2.ServiceEndpointResponse.FromString, + _registered_method=True) + self.ListServices = channel.unary_unary( + '/openshell.v1.OpenShell/ListServices', + request_serializer=openshell__pb2.ListServicesRequest.SerializeToString, + response_deserializer=openshell__pb2.ListServicesResponse.FromString, + _registered_method=True) + self.DeleteService = channel.unary_unary( + '/openshell.v1.OpenShell/DeleteService', + request_serializer=openshell__pb2.DeleteServiceRequest.SerializeToString, + response_deserializer=openshell__pb2.DeleteServiceResponse.FromString, + _registered_method=True) + self.RevokeSshSession = channel.unary_unary( + '/openshell.v1.OpenShell/RevokeSshSession', + request_serializer=openshell__pb2.RevokeSshSessionRequest.SerializeToString, + response_deserializer=openshell__pb2.RevokeSshSessionResponse.FromString, + _registered_method=True) + self.ExecSandbox = channel.unary_stream( + '/openshell.v1.OpenShell/ExecSandbox', + request_serializer=openshell__pb2.ExecSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.ExecSandboxEvent.FromString, + _registered_method=True) + self.ForwardTcp = channel.stream_stream( + '/openshell.v1.OpenShell/ForwardTcp', + request_serializer=openshell__pb2.TcpForwardFrame.SerializeToString, + response_deserializer=openshell__pb2.TcpForwardFrame.FromString, + _registered_method=True) + self.ExecSandboxInteractive = channel.stream_stream( + '/openshell.v1.OpenShell/ExecSandboxInteractive', + request_serializer=openshell__pb2.ExecSandboxInput.SerializeToString, + response_deserializer=openshell__pb2.ExecSandboxEvent.FromString, + _registered_method=True) + self.CreateProvider = channel.unary_unary( + '/openshell.v1.OpenShell/CreateProvider', + request_serializer=openshell__pb2.CreateProviderRequest.SerializeToString, + response_deserializer=openshell__pb2.ProviderResponse.FromString, + _registered_method=True) + self.GetProvider = channel.unary_unary( + '/openshell.v1.OpenShell/GetProvider', + request_serializer=openshell__pb2.GetProviderRequest.SerializeToString, + response_deserializer=openshell__pb2.ProviderResponse.FromString, + _registered_method=True) + self.GetProviderCredentials = channel.unary_unary( + '/openshell.v1.OpenShell/GetProviderCredentials', + request_serializer=openshell__pb2.GetProviderCredentialsRequest.SerializeToString, + response_deserializer=openshell__pb2.GetProviderCredentialsResponse.FromString, + _registered_method=True) + self.ListProviders = channel.unary_unary( + '/openshell.v1.OpenShell/ListProviders', + request_serializer=openshell__pb2.ListProvidersRequest.SerializeToString, + response_deserializer=openshell__pb2.ListProvidersResponse.FromString, + _registered_method=True) + self.ListProviderProfiles = channel.unary_unary( + '/openshell.v1.OpenShell/ListProviderProfiles', + request_serializer=openshell__pb2.ListProviderProfilesRequest.SerializeToString, + response_deserializer=openshell__pb2.ListProviderProfilesResponse.FromString, + _registered_method=True) + self.GetProviderProfile = channel.unary_unary( + '/openshell.v1.OpenShell/GetProviderProfile', + request_serializer=openshell__pb2.GetProviderProfileRequest.SerializeToString, + response_deserializer=openshell__pb2.ProviderProfileResponse.FromString, + _registered_method=True) + self.ImportProviderProfiles = channel.unary_unary( + '/openshell.v1.OpenShell/ImportProviderProfiles', + request_serializer=openshell__pb2.ImportProviderProfilesRequest.SerializeToString, + response_deserializer=openshell__pb2.ImportProviderProfilesResponse.FromString, + _registered_method=True) + self.UpdateProviderProfiles = channel.unary_unary( + '/openshell.v1.OpenShell/UpdateProviderProfiles', + request_serializer=openshell__pb2.UpdateProviderProfilesRequest.SerializeToString, + response_deserializer=openshell__pb2.UpdateProviderProfilesResponse.FromString, + _registered_method=True) + self.LintProviderProfiles = channel.unary_unary( + '/openshell.v1.OpenShell/LintProviderProfiles', + request_serializer=openshell__pb2.LintProviderProfilesRequest.SerializeToString, + response_deserializer=openshell__pb2.LintProviderProfilesResponse.FromString, + _registered_method=True) + self.UpdateProvider = channel.unary_unary( + '/openshell.v1.OpenShell/UpdateProvider', + request_serializer=openshell__pb2.UpdateProviderRequest.SerializeToString, + response_deserializer=openshell__pb2.ProviderResponse.FromString, + _registered_method=True) + self.GetProviderRefreshStatus = channel.unary_unary( + '/openshell.v1.OpenShell/GetProviderRefreshStatus', + request_serializer=openshell__pb2.GetProviderRefreshStatusRequest.SerializeToString, + response_deserializer=openshell__pb2.GetProviderRefreshStatusResponse.FromString, + _registered_method=True) + self.ConfigureProviderRefresh = channel.unary_unary( + '/openshell.v1.OpenShell/ConfigureProviderRefresh', + request_serializer=openshell__pb2.ConfigureProviderRefreshRequest.SerializeToString, + response_deserializer=openshell__pb2.ConfigureProviderRefreshResponse.FromString, + _registered_method=True) + self.RotateProviderCredential = channel.unary_unary( + '/openshell.v1.OpenShell/RotateProviderCredential', + request_serializer=openshell__pb2.RotateProviderCredentialRequest.SerializeToString, + response_deserializer=openshell__pb2.RotateProviderCredentialResponse.FromString, + _registered_method=True) + self.DeleteProviderRefresh = channel.unary_unary( + '/openshell.v1.OpenShell/DeleteProviderRefresh', + request_serializer=openshell__pb2.DeleteProviderRefreshRequest.SerializeToString, + response_deserializer=openshell__pb2.DeleteProviderRefreshResponse.FromString, + _registered_method=True) + self.DeleteProvider = channel.unary_unary( + '/openshell.v1.OpenShell/DeleteProvider', + request_serializer=openshell__pb2.DeleteProviderRequest.SerializeToString, + response_deserializer=openshell__pb2.DeleteProviderResponse.FromString, + _registered_method=True) + self.DeleteProviderProfile = channel.unary_unary( + '/openshell.v1.OpenShell/DeleteProviderProfile', + request_serializer=openshell__pb2.DeleteProviderProfileRequest.SerializeToString, + response_deserializer=openshell__pb2.DeleteProviderProfileResponse.FromString, + _registered_method=True) + self.GetSandboxConfig = channel.unary_unary( + '/openshell.v1.OpenShell/GetSandboxConfig', + request_serializer=sandbox__pb2.GetSandboxConfigRequest.SerializeToString, + response_deserializer=sandbox__pb2.GetSandboxConfigResponse.FromString, + _registered_method=True) + self.GetGatewayConfig = channel.unary_unary( + '/openshell.v1.OpenShell/GetGatewayConfig', + request_serializer=sandbox__pb2.GetGatewayConfigRequest.SerializeToString, + response_deserializer=sandbox__pb2.GetGatewayConfigResponse.FromString, + _registered_method=True) + self.UpdateConfig = channel.unary_unary( + '/openshell.v1.OpenShell/UpdateConfig', + request_serializer=openshell__pb2.UpdateConfigRequest.SerializeToString, + response_deserializer=openshell__pb2.UpdateConfigResponse.FromString, + _registered_method=True) + self.GetSandboxPolicyStatus = channel.unary_unary( + '/openshell.v1.OpenShell/GetSandboxPolicyStatus', + request_serializer=openshell__pb2.GetSandboxPolicyStatusRequest.SerializeToString, + response_deserializer=openshell__pb2.GetSandboxPolicyStatusResponse.FromString, + _registered_method=True) + self.ListSandboxPolicies = channel.unary_unary( + '/openshell.v1.OpenShell/ListSandboxPolicies', + request_serializer=openshell__pb2.ListSandboxPoliciesRequest.SerializeToString, + response_deserializer=openshell__pb2.ListSandboxPoliciesResponse.FromString, + _registered_method=True) + self.ReportPolicyStatus = channel.unary_unary( + '/openshell.v1.OpenShell/ReportPolicyStatus', + request_serializer=openshell__pb2.ReportPolicyStatusRequest.SerializeToString, + response_deserializer=openshell__pb2.ReportPolicyStatusResponse.FromString, + _registered_method=True) + self.ReportEndpointStatus = channel.unary_unary( + '/openshell.v1.OpenShell/ReportEndpointStatus', + request_serializer=openshell__pb2.ReportEndpointStatusRequest.SerializeToString, + response_deserializer=openshell__pb2.ReportEndpointStatusResponse.FromString, + _registered_method=True) + self.ReportProviderReadiness = channel.unary_unary( + '/openshell.v1.OpenShell/ReportProviderReadiness', + request_serializer=openshell__pb2.ReportProviderReadinessRequest.SerializeToString, + response_deserializer=openshell__pb2.ReportProviderReadinessResponse.FromString, + _registered_method=True) + self.ReportSandboxConfiguration = channel.unary_unary( + '/openshell.v1.OpenShell/ReportSandboxConfiguration', + request_serializer=openshell__pb2.ReportSandboxConfigurationRequest.SerializeToString, + response_deserializer=openshell__pb2.ReportSandboxConfigurationResponse.FromString, + _registered_method=True) + self.GetSandboxProviderEnvironment = channel.unary_unary( + '/openshell.v1.OpenShell/GetSandboxProviderEnvironment', + request_serializer=openshell__pb2.GetSandboxProviderEnvironmentRequest.SerializeToString, + response_deserializer=openshell__pb2.GetSandboxProviderEnvironmentResponse.FromString, + _registered_method=True) + self.ExchangeProviderSubjectToken = channel.unary_unary( + '/openshell.v1.OpenShell/ExchangeProviderSubjectToken', + request_serializer=openshell__pb2.ExchangeProviderSubjectTokenRequest.SerializeToString, + response_deserializer=openshell__pb2.ExchangeProviderSubjectTokenResponse.FromString, + _registered_method=True) + self.GetSandboxLogs = channel.unary_unary( + '/openshell.v1.OpenShell/GetSandboxLogs', + request_serializer=openshell__pb2.GetSandboxLogsRequest.SerializeToString, + response_deserializer=openshell__pb2.GetSandboxLogsResponse.FromString, + _registered_method=True) + self.PushSandboxLogs = channel.stream_unary( + '/openshell.v1.OpenShell/PushSandboxLogs', + request_serializer=openshell__pb2.PushSandboxLogsRequest.SerializeToString, + response_deserializer=openshell__pb2.PushSandboxLogsResponse.FromString, + _registered_method=True) + self.ConnectSupervisor = channel.stream_stream( + '/openshell.v1.OpenShell/ConnectSupervisor', + request_serializer=openshell__pb2.SupervisorMessage.SerializeToString, + response_deserializer=openshell__pb2.GatewayMessage.FromString, + _registered_method=True) + self.ReportMainProcessExit = channel.unary_unary( + '/openshell.v1.OpenShell/ReportMainProcessExit', + request_serializer=openshell__pb2.ReportMainProcessExitRequest.SerializeToString, + response_deserializer=openshell__pb2.ReportMainProcessExitResponse.FromString, + _registered_method=True) + self.FinalizeMainProcessExit = channel.unary_unary( + '/openshell.v1.OpenShell/FinalizeMainProcessExit', + request_serializer=openshell__pb2.FinalizeMainProcessExitRequest.SerializeToString, + response_deserializer=openshell__pb2.FinalizeMainProcessExitResponse.FromString, + _registered_method=True) + self.RelayStream = channel.stream_stream( + '/openshell.v1.OpenShell/RelayStream', + request_serializer=openshell__pb2.RelayFrame.SerializeToString, + response_deserializer=openshell__pb2.RelayFrame.FromString, + _registered_method=True) + self.PeerRelay = channel.stream_stream( + '/openshell.v1.OpenShell/PeerRelay', + request_serializer=openshell__pb2.PeerRelayFrame.SerializeToString, + response_deserializer=openshell__pb2.PeerRelayFrame.FromString, + _registered_method=True) + self.PeerReportProviderReadiness = channel.unary_unary( + '/openshell.v1.OpenShell/PeerReportProviderReadiness', + request_serializer=openshell__pb2.ReportProviderReadinessRequest.SerializeToString, + response_deserializer=openshell__pb2.ReportProviderReadinessResponse.FromString, + _registered_method=True) + self.PeerReportEndpointStatus = channel.unary_unary( + '/openshell.v1.OpenShell/PeerReportEndpointStatus', + request_serializer=openshell__pb2.ReportEndpointStatusRequest.SerializeToString, + response_deserializer=openshell__pb2.ReportEndpointStatusResponse.FromString, + _registered_method=True) + self.PeerGetSandboxProviderStatus = channel.unary_unary( + '/openshell.v1.OpenShell/PeerGetSandboxProviderStatus', + request_serializer=openshell__pb2.GetSandboxProviderStatusRequest.SerializeToString, + response_deserializer=openshell__pb2.GetSandboxProviderStatusResponse.FromString, + _registered_method=True) + self.PeerNotifyConfigUpdate = channel.unary_unary( + '/openshell.v1.OpenShell/PeerNotifyConfigUpdate', + request_serializer=openshell__pb2.PeerNotifyConfigUpdateRequest.SerializeToString, + response_deserializer=openshell__pb2.PeerNotifyConfigUpdateResponse.FromString, + _registered_method=True) + self.WatchSandbox = channel.unary_stream( + '/openshell.v1.OpenShell/WatchSandbox', + request_serializer=openshell__pb2.WatchSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxStreamEvent.FromString, + _registered_method=True) + self.SubmitPolicyAnalysis = channel.unary_unary( + '/openshell.v1.OpenShell/SubmitPolicyAnalysis', + request_serializer=openshell__pb2.SubmitPolicyAnalysisRequest.SerializeToString, + response_deserializer=openshell__pb2.SubmitPolicyAnalysisResponse.FromString, + _registered_method=True) + self.GetDraftPolicy = channel.unary_unary( + '/openshell.v1.OpenShell/GetDraftPolicy', + request_serializer=openshell__pb2.GetDraftPolicyRequest.SerializeToString, + response_deserializer=openshell__pb2.GetDraftPolicyResponse.FromString, + _registered_method=True) + self.ApproveDraftChunk = channel.unary_unary( + '/openshell.v1.OpenShell/ApproveDraftChunk', + request_serializer=openshell__pb2.ApproveDraftChunkRequest.SerializeToString, + response_deserializer=openshell__pb2.ApproveDraftChunkResponse.FromString, + _registered_method=True) + self.RejectDraftChunk = channel.unary_unary( + '/openshell.v1.OpenShell/RejectDraftChunk', + request_serializer=openshell__pb2.RejectDraftChunkRequest.SerializeToString, + response_deserializer=openshell__pb2.RejectDraftChunkResponse.FromString, + _registered_method=True) + self.ApproveAllDraftChunks = channel.unary_unary( + '/openshell.v1.OpenShell/ApproveAllDraftChunks', + request_serializer=openshell__pb2.ApproveAllDraftChunksRequest.SerializeToString, + response_deserializer=openshell__pb2.ApproveAllDraftChunksResponse.FromString, + _registered_method=True) + self.EditDraftChunk = channel.unary_unary( + '/openshell.v1.OpenShell/EditDraftChunk', + request_serializer=openshell__pb2.EditDraftChunkRequest.SerializeToString, + response_deserializer=openshell__pb2.EditDraftChunkResponse.FromString, + _registered_method=True) + self.UndoDraftChunk = channel.unary_unary( + '/openshell.v1.OpenShell/UndoDraftChunk', + request_serializer=openshell__pb2.UndoDraftChunkRequest.SerializeToString, + response_deserializer=openshell__pb2.UndoDraftChunkResponse.FromString, + _registered_method=True) + self.ClearDraftChunks = channel.unary_unary( + '/openshell.v1.OpenShell/ClearDraftChunks', + request_serializer=openshell__pb2.ClearDraftChunksRequest.SerializeToString, + response_deserializer=openshell__pb2.ClearDraftChunksResponse.FromString, + _registered_method=True) + self.GetDraftHistory = channel.unary_unary( + '/openshell.v1.OpenShell/GetDraftHistory', + request_serializer=openshell__pb2.GetDraftHistoryRequest.SerializeToString, + response_deserializer=openshell__pb2.GetDraftHistoryResponse.FromString, + _registered_method=True) + self.IssueSandboxToken = channel.unary_unary( + '/openshell.v1.OpenShell/IssueSandboxToken', + request_serializer=openshell__pb2.IssueSandboxTokenRequest.SerializeToString, + response_deserializer=openshell__pb2.IssueSandboxTokenResponse.FromString, + _registered_method=True) + self.RefreshSandboxToken = channel.unary_unary( + '/openshell.v1.OpenShell/RefreshSandboxToken', + request_serializer=openshell__pb2.RefreshSandboxTokenRequest.SerializeToString, + response_deserializer=openshell__pb2.RefreshSandboxTokenResponse.FromString, + _registered_method=True) + self.CreateWorkspace = channel.unary_unary( + '/openshell.v1.OpenShell/CreateWorkspace', + request_serializer=openshell__pb2.CreateWorkspaceRequest.SerializeToString, + response_deserializer=openshell__pb2.CreateWorkspaceResponse.FromString, + _registered_method=True) + self.GetWorkspace = channel.unary_unary( + '/openshell.v1.OpenShell/GetWorkspace', + request_serializer=openshell__pb2.GetWorkspaceRequest.SerializeToString, + response_deserializer=openshell__pb2.GetWorkspaceResponse.FromString, + _registered_method=True) + self.ListWorkspaces = channel.unary_unary( + '/openshell.v1.OpenShell/ListWorkspaces', + request_serializer=openshell__pb2.ListWorkspacesRequest.SerializeToString, + response_deserializer=openshell__pb2.ListWorkspacesResponse.FromString, + _registered_method=True) + self.DeleteWorkspace = channel.unary_unary( + '/openshell.v1.OpenShell/DeleteWorkspace', + request_serializer=openshell__pb2.DeleteWorkspaceRequest.SerializeToString, + response_deserializer=openshell__pb2.DeleteWorkspaceResponse.FromString, + _registered_method=True) + self.AddWorkspaceMember = channel.unary_unary( + '/openshell.v1.OpenShell/AddWorkspaceMember', + request_serializer=openshell__pb2.AddWorkspaceMemberRequest.SerializeToString, + response_deserializer=openshell__pb2.AddWorkspaceMemberResponse.FromString, + _registered_method=True) + self.RemoveWorkspaceMember = channel.unary_unary( + '/openshell.v1.OpenShell/RemoveWorkspaceMember', + request_serializer=openshell__pb2.RemoveWorkspaceMemberRequest.SerializeToString, + response_deserializer=openshell__pb2.RemoveWorkspaceMemberResponse.FromString, + _registered_method=True) + self.ListWorkspaceMembers = channel.unary_unary( + '/openshell.v1.OpenShell/ListWorkspaceMembers', + request_serializer=openshell__pb2.ListWorkspaceMembersRequest.SerializeToString, + response_deserializer=openshell__pb2.ListWorkspaceMembersResponse.FromString, + _registered_method=True) + + +class OpenShellServicer(object): + """OpenShell service provides sandbox, provider, and runtime management capabilities. + + Conventions: + - This file owns the public API resource model exposed to OpenShell clients. + - `Sandbox`, `SandboxSpec`, `SandboxStatus`, and `SandboxPhase` are gateway-owned + public types. Internal compute drivers must not import or return them directly. + - The gateway translates internal compute-driver observations into these public + resource messages before persisting or returning them to clients. + """ + + def Health(self, request, context): + """Check the health of the service. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetCurrentUser(self, request, context): + """Return the authenticated caller identity established by the gateway. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetGatewayInfo(self, request, context): + """Fetch elevated live gateway runtime metadata. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CreateSandbox(self, request, context): + """Create a new sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def BeginRootfsTarStaging(self, request, context): + """Allocate a gateway-owned staging slot for a local rootfs tar archive. + + The gateway creates a request-scoped directory inside the compute driver's + staging root and returns an opaque single-use token plus the absolute path + the client must write the archive to. The token is then passed as + `template.driver_config..rootfs_tar_staging_token` on + CreateSandbox; callers never name a filesystem path themselves. Only a + client sharing the gateway's filesystem can complete the upload. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSandbox(self, request, context): + """Fetch a sandbox by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListSandboxes(self, request, context): + """List sandboxes. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CreateSandboxTemplate(self, request, context): + """Create a reusable sandbox workload template. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSandboxTemplate(self, request, context): + """Fetch a reusable sandbox workload template by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListSandboxTemplates(self, request, context): + """List reusable sandbox workload templates. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteSandboxTemplate(self, request, context): + """Delete a reusable sandbox workload template by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListSandboxProviders(self, request, context): + """List provider records attached to a sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AttachSandboxProvider(self, request, context): + """Attach a provider record to an existing sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DetachSandboxProvider(self, request, context): + """Detach a provider record from an existing sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSandboxProviderStatus(self, request, context): + """Inspect the installed authority for one sandbox provider mutation. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteSandbox(self, request, context): + """Delete a sandbox by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StopSandbox(self, request, context): + """Stop a sandbox while retaining its persistent state. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def StartSandbox(self, request, context): + """Start a previously stopped sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SuspendSandbox(self, request, context): + """Freeze a ready sandbox and retain its memory state for a later resume. + Requires a compute driver and isolation backend that support state + retention. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ResumeSandbox(self, request, context): + """Restore a suspended sandbox in a new runtime generation. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CreateSshSession(self, request, context): + """Create a short-lived SSH session for a sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExposeService(self, request, context): + """Create or update a sandbox HTTP service endpoint for local routing. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetService(self, request, context): + """Fetch one sandbox HTTP service endpoint. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListServices(self, request, context): + """List sandbox HTTP service endpoints. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteService(self, request, context): + """Delete one sandbox HTTP service endpoint. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RevokeSshSession(self, request, context): + """Revoke a previously issued SSH session. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExecSandbox(self, request, context): + """Execute a command in a ready sandbox and stream output. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ForwardTcp(self, request_iterator, context): + """Forward one CLI-side TCP connection to a loopback TCP target in a sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExecSandboxInteractive(self, request_iterator, context): + """Execute an interactive command with bidirectional stdin/stdout streaming. + The first client message MUST carry an ExecSandboxInput with the start + variant. Subsequent messages carry stdin bytes or window resize events. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CreateProvider(self, request, context): + """Create a provider. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetProvider(self, request, context): + """Fetch a provider by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetProviderCredentials(self, request, context): + """Export selected usable runtime credentials. Only directly authenticated + mTLS operators may call this method; refresh material is never returned. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListProviders(self, request, context): + """List providers. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListProviderProfiles(self, request, context): + """List available provider type profiles. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetProviderProfile(self, request, context): + """Fetch one provider type profile by id. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ImportProviderProfiles(self, request, context): + """Import custom provider type profiles. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UpdateProviderProfiles(self, request, context): + """Update an existing custom provider type profile. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def LintProviderProfiles(self, request, context): + """Validate provider type profiles without registering them. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UpdateProvider(self, request, context): + """Update an existing provider by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetProviderRefreshStatus(self, request, context): + """Fetch refresh status for one provider or provider credential. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ConfigureProviderRefresh(self, request, context): + """Configure gateway-owned refresh material for one provider credential. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RotateProviderCredential(self, request, context): + """Record a gateway-owned refresh request for one provider credential. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteProviderRefresh(self, request, context): + """Delete gateway-owned refresh configuration for one provider credential. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteProvider(self, request, context): + """Delete a provider by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteProviderProfile(self, request, context): + """Delete a custom provider type profile by id. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSandboxConfig(self, request, context): + """Get sandbox settings by id (called by users, and by supervisors at startup + and in their poll loop). A supervisor whose session pushes configuration + receives later updates over ConnectSupervisor and stops polling. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetGatewayConfig(self, request, context): + """Get gateway-global settings (read-only runtime configuration; any + authenticated user may read these without requiring Platform Admin). + + Scope-only (no role): scopes are granted by the IdP at token issuance, + orthogonal to workspace membership. Deployments that enable scope + enforcement configure the IdP to grant config:read (or openshell:all) + to all sandbox users, so this does not block least-privilege flows. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UpdateConfig(self, request, context): + """Update settings or policy at sandbox or global scope. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSandboxPolicyStatus(self, request, context): + """Get the load status of a specific policy version. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListSandboxPolicies(self, request, context): + """List policy history for a sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ReportPolicyStatus(self, request, context): + """Report policy load result (called by sandbox after reload attempt). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ReportEndpointStatus(self, request, context): + """Replace the gateway's observed tool server endpoint status for one sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ReportProviderReadiness(self, request, context): + """Report installed provider state for the current ConnectSupervisor session. + Replacing or losing that session invalidates its observations. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ReportSandboxConfiguration(self, request, context): + """Register startup and acknowledge an exact validated runtime configuration. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSandboxProviderEnvironment(self, request, context): + """Get provider environment for a sandbox (called by the sandbox supervisor at + startup and by its poll loop). Polling projection of the provider + environment delivered over ConnectSupervisor; removed with the polling RPCs. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ExchangeProviderSubjectToken(self, request, context): + """Exchange a stored provider subject token for an intermediate token scoped + to the calling supervisor's SPIFFE identity. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSandboxLogs(self, request, context): + """Fetch recent sandbox logs (one-shot). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PushSandboxLogs(self, request_iterator, context): + """Push sandbox supervisor logs to the server (client-streaming). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ConnectSupervisor(self, request_iterator, context): + """Persistent supervisor-to-gateway session (bidirectional streaming). + + The supervisor opens this stream at startup and keeps it alive for the + sandbox lifetime. The gateway uses it to coordinate relay channels for + SSH connect, ExecSandbox, targetable sandbox services, and configuration + delivery. Supervisors advertise optional stream features in + SupervisorHello, and the gateway sends only payloads the supervisor + advertises. Raw service bytes flow over RelayStream calls (separate HTTP/2 + streams on the same connection), not over this stream. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ReportMainProcessExit(self, request, context): + """Persist the canonical main process result before the supervisor exits. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def FinalizeMainProcessExit(self, request, context): + """Confirm that foreground terminal delivery completed naturally. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RelayStream(self, request_iterator, context): + """Raw byte relay between supervisor and gateway. + + The supervisor initiates this call after receiving a RelayOpen message + on its ConnectSupervisor stream. The first RelayFrame carries a + RelayInit with the channel_id to associate the new HTTP/2 stream with + the pending relay slot on the gateway. Subsequent frames carry raw bytes in either + direction between the gateway-side waiter (ForwardTcp / exec handler) + and the supervisor-side target bridge. + + This rides the same TCP+TLS+HTTP/2 connection as ConnectSupervisor — + no new TLS handshake, no reverse HTTP CONNECT. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PeerRelay(self, request_iterator, context): + """Internal gateway-to-gateway relay forwarding. + + A gateway replica that receives a user request for a sandbox whose + supervisor session is owned by a different replica opens this stream to the + owner. The first frame carries PeerRelayInit; subsequent frames carry raw + bytes in either direction. This RPC is authenticated as a gateway peer, not + as a user or sandbox supervisor. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PeerReportProviderReadiness(self, request, context): + """Internal gateway-to-owner forwarding for supervisor-bound state. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PeerReportEndpointStatus(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PeerGetSandboxProviderStatus(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def PeerNotifyConfigUpdate(self, request, context): + """Best-effort notification to the replica that owns a supervisor session. + The receiver rebuilds snapshots from authoritative state. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def WatchSandbox(self, request, context): + """Watch a sandbox and stream updates. + + This stream can include: + - Sandbox status snapshots (phase/status) + - OpenShell server process logs correlated by sandbox_id + - Platform events correlated to the sandbox + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SubmitPolicyAnalysis(self, request, context): + """--------------------------------------------------------------------------- + Draft policy recommendation RPCs + --------------------------------------------------------------------------- + + Submit denial analysis results from sandbox (summaries + proposed chunks). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetDraftPolicy(self, request, context): + """Get draft policy recommendations for a sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ApproveDraftChunk(self, request, context): + """Approve a single draft policy chunk (merges into active policy). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RejectDraftChunk(self, request, context): + """Reject a single draft policy chunk. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ApproveAllDraftChunks(self, request, context): + """Approve all pending draft chunks (skips security-flagged unless forced). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def EditDraftChunk(self, request, context): + """Edit a pending draft chunk in-place (e.g. narrow allowed_ips). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UndoDraftChunk(self, request, context): + """Reverse an approval (remove merged rule from active policy). + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ClearDraftChunks(self, request, context): + """Clear all pending draft chunks for a sandbox. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetDraftHistory(self, request, context): + """Get decision history for a sandbox's draft policy. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def IssueSandboxToken(self, request, context): + """Exchange a sandbox-bootstrap credential (e.g. a Kubernetes projected + ServiceAccount token) for a gateway-minted JWT bound to the calling + sandbox's UUID. Used by the Kubernetes driver path; singleplayer + drivers receive the gateway JWT directly from the create-sandbox flow + and never call this RPC. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RefreshSandboxToken(self, request, context): + """Renew the calling sandbox's gateway JWT. Older tokens remain valid + until their own expiry; deployments should keep token TTLs short to + bound replay exposure. The supervisor calls this from a background + task at ~80% of the token's lifetime; the new token is cached in + memory only — the on-disk bootstrap file is intentionally not + rewritten. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CreateWorkspace(self, request, context): + """--------------------------------------------------------------------------- + Workspace management RPCs + --------------------------------------------------------------------------- + + Create a workspace. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetWorkspace(self, request, context): + """Fetch a workspace by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListWorkspaces(self, request, context): + """List workspaces. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteWorkspace(self, request, context): + """Delete a workspace by name. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def AddWorkspaceMember(self, request, context): + """Add a member to a workspace. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveWorkspaceMember(self, request, context): + """Remove a member from a workspace. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListWorkspaceMembers(self, request, context): + """List members of a workspace. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_OpenShellServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Health': grpc.unary_unary_rpc_method_handler( + servicer.Health, + request_deserializer=openshell__pb2.HealthRequest.FromString, + response_serializer=openshell__pb2.HealthResponse.SerializeToString, + ), + 'GetCurrentUser': grpc.unary_unary_rpc_method_handler( + servicer.GetCurrentUser, + request_deserializer=openshell__pb2.GetCurrentUserRequest.FromString, + response_serializer=openshell__pb2.GetCurrentUserResponse.SerializeToString, + ), + 'GetGatewayInfo': grpc.unary_unary_rpc_method_handler( + servicer.GetGatewayInfo, + request_deserializer=openshell__pb2.GetGatewayInfoRequest.FromString, + response_serializer=openshell__pb2.GetGatewayInfoResponse.SerializeToString, + ), + 'CreateSandbox': grpc.unary_unary_rpc_method_handler( + servicer.CreateSandbox, + request_deserializer=openshell__pb2.CreateSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxResponse.SerializeToString, + ), + 'BeginRootfsTarStaging': grpc.unary_unary_rpc_method_handler( + servicer.BeginRootfsTarStaging, + request_deserializer=openshell__pb2.BeginRootfsTarStagingRequest.FromString, + response_serializer=openshell__pb2.BeginRootfsTarStagingResponse.SerializeToString, + ), + 'GetSandbox': grpc.unary_unary_rpc_method_handler( + servicer.GetSandbox, + request_deserializer=openshell__pb2.GetSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxResponse.SerializeToString, + ), + 'ListSandboxes': grpc.unary_unary_rpc_method_handler( + servicer.ListSandboxes, + request_deserializer=openshell__pb2.ListSandboxesRequest.FromString, + response_serializer=openshell__pb2.ListSandboxesResponse.SerializeToString, + ), + 'CreateSandboxTemplate': grpc.unary_unary_rpc_method_handler( + servicer.CreateSandboxTemplate, + request_deserializer=openshell__pb2.CreateSandboxTemplateRequest.FromString, + response_serializer=openshell__pb2.SandboxTemplateResponse.SerializeToString, + ), + 'GetSandboxTemplate': grpc.unary_unary_rpc_method_handler( + servicer.GetSandboxTemplate, + request_deserializer=openshell__pb2.GetSandboxTemplateRequest.FromString, + response_serializer=openshell__pb2.SandboxTemplateResponse.SerializeToString, + ), + 'ListSandboxTemplates': grpc.unary_unary_rpc_method_handler( + servicer.ListSandboxTemplates, + request_deserializer=openshell__pb2.ListSandboxTemplatesRequest.FromString, + response_serializer=openshell__pb2.ListSandboxTemplatesResponse.SerializeToString, + ), + 'DeleteSandboxTemplate': grpc.unary_unary_rpc_method_handler( + servicer.DeleteSandboxTemplate, + request_deserializer=openshell__pb2.DeleteSandboxTemplateRequest.FromString, + response_serializer=openshell__pb2.DeleteSandboxTemplateResponse.SerializeToString, + ), + 'ListSandboxProviders': grpc.unary_unary_rpc_method_handler( + servicer.ListSandboxProviders, + request_deserializer=openshell__pb2.ListSandboxProvidersRequest.FromString, + response_serializer=openshell__pb2.ListSandboxProvidersResponse.SerializeToString, + ), + 'AttachSandboxProvider': grpc.unary_unary_rpc_method_handler( + servicer.AttachSandboxProvider, + request_deserializer=openshell__pb2.AttachSandboxProviderRequest.FromString, + response_serializer=openshell__pb2.AttachSandboxProviderResponse.SerializeToString, + ), + 'DetachSandboxProvider': grpc.unary_unary_rpc_method_handler( + servicer.DetachSandboxProvider, + request_deserializer=openshell__pb2.DetachSandboxProviderRequest.FromString, + response_serializer=openshell__pb2.DetachSandboxProviderResponse.SerializeToString, + ), + 'GetSandboxProviderStatus': grpc.unary_unary_rpc_method_handler( + servicer.GetSandboxProviderStatus, + request_deserializer=openshell__pb2.GetSandboxProviderStatusRequest.FromString, + response_serializer=openshell__pb2.GetSandboxProviderStatusResponse.SerializeToString, + ), + 'DeleteSandbox': grpc.unary_unary_rpc_method_handler( + servicer.DeleteSandbox, + request_deserializer=openshell__pb2.DeleteSandboxRequest.FromString, + response_serializer=openshell__pb2.DeleteSandboxResponse.SerializeToString, + ), + 'StopSandbox': grpc.unary_unary_rpc_method_handler( + servicer.StopSandbox, + request_deserializer=openshell__pb2.StopSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxResponse.SerializeToString, + ), + 'StartSandbox': grpc.unary_unary_rpc_method_handler( + servicer.StartSandbox, + request_deserializer=openshell__pb2.StartSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxResponse.SerializeToString, + ), + 'SuspendSandbox': grpc.unary_unary_rpc_method_handler( + servicer.SuspendSandbox, + request_deserializer=openshell__pb2.SuspendSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxResponse.SerializeToString, + ), + 'ResumeSandbox': grpc.unary_unary_rpc_method_handler( + servicer.ResumeSandbox, + request_deserializer=openshell__pb2.ResumeSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxResponse.SerializeToString, + ), + 'CreateSshSession': grpc.unary_unary_rpc_method_handler( + servicer.CreateSshSession, + request_deserializer=openshell__pb2.CreateSshSessionRequest.FromString, + response_serializer=openshell__pb2.CreateSshSessionResponse.SerializeToString, + ), + 'ExposeService': grpc.unary_unary_rpc_method_handler( + servicer.ExposeService, + request_deserializer=openshell__pb2.ExposeServiceRequest.FromString, + response_serializer=openshell__pb2.ServiceEndpointResponse.SerializeToString, + ), + 'GetService': grpc.unary_unary_rpc_method_handler( + servicer.GetService, + request_deserializer=openshell__pb2.GetServiceRequest.FromString, + response_serializer=openshell__pb2.ServiceEndpointResponse.SerializeToString, + ), + 'ListServices': grpc.unary_unary_rpc_method_handler( + servicer.ListServices, + request_deserializer=openshell__pb2.ListServicesRequest.FromString, + response_serializer=openshell__pb2.ListServicesResponse.SerializeToString, + ), + 'DeleteService': grpc.unary_unary_rpc_method_handler( + servicer.DeleteService, + request_deserializer=openshell__pb2.DeleteServiceRequest.FromString, + response_serializer=openshell__pb2.DeleteServiceResponse.SerializeToString, + ), + 'RevokeSshSession': grpc.unary_unary_rpc_method_handler( + servicer.RevokeSshSession, + request_deserializer=openshell__pb2.RevokeSshSessionRequest.FromString, + response_serializer=openshell__pb2.RevokeSshSessionResponse.SerializeToString, + ), + 'ExecSandbox': grpc.unary_stream_rpc_method_handler( + servicer.ExecSandbox, + request_deserializer=openshell__pb2.ExecSandboxRequest.FromString, + response_serializer=openshell__pb2.ExecSandboxEvent.SerializeToString, + ), + 'ForwardTcp': grpc.stream_stream_rpc_method_handler( + servicer.ForwardTcp, + request_deserializer=openshell__pb2.TcpForwardFrame.FromString, + response_serializer=openshell__pb2.TcpForwardFrame.SerializeToString, + ), + 'ExecSandboxInteractive': grpc.stream_stream_rpc_method_handler( + servicer.ExecSandboxInteractive, + request_deserializer=openshell__pb2.ExecSandboxInput.FromString, + response_serializer=openshell__pb2.ExecSandboxEvent.SerializeToString, + ), + 'CreateProvider': grpc.unary_unary_rpc_method_handler( + servicer.CreateProvider, + request_deserializer=openshell__pb2.CreateProviderRequest.FromString, + response_serializer=openshell__pb2.ProviderResponse.SerializeToString, + ), + 'GetProvider': grpc.unary_unary_rpc_method_handler( + servicer.GetProvider, + request_deserializer=openshell__pb2.GetProviderRequest.FromString, + response_serializer=openshell__pb2.ProviderResponse.SerializeToString, + ), + 'GetProviderCredentials': grpc.unary_unary_rpc_method_handler( + servicer.GetProviderCredentials, + request_deserializer=openshell__pb2.GetProviderCredentialsRequest.FromString, + response_serializer=openshell__pb2.GetProviderCredentialsResponse.SerializeToString, + ), + 'ListProviders': grpc.unary_unary_rpc_method_handler( + servicer.ListProviders, + request_deserializer=openshell__pb2.ListProvidersRequest.FromString, + response_serializer=openshell__pb2.ListProvidersResponse.SerializeToString, + ), + 'ListProviderProfiles': grpc.unary_unary_rpc_method_handler( + servicer.ListProviderProfiles, + request_deserializer=openshell__pb2.ListProviderProfilesRequest.FromString, + response_serializer=openshell__pb2.ListProviderProfilesResponse.SerializeToString, + ), + 'GetProviderProfile': grpc.unary_unary_rpc_method_handler( + servicer.GetProviderProfile, + request_deserializer=openshell__pb2.GetProviderProfileRequest.FromString, + response_serializer=openshell__pb2.ProviderProfileResponse.SerializeToString, + ), + 'ImportProviderProfiles': grpc.unary_unary_rpc_method_handler( + servicer.ImportProviderProfiles, + request_deserializer=openshell__pb2.ImportProviderProfilesRequest.FromString, + response_serializer=openshell__pb2.ImportProviderProfilesResponse.SerializeToString, + ), + 'UpdateProviderProfiles': grpc.unary_unary_rpc_method_handler( + servicer.UpdateProviderProfiles, + request_deserializer=openshell__pb2.UpdateProviderProfilesRequest.FromString, + response_serializer=openshell__pb2.UpdateProviderProfilesResponse.SerializeToString, + ), + 'LintProviderProfiles': grpc.unary_unary_rpc_method_handler( + servicer.LintProviderProfiles, + request_deserializer=openshell__pb2.LintProviderProfilesRequest.FromString, + response_serializer=openshell__pb2.LintProviderProfilesResponse.SerializeToString, + ), + 'UpdateProvider': grpc.unary_unary_rpc_method_handler( + servicer.UpdateProvider, + request_deserializer=openshell__pb2.UpdateProviderRequest.FromString, + response_serializer=openshell__pb2.ProviderResponse.SerializeToString, + ), + 'GetProviderRefreshStatus': grpc.unary_unary_rpc_method_handler( + servicer.GetProviderRefreshStatus, + request_deserializer=openshell__pb2.GetProviderRefreshStatusRequest.FromString, + response_serializer=openshell__pb2.GetProviderRefreshStatusResponse.SerializeToString, + ), + 'ConfigureProviderRefresh': grpc.unary_unary_rpc_method_handler( + servicer.ConfigureProviderRefresh, + request_deserializer=openshell__pb2.ConfigureProviderRefreshRequest.FromString, + response_serializer=openshell__pb2.ConfigureProviderRefreshResponse.SerializeToString, + ), + 'RotateProviderCredential': grpc.unary_unary_rpc_method_handler( + servicer.RotateProviderCredential, + request_deserializer=openshell__pb2.RotateProviderCredentialRequest.FromString, + response_serializer=openshell__pb2.RotateProviderCredentialResponse.SerializeToString, + ), + 'DeleteProviderRefresh': grpc.unary_unary_rpc_method_handler( + servicer.DeleteProviderRefresh, + request_deserializer=openshell__pb2.DeleteProviderRefreshRequest.FromString, + response_serializer=openshell__pb2.DeleteProviderRefreshResponse.SerializeToString, + ), + 'DeleteProvider': grpc.unary_unary_rpc_method_handler( + servicer.DeleteProvider, + request_deserializer=openshell__pb2.DeleteProviderRequest.FromString, + response_serializer=openshell__pb2.DeleteProviderResponse.SerializeToString, + ), + 'DeleteProviderProfile': grpc.unary_unary_rpc_method_handler( + servicer.DeleteProviderProfile, + request_deserializer=openshell__pb2.DeleteProviderProfileRequest.FromString, + response_serializer=openshell__pb2.DeleteProviderProfileResponse.SerializeToString, + ), + 'GetSandboxConfig': grpc.unary_unary_rpc_method_handler( + servicer.GetSandboxConfig, + request_deserializer=sandbox__pb2.GetSandboxConfigRequest.FromString, + response_serializer=sandbox__pb2.GetSandboxConfigResponse.SerializeToString, + ), + 'GetGatewayConfig': grpc.unary_unary_rpc_method_handler( + servicer.GetGatewayConfig, + request_deserializer=sandbox__pb2.GetGatewayConfigRequest.FromString, + response_serializer=sandbox__pb2.GetGatewayConfigResponse.SerializeToString, + ), + 'UpdateConfig': grpc.unary_unary_rpc_method_handler( + servicer.UpdateConfig, + request_deserializer=openshell__pb2.UpdateConfigRequest.FromString, + response_serializer=openshell__pb2.UpdateConfigResponse.SerializeToString, + ), + 'GetSandboxPolicyStatus': grpc.unary_unary_rpc_method_handler( + servicer.GetSandboxPolicyStatus, + request_deserializer=openshell__pb2.GetSandboxPolicyStatusRequest.FromString, + response_serializer=openshell__pb2.GetSandboxPolicyStatusResponse.SerializeToString, + ), + 'ListSandboxPolicies': grpc.unary_unary_rpc_method_handler( + servicer.ListSandboxPolicies, + request_deserializer=openshell__pb2.ListSandboxPoliciesRequest.FromString, + response_serializer=openshell__pb2.ListSandboxPoliciesResponse.SerializeToString, + ), + 'ReportPolicyStatus': grpc.unary_unary_rpc_method_handler( + servicer.ReportPolicyStatus, + request_deserializer=openshell__pb2.ReportPolicyStatusRequest.FromString, + response_serializer=openshell__pb2.ReportPolicyStatusResponse.SerializeToString, + ), + 'ReportEndpointStatus': grpc.unary_unary_rpc_method_handler( + servicer.ReportEndpointStatus, + request_deserializer=openshell__pb2.ReportEndpointStatusRequest.FromString, + response_serializer=openshell__pb2.ReportEndpointStatusResponse.SerializeToString, + ), + 'ReportProviderReadiness': grpc.unary_unary_rpc_method_handler( + servicer.ReportProviderReadiness, + request_deserializer=openshell__pb2.ReportProviderReadinessRequest.FromString, + response_serializer=openshell__pb2.ReportProviderReadinessResponse.SerializeToString, + ), + 'ReportSandboxConfiguration': grpc.unary_unary_rpc_method_handler( + servicer.ReportSandboxConfiguration, + request_deserializer=openshell__pb2.ReportSandboxConfigurationRequest.FromString, + response_serializer=openshell__pb2.ReportSandboxConfigurationResponse.SerializeToString, + ), + 'GetSandboxProviderEnvironment': grpc.unary_unary_rpc_method_handler( + servicer.GetSandboxProviderEnvironment, + request_deserializer=openshell__pb2.GetSandboxProviderEnvironmentRequest.FromString, + response_serializer=openshell__pb2.GetSandboxProviderEnvironmentResponse.SerializeToString, + ), + 'ExchangeProviderSubjectToken': grpc.unary_unary_rpc_method_handler( + servicer.ExchangeProviderSubjectToken, + request_deserializer=openshell__pb2.ExchangeProviderSubjectTokenRequest.FromString, + response_serializer=openshell__pb2.ExchangeProviderSubjectTokenResponse.SerializeToString, + ), + 'GetSandboxLogs': grpc.unary_unary_rpc_method_handler( + servicer.GetSandboxLogs, + request_deserializer=openshell__pb2.GetSandboxLogsRequest.FromString, + response_serializer=openshell__pb2.GetSandboxLogsResponse.SerializeToString, + ), + 'PushSandboxLogs': grpc.stream_unary_rpc_method_handler( + servicer.PushSandboxLogs, + request_deserializer=openshell__pb2.PushSandboxLogsRequest.FromString, + response_serializer=openshell__pb2.PushSandboxLogsResponse.SerializeToString, + ), + 'ConnectSupervisor': grpc.stream_stream_rpc_method_handler( + servicer.ConnectSupervisor, + request_deserializer=openshell__pb2.SupervisorMessage.FromString, + response_serializer=openshell__pb2.GatewayMessage.SerializeToString, + ), + 'ReportMainProcessExit': grpc.unary_unary_rpc_method_handler( + servicer.ReportMainProcessExit, + request_deserializer=openshell__pb2.ReportMainProcessExitRequest.FromString, + response_serializer=openshell__pb2.ReportMainProcessExitResponse.SerializeToString, + ), + 'FinalizeMainProcessExit': grpc.unary_unary_rpc_method_handler( + servicer.FinalizeMainProcessExit, + request_deserializer=openshell__pb2.FinalizeMainProcessExitRequest.FromString, + response_serializer=openshell__pb2.FinalizeMainProcessExitResponse.SerializeToString, + ), + 'RelayStream': grpc.stream_stream_rpc_method_handler( + servicer.RelayStream, + request_deserializer=openshell__pb2.RelayFrame.FromString, + response_serializer=openshell__pb2.RelayFrame.SerializeToString, + ), + 'PeerRelay': grpc.stream_stream_rpc_method_handler( + servicer.PeerRelay, + request_deserializer=openshell__pb2.PeerRelayFrame.FromString, + response_serializer=openshell__pb2.PeerRelayFrame.SerializeToString, + ), + 'PeerReportProviderReadiness': grpc.unary_unary_rpc_method_handler( + servicer.PeerReportProviderReadiness, + request_deserializer=openshell__pb2.ReportProviderReadinessRequest.FromString, + response_serializer=openshell__pb2.ReportProviderReadinessResponse.SerializeToString, + ), + 'PeerReportEndpointStatus': grpc.unary_unary_rpc_method_handler( + servicer.PeerReportEndpointStatus, + request_deserializer=openshell__pb2.ReportEndpointStatusRequest.FromString, + response_serializer=openshell__pb2.ReportEndpointStatusResponse.SerializeToString, + ), + 'PeerGetSandboxProviderStatus': grpc.unary_unary_rpc_method_handler( + servicer.PeerGetSandboxProviderStatus, + request_deserializer=openshell__pb2.GetSandboxProviderStatusRequest.FromString, + response_serializer=openshell__pb2.GetSandboxProviderStatusResponse.SerializeToString, + ), + 'PeerNotifyConfigUpdate': grpc.unary_unary_rpc_method_handler( + servicer.PeerNotifyConfigUpdate, + request_deserializer=openshell__pb2.PeerNotifyConfigUpdateRequest.FromString, + response_serializer=openshell__pb2.PeerNotifyConfigUpdateResponse.SerializeToString, + ), + 'WatchSandbox': grpc.unary_stream_rpc_method_handler( + servicer.WatchSandbox, + request_deserializer=openshell__pb2.WatchSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxStreamEvent.SerializeToString, + ), + 'SubmitPolicyAnalysis': grpc.unary_unary_rpc_method_handler( + servicer.SubmitPolicyAnalysis, + request_deserializer=openshell__pb2.SubmitPolicyAnalysisRequest.FromString, + response_serializer=openshell__pb2.SubmitPolicyAnalysisResponse.SerializeToString, + ), + 'GetDraftPolicy': grpc.unary_unary_rpc_method_handler( + servicer.GetDraftPolicy, + request_deserializer=openshell__pb2.GetDraftPolicyRequest.FromString, + response_serializer=openshell__pb2.GetDraftPolicyResponse.SerializeToString, + ), + 'ApproveDraftChunk': grpc.unary_unary_rpc_method_handler( + servicer.ApproveDraftChunk, + request_deserializer=openshell__pb2.ApproveDraftChunkRequest.FromString, + response_serializer=openshell__pb2.ApproveDraftChunkResponse.SerializeToString, + ), + 'RejectDraftChunk': grpc.unary_unary_rpc_method_handler( + servicer.RejectDraftChunk, + request_deserializer=openshell__pb2.RejectDraftChunkRequest.FromString, + response_serializer=openshell__pb2.RejectDraftChunkResponse.SerializeToString, + ), + 'ApproveAllDraftChunks': grpc.unary_unary_rpc_method_handler( + servicer.ApproveAllDraftChunks, + request_deserializer=openshell__pb2.ApproveAllDraftChunksRequest.FromString, + response_serializer=openshell__pb2.ApproveAllDraftChunksResponse.SerializeToString, + ), + 'EditDraftChunk': grpc.unary_unary_rpc_method_handler( + servicer.EditDraftChunk, + request_deserializer=openshell__pb2.EditDraftChunkRequest.FromString, + response_serializer=openshell__pb2.EditDraftChunkResponse.SerializeToString, + ), + 'UndoDraftChunk': grpc.unary_unary_rpc_method_handler( + servicer.UndoDraftChunk, + request_deserializer=openshell__pb2.UndoDraftChunkRequest.FromString, + response_serializer=openshell__pb2.UndoDraftChunkResponse.SerializeToString, + ), + 'ClearDraftChunks': grpc.unary_unary_rpc_method_handler( + servicer.ClearDraftChunks, + request_deserializer=openshell__pb2.ClearDraftChunksRequest.FromString, + response_serializer=openshell__pb2.ClearDraftChunksResponse.SerializeToString, + ), + 'GetDraftHistory': grpc.unary_unary_rpc_method_handler( + servicer.GetDraftHistory, + request_deserializer=openshell__pb2.GetDraftHistoryRequest.FromString, + response_serializer=openshell__pb2.GetDraftHistoryResponse.SerializeToString, + ), + 'IssueSandboxToken': grpc.unary_unary_rpc_method_handler( + servicer.IssueSandboxToken, + request_deserializer=openshell__pb2.IssueSandboxTokenRequest.FromString, + response_serializer=openshell__pb2.IssueSandboxTokenResponse.SerializeToString, + ), + 'RefreshSandboxToken': grpc.unary_unary_rpc_method_handler( + servicer.RefreshSandboxToken, + request_deserializer=openshell__pb2.RefreshSandboxTokenRequest.FromString, + response_serializer=openshell__pb2.RefreshSandboxTokenResponse.SerializeToString, + ), + 'CreateWorkspace': grpc.unary_unary_rpc_method_handler( + servicer.CreateWorkspace, + request_deserializer=openshell__pb2.CreateWorkspaceRequest.FromString, + response_serializer=openshell__pb2.CreateWorkspaceResponse.SerializeToString, + ), + 'GetWorkspace': grpc.unary_unary_rpc_method_handler( + servicer.GetWorkspace, + request_deserializer=openshell__pb2.GetWorkspaceRequest.FromString, + response_serializer=openshell__pb2.GetWorkspaceResponse.SerializeToString, + ), + 'ListWorkspaces': grpc.unary_unary_rpc_method_handler( + servicer.ListWorkspaces, + request_deserializer=openshell__pb2.ListWorkspacesRequest.FromString, + response_serializer=openshell__pb2.ListWorkspacesResponse.SerializeToString, + ), + 'DeleteWorkspace': grpc.unary_unary_rpc_method_handler( + servicer.DeleteWorkspace, + request_deserializer=openshell__pb2.DeleteWorkspaceRequest.FromString, + response_serializer=openshell__pb2.DeleteWorkspaceResponse.SerializeToString, + ), + 'AddWorkspaceMember': grpc.unary_unary_rpc_method_handler( + servicer.AddWorkspaceMember, + request_deserializer=openshell__pb2.AddWorkspaceMemberRequest.FromString, + response_serializer=openshell__pb2.AddWorkspaceMemberResponse.SerializeToString, + ), + 'RemoveWorkspaceMember': grpc.unary_unary_rpc_method_handler( + servicer.RemoveWorkspaceMember, + request_deserializer=openshell__pb2.RemoveWorkspaceMemberRequest.FromString, + response_serializer=openshell__pb2.RemoveWorkspaceMemberResponse.SerializeToString, + ), + 'ListWorkspaceMembers': grpc.unary_unary_rpc_method_handler( + servicer.ListWorkspaceMembers, + request_deserializer=openshell__pb2.ListWorkspaceMembersRequest.FromString, + response_serializer=openshell__pb2.ListWorkspaceMembersResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'openshell.v1.OpenShell', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('openshell.v1.OpenShell', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class OpenShell(object): + """OpenShell service provides sandbox, provider, and runtime management capabilities. + + Conventions: + - This file owns the public API resource model exposed to OpenShell clients. + - `Sandbox`, `SandboxSpec`, `SandboxStatus`, and `SandboxPhase` are gateway-owned + public types. Internal compute drivers must not import or return them directly. + - The gateway translates internal compute-driver observations into these public + resource messages before persisting or returning them to clients. + """ + + @staticmethod + def Health(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/Health', + openshell__pb2.HealthRequest.SerializeToString, + openshell__pb2.HealthResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetCurrentUser(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetCurrentUser', + openshell__pb2.GetCurrentUserRequest.SerializeToString, + openshell__pb2.GetCurrentUserResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetGatewayInfo(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetGatewayInfo', + openshell__pb2.GetGatewayInfoRequest.SerializeToString, + openshell__pb2.GetGatewayInfoResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CreateSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/CreateSandbox', + openshell__pb2.CreateSandboxRequest.SerializeToString, + openshell__pb2.SandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def BeginRootfsTarStaging(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/BeginRootfsTarStaging', + openshell__pb2.BeginRootfsTarStagingRequest.SerializeToString, + openshell__pb2.BeginRootfsTarStagingResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetSandbox', + openshell__pb2.GetSandboxRequest.SerializeToString, + openshell__pb2.SandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListSandboxes(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListSandboxes', + openshell__pb2.ListSandboxesRequest.SerializeToString, + openshell__pb2.ListSandboxesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CreateSandboxTemplate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/CreateSandboxTemplate', + openshell__pb2.CreateSandboxTemplateRequest.SerializeToString, + openshell__pb2.SandboxTemplateResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSandboxTemplate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetSandboxTemplate', + openshell__pb2.GetSandboxTemplateRequest.SerializeToString, + openshell__pb2.SandboxTemplateResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListSandboxTemplates(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListSandboxTemplates', + openshell__pb2.ListSandboxTemplatesRequest.SerializeToString, + openshell__pb2.ListSandboxTemplatesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteSandboxTemplate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DeleteSandboxTemplate', + openshell__pb2.DeleteSandboxTemplateRequest.SerializeToString, + openshell__pb2.DeleteSandboxTemplateResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListSandboxProviders(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListSandboxProviders', + openshell__pb2.ListSandboxProvidersRequest.SerializeToString, + openshell__pb2.ListSandboxProvidersResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AttachSandboxProvider(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/AttachSandboxProvider', + openshell__pb2.AttachSandboxProviderRequest.SerializeToString, + openshell__pb2.AttachSandboxProviderResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DetachSandboxProvider(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DetachSandboxProvider', + openshell__pb2.DetachSandboxProviderRequest.SerializeToString, + openshell__pb2.DetachSandboxProviderResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSandboxProviderStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetSandboxProviderStatus', + openshell__pb2.GetSandboxProviderStatusRequest.SerializeToString, + openshell__pb2.GetSandboxProviderStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DeleteSandbox', + openshell__pb2.DeleteSandboxRequest.SerializeToString, + openshell__pb2.DeleteSandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StopSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/StopSandbox', + openshell__pb2.StopSandboxRequest.SerializeToString, + openshell__pb2.SandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def StartSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/StartSandbox', + openshell__pb2.StartSandboxRequest.SerializeToString, + openshell__pb2.SandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SuspendSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/SuspendSandbox', + openshell__pb2.SuspendSandboxRequest.SerializeToString, + openshell__pb2.SandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ResumeSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ResumeSandbox', + openshell__pb2.ResumeSandboxRequest.SerializeToString, + openshell__pb2.SandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CreateSshSession(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/CreateSshSession', + openshell__pb2.CreateSshSessionRequest.SerializeToString, + openshell__pb2.CreateSshSessionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ExposeService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ExposeService', + openshell__pb2.ExposeServiceRequest.SerializeToString, + openshell__pb2.ServiceEndpointResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetService', + openshell__pb2.GetServiceRequest.SerializeToString, + openshell__pb2.ServiceEndpointResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListServices(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListServices', + openshell__pb2.ListServicesRequest.SerializeToString, + openshell__pb2.ListServicesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DeleteService', + openshell__pb2.DeleteServiceRequest.SerializeToString, + openshell__pb2.DeleteServiceResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RevokeSshSession(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/RevokeSshSession', + openshell__pb2.RevokeSshSessionRequest.SerializeToString, + openshell__pb2.RevokeSshSessionResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ExecSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/openshell.v1.OpenShell/ExecSandbox', + openshell__pb2.ExecSandboxRequest.SerializeToString, + openshell__pb2.ExecSandboxEvent.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ForwardTcp(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream( + request_iterator, + target, + '/openshell.v1.OpenShell/ForwardTcp', + openshell__pb2.TcpForwardFrame.SerializeToString, + openshell__pb2.TcpForwardFrame.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ExecSandboxInteractive(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream( + request_iterator, + target, + '/openshell.v1.OpenShell/ExecSandboxInteractive', + openshell__pb2.ExecSandboxInput.SerializeToString, + openshell__pb2.ExecSandboxEvent.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CreateProvider(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/CreateProvider', + openshell__pb2.CreateProviderRequest.SerializeToString, + openshell__pb2.ProviderResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetProvider(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetProvider', + openshell__pb2.GetProviderRequest.SerializeToString, + openshell__pb2.ProviderResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetProviderCredentials(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetProviderCredentials', + openshell__pb2.GetProviderCredentialsRequest.SerializeToString, + openshell__pb2.GetProviderCredentialsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListProviders(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListProviders', + openshell__pb2.ListProvidersRequest.SerializeToString, + openshell__pb2.ListProvidersResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListProviderProfiles(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListProviderProfiles', + openshell__pb2.ListProviderProfilesRequest.SerializeToString, + openshell__pb2.ListProviderProfilesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetProviderProfile(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetProviderProfile', + openshell__pb2.GetProviderProfileRequest.SerializeToString, + openshell__pb2.ProviderProfileResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ImportProviderProfiles(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ImportProviderProfiles', + openshell__pb2.ImportProviderProfilesRequest.SerializeToString, + openshell__pb2.ImportProviderProfilesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def UpdateProviderProfiles(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/UpdateProviderProfiles', + openshell__pb2.UpdateProviderProfilesRequest.SerializeToString, + openshell__pb2.UpdateProviderProfilesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def LintProviderProfiles(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/LintProviderProfiles', + openshell__pb2.LintProviderProfilesRequest.SerializeToString, + openshell__pb2.LintProviderProfilesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def UpdateProvider(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/UpdateProvider', + openshell__pb2.UpdateProviderRequest.SerializeToString, + openshell__pb2.ProviderResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetProviderRefreshStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetProviderRefreshStatus', + openshell__pb2.GetProviderRefreshStatusRequest.SerializeToString, + openshell__pb2.GetProviderRefreshStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ConfigureProviderRefresh(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ConfigureProviderRefresh', + openshell__pb2.ConfigureProviderRefreshRequest.SerializeToString, + openshell__pb2.ConfigureProviderRefreshResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RotateProviderCredential(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/RotateProviderCredential', + openshell__pb2.RotateProviderCredentialRequest.SerializeToString, + openshell__pb2.RotateProviderCredentialResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteProviderRefresh(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DeleteProviderRefresh', + openshell__pb2.DeleteProviderRefreshRequest.SerializeToString, + openshell__pb2.DeleteProviderRefreshResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteProvider(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DeleteProvider', + openshell__pb2.DeleteProviderRequest.SerializeToString, + openshell__pb2.DeleteProviderResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteProviderProfile(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DeleteProviderProfile', + openshell__pb2.DeleteProviderProfileRequest.SerializeToString, + openshell__pb2.DeleteProviderProfileResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSandboxConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetSandboxConfig', + sandbox__pb2.GetSandboxConfigRequest.SerializeToString, + sandbox__pb2.GetSandboxConfigResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetGatewayConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetGatewayConfig', + sandbox__pb2.GetGatewayConfigRequest.SerializeToString, + sandbox__pb2.GetGatewayConfigResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def UpdateConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/UpdateConfig', + openshell__pb2.UpdateConfigRequest.SerializeToString, + openshell__pb2.UpdateConfigResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSandboxPolicyStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetSandboxPolicyStatus', + openshell__pb2.GetSandboxPolicyStatusRequest.SerializeToString, + openshell__pb2.GetSandboxPolicyStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListSandboxPolicies(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListSandboxPolicies', + openshell__pb2.ListSandboxPoliciesRequest.SerializeToString, + openshell__pb2.ListSandboxPoliciesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ReportPolicyStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ReportPolicyStatus', + openshell__pb2.ReportPolicyStatusRequest.SerializeToString, + openshell__pb2.ReportPolicyStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ReportEndpointStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ReportEndpointStatus', + openshell__pb2.ReportEndpointStatusRequest.SerializeToString, + openshell__pb2.ReportEndpointStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ReportProviderReadiness(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ReportProviderReadiness', + openshell__pb2.ReportProviderReadinessRequest.SerializeToString, + openshell__pb2.ReportProviderReadinessResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ReportSandboxConfiguration(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ReportSandboxConfiguration', + openshell__pb2.ReportSandboxConfigurationRequest.SerializeToString, + openshell__pb2.ReportSandboxConfigurationResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSandboxProviderEnvironment(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetSandboxProviderEnvironment', + openshell__pb2.GetSandboxProviderEnvironmentRequest.SerializeToString, + openshell__pb2.GetSandboxProviderEnvironmentResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ExchangeProviderSubjectToken(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ExchangeProviderSubjectToken', + openshell__pb2.ExchangeProviderSubjectTokenRequest.SerializeToString, + openshell__pb2.ExchangeProviderSubjectTokenResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetSandboxLogs(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetSandboxLogs', + openshell__pb2.GetSandboxLogsRequest.SerializeToString, + openshell__pb2.GetSandboxLogsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PushSandboxLogs(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_unary( + request_iterator, + target, + '/openshell.v1.OpenShell/PushSandboxLogs', + openshell__pb2.PushSandboxLogsRequest.SerializeToString, + openshell__pb2.PushSandboxLogsResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ConnectSupervisor(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream( + request_iterator, + target, + '/openshell.v1.OpenShell/ConnectSupervisor', + openshell__pb2.SupervisorMessage.SerializeToString, + openshell__pb2.GatewayMessage.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ReportMainProcessExit(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ReportMainProcessExit', + openshell__pb2.ReportMainProcessExitRequest.SerializeToString, + openshell__pb2.ReportMainProcessExitResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def FinalizeMainProcessExit(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/FinalizeMainProcessExit', + openshell__pb2.FinalizeMainProcessExitRequest.SerializeToString, + openshell__pb2.FinalizeMainProcessExitResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RelayStream(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream( + request_iterator, + target, + '/openshell.v1.OpenShell/RelayStream', + openshell__pb2.RelayFrame.SerializeToString, + openshell__pb2.RelayFrame.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PeerRelay(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream( + request_iterator, + target, + '/openshell.v1.OpenShell/PeerRelay', + openshell__pb2.PeerRelayFrame.SerializeToString, + openshell__pb2.PeerRelayFrame.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PeerReportProviderReadiness(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/PeerReportProviderReadiness', + openshell__pb2.ReportProviderReadinessRequest.SerializeToString, + openshell__pb2.ReportProviderReadinessResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PeerReportEndpointStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/PeerReportEndpointStatus', + openshell__pb2.ReportEndpointStatusRequest.SerializeToString, + openshell__pb2.ReportEndpointStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PeerGetSandboxProviderStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/PeerGetSandboxProviderStatus', + openshell__pb2.GetSandboxProviderStatusRequest.SerializeToString, + openshell__pb2.GetSandboxProviderStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def PeerNotifyConfigUpdate(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/PeerNotifyConfigUpdate', + openshell__pb2.PeerNotifyConfigUpdateRequest.SerializeToString, + openshell__pb2.PeerNotifyConfigUpdateResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def WatchSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/openshell.v1.OpenShell/WatchSandbox', + openshell__pb2.WatchSandboxRequest.SerializeToString, + openshell__pb2.SandboxStreamEvent.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SubmitPolicyAnalysis(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/SubmitPolicyAnalysis', + openshell__pb2.SubmitPolicyAnalysisRequest.SerializeToString, + openshell__pb2.SubmitPolicyAnalysisResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetDraftPolicy(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetDraftPolicy', + openshell__pb2.GetDraftPolicyRequest.SerializeToString, + openshell__pb2.GetDraftPolicyResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ApproveDraftChunk(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ApproveDraftChunk', + openshell__pb2.ApproveDraftChunkRequest.SerializeToString, + openshell__pb2.ApproveDraftChunkResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RejectDraftChunk(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/RejectDraftChunk', + openshell__pb2.RejectDraftChunkRequest.SerializeToString, + openshell__pb2.RejectDraftChunkResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ApproveAllDraftChunks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ApproveAllDraftChunks', + openshell__pb2.ApproveAllDraftChunksRequest.SerializeToString, + openshell__pb2.ApproveAllDraftChunksResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def EditDraftChunk(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/EditDraftChunk', + openshell__pb2.EditDraftChunkRequest.SerializeToString, + openshell__pb2.EditDraftChunkResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def UndoDraftChunk(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/UndoDraftChunk', + openshell__pb2.UndoDraftChunkRequest.SerializeToString, + openshell__pb2.UndoDraftChunkResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ClearDraftChunks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ClearDraftChunks', + openshell__pb2.ClearDraftChunksRequest.SerializeToString, + openshell__pb2.ClearDraftChunksResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetDraftHistory(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetDraftHistory', + openshell__pb2.GetDraftHistoryRequest.SerializeToString, + openshell__pb2.GetDraftHistoryResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def IssueSandboxToken(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/IssueSandboxToken', + openshell__pb2.IssueSandboxTokenRequest.SerializeToString, + openshell__pb2.IssueSandboxTokenResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RefreshSandboxToken(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/RefreshSandboxToken', + openshell__pb2.RefreshSandboxTokenRequest.SerializeToString, + openshell__pb2.RefreshSandboxTokenResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def CreateWorkspace(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/CreateWorkspace', + openshell__pb2.CreateWorkspaceRequest.SerializeToString, + openshell__pb2.CreateWorkspaceResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetWorkspace(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/GetWorkspace', + openshell__pb2.GetWorkspaceRequest.SerializeToString, + openshell__pb2.GetWorkspaceResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListWorkspaces(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListWorkspaces', + openshell__pb2.ListWorkspacesRequest.SerializeToString, + openshell__pb2.ListWorkspacesResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteWorkspace(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/DeleteWorkspace', + openshell__pb2.DeleteWorkspaceRequest.SerializeToString, + openshell__pb2.DeleteWorkspaceResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def AddWorkspaceMember(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/AddWorkspaceMember', + openshell__pb2.AddWorkspaceMemberRequest.SerializeToString, + openshell__pb2.AddWorkspaceMemberResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def RemoveWorkspaceMember(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/RemoveWorkspaceMember', + openshell__pb2.RemoveWorkspaceMemberRequest.SerializeToString, + openshell__pb2.RemoveWorkspaceMemberResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ListWorkspaceMembers(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.OpenShell/ListWorkspaceMembers', + openshell__pb2.ListWorkspaceMembersRequest.SerializeToString, + openshell__pb2.ListWorkspaceMembersResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + +class SandboxUpdatesStub(object): + """Optional sandbox mutations are separate from OpenShell so existing generated + OpenShell server implementations remain source-compatible. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.UpdateSandbox = channel.unary_unary( + '/openshell.v1.SandboxUpdates/UpdateSandbox', + request_serializer=openshell__pb2.UpdateSandboxRequest.SerializeToString, + response_deserializer=openshell__pb2.SandboxResponse.FromString, + _registered_method=True) + + +class SandboxUpdatesServicer(object): + """Optional sandbox mutations are separate from OpenShell so existing generated + OpenShell server implementations remain source-compatible. + """ + + def UpdateSandbox(self, request, context): + """Update the workload image, command, environment, labels, or annotations of a + stopped sandbox while preserving its identity and retained storage. Requires + compute-driver support for the selected changes and explicit gateway activation + of sandbox updates. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_SandboxUpdatesServicer_to_server(servicer, server): + rpc_method_handlers = { + 'UpdateSandbox': grpc.unary_unary_rpc_method_handler( + servicer.UpdateSandbox, + request_deserializer=openshell__pb2.UpdateSandboxRequest.FromString, + response_serializer=openshell__pb2.SandboxResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'openshell.v1.SandboxUpdates', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('openshell.v1.SandboxUpdates', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class SandboxUpdates(object): + """Optional sandbox mutations are separate from OpenShell so existing generated + OpenShell server implementations remain source-compatible. + """ + + @staticmethod + def UpdateSandbox(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/openshell.v1.SandboxUpdates/UpdateSandbox', + openshell__pb2.UpdateSandboxRequest.SerializeToString, + openshell__pb2.SandboxResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/src/openshell/_proto/openshell_pb2_grpc.pyi b/src/openshell/_proto/openshell_pb2_grpc.pyi new file mode 100644 index 0000000..265d45b --- /dev/null +++ b/src/openshell/_proto/openshell_pb2_grpc.pyi @@ -0,0 +1,1328 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 +""" + +from collections import abc as _abc +from grpc import aio as _aio +import abc as _abc_1 +import grpc as _grpc +from . import openshell_pb2 as _openshell_pb2 +from . import sandbox_pb2 as _sandbox_pb2 +import sys +import typing as _typing + +if sys.version_info >= (3, 11): + from typing import Self as _Self +else: + from typing_extensions import Self as _Self + +_T = _typing.TypeVar("_T") + +class _MaybeAsyncIterator(_abc.AsyncIterator[_T], _abc.Iterator[_T], metaclass=_abc_1.ABCMeta): ... + +class _ServicerContext(_grpc.ServicerContext, _aio.ServicerContext): # type: ignore[misc, type-arg] + ... + +GRPC_GENERATED_VERSION: str +GRPC_VERSION: str + +class OpenShellStub: + """OpenShell service provides sandbox, provider, and runtime management capabilities. + + Conventions: + - This file owns the public API resource model exposed to OpenShell clients. + - `Sandbox`, `SandboxSpec`, `SandboxStatus`, and `SandboxPhase` are gateway-owned + public types. Internal compute drivers must not import or return them directly. + - The gateway translates internal compute-driver observations into these public + resource messages before persisting or returning them to clients. + """ + + @_typing.overload + def __new__(cls, channel: _grpc.Channel) -> _Self: ... + @_typing.overload + def __new__(cls, channel: _aio.Channel) -> OpenShellAsyncStub: ... + Health: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.HealthRequest, _openshell_pb2.HealthResponse] + """Check the health of the service.""" + GetCurrentUser: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetCurrentUserRequest, _openshell_pb2.GetCurrentUserResponse] + """Return the authenticated caller identity established by the gateway.""" + GetGatewayInfo: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetGatewayInfoRequest, _openshell_pb2.GetGatewayInfoResponse] + """Fetch elevated live gateway runtime metadata.""" + CreateSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.CreateSandboxRequest, _openshell_pb2.SandboxResponse] + """Create a new sandbox.""" + BeginRootfsTarStaging: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.BeginRootfsTarStagingRequest, _openshell_pb2.BeginRootfsTarStagingResponse] + """Allocate a gateway-owned staging slot for a local rootfs tar archive. + + The gateway creates a request-scoped directory inside the compute driver's + staging root and returns an opaque single-use token plus the absolute path + the client must write the archive to. The token is then passed as + `template.driver_config..rootfs_tar_staging_token` on + CreateSandbox; callers never name a filesystem path themselves. Only a + client sharing the gateway's filesystem can complete the upload. + """ + GetSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxRequest, _openshell_pb2.SandboxResponse] + """Fetch a sandbox by name.""" + ListSandboxes: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxesRequest, _openshell_pb2.ListSandboxesResponse] + """List sandboxes.""" + CreateSandboxTemplate: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.CreateSandboxTemplateRequest, _openshell_pb2.SandboxTemplateResponse] + """Create a reusable sandbox workload template.""" + GetSandboxTemplate: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxTemplateRequest, _openshell_pb2.SandboxTemplateResponse] + """Fetch a reusable sandbox workload template by name.""" + ListSandboxTemplates: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxTemplatesRequest, _openshell_pb2.ListSandboxTemplatesResponse] + """List reusable sandbox workload templates.""" + DeleteSandboxTemplate: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DeleteSandboxTemplateRequest, _openshell_pb2.DeleteSandboxTemplateResponse] + """Delete a reusable sandbox workload template by name.""" + ListSandboxProviders: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxProvidersRequest, _openshell_pb2.ListSandboxProvidersResponse] + """List provider records attached to a sandbox.""" + AttachSandboxProvider: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.AttachSandboxProviderRequest, _openshell_pb2.AttachSandboxProviderResponse] + """Attach a provider record to an existing sandbox.""" + DetachSandboxProvider: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DetachSandboxProviderRequest, _openshell_pb2.DetachSandboxProviderResponse] + """Detach a provider record from an existing sandbox.""" + GetSandboxProviderStatus: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxProviderStatusRequest, _openshell_pb2.GetSandboxProviderStatusResponse] + """Inspect the installed authority for one sandbox provider mutation.""" + DeleteSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DeleteSandboxRequest, _openshell_pb2.DeleteSandboxResponse] + """Delete a sandbox by name.""" + StopSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.StopSandboxRequest, _openshell_pb2.SandboxResponse] + """Stop a sandbox while retaining its persistent state.""" + StartSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.StartSandboxRequest, _openshell_pb2.SandboxResponse] + """Start a previously stopped sandbox.""" + SuspendSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.SuspendSandboxRequest, _openshell_pb2.SandboxResponse] + """Freeze a ready sandbox and retain its memory state for a later resume. + Requires a compute driver and isolation backend that support state + retention. + """ + ResumeSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ResumeSandboxRequest, _openshell_pb2.SandboxResponse] + """Restore a suspended sandbox in a new runtime generation.""" + CreateSshSession: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.CreateSshSessionRequest, _openshell_pb2.CreateSshSessionResponse] + """Create a short-lived SSH session for a sandbox.""" + ExposeService: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ExposeServiceRequest, _openshell_pb2.ServiceEndpointResponse] + """Create or update a sandbox HTTP service endpoint for local routing.""" + GetService: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetServiceRequest, _openshell_pb2.ServiceEndpointResponse] + """Fetch one sandbox HTTP service endpoint.""" + ListServices: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListServicesRequest, _openshell_pb2.ListServicesResponse] + """List sandbox HTTP service endpoints.""" + DeleteService: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DeleteServiceRequest, _openshell_pb2.DeleteServiceResponse] + """Delete one sandbox HTTP service endpoint.""" + RevokeSshSession: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.RevokeSshSessionRequest, _openshell_pb2.RevokeSshSessionResponse] + """Revoke a previously issued SSH session.""" + ExecSandbox: _grpc.UnaryStreamMultiCallable[_openshell_pb2.ExecSandboxRequest, _openshell_pb2.ExecSandboxEvent] + """Execute a command in a ready sandbox and stream output.""" + ForwardTcp: _grpc.StreamStreamMultiCallable[_openshell_pb2.TcpForwardFrame, _openshell_pb2.TcpForwardFrame] + """Forward one CLI-side TCP connection to a loopback TCP target in a sandbox.""" + ExecSandboxInteractive: _grpc.StreamStreamMultiCallable[_openshell_pb2.ExecSandboxInput, _openshell_pb2.ExecSandboxEvent] + """Execute an interactive command with bidirectional stdin/stdout streaming. + The first client message MUST carry an ExecSandboxInput with the start + variant. Subsequent messages carry stdin bytes or window resize events. + """ + CreateProvider: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.CreateProviderRequest, _openshell_pb2.ProviderResponse] + """Create a provider.""" + GetProvider: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderRequest, _openshell_pb2.ProviderResponse] + """Fetch a provider by name.""" + GetProviderCredentials: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderCredentialsRequest, _openshell_pb2.GetProviderCredentialsResponse] + """Export selected usable runtime credentials. Only directly authenticated + mTLS operators may call this method; refresh material is never returned. + """ + ListProviders: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListProvidersRequest, _openshell_pb2.ListProvidersResponse] + """List providers.""" + ListProviderProfiles: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListProviderProfilesRequest, _openshell_pb2.ListProviderProfilesResponse] + """List available provider type profiles.""" + GetProviderProfile: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderProfileRequest, _openshell_pb2.ProviderProfileResponse] + """Fetch one provider type profile by id.""" + ImportProviderProfiles: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ImportProviderProfilesRequest, _openshell_pb2.ImportProviderProfilesResponse] + """Import custom provider type profiles.""" + UpdateProviderProfiles: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.UpdateProviderProfilesRequest, _openshell_pb2.UpdateProviderProfilesResponse] + """Update an existing custom provider type profile.""" + LintProviderProfiles: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.LintProviderProfilesRequest, _openshell_pb2.LintProviderProfilesResponse] + """Validate provider type profiles without registering them.""" + UpdateProvider: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.UpdateProviderRequest, _openshell_pb2.ProviderResponse] + """Update an existing provider by name.""" + GetProviderRefreshStatus: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderRefreshStatusRequest, _openshell_pb2.GetProviderRefreshStatusResponse] + """Fetch refresh status for one provider or provider credential.""" + ConfigureProviderRefresh: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ConfigureProviderRefreshRequest, _openshell_pb2.ConfigureProviderRefreshResponse] + """Configure gateway-owned refresh material for one provider credential.""" + RotateProviderCredential: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.RotateProviderCredentialRequest, _openshell_pb2.RotateProviderCredentialResponse] + """Record a gateway-owned refresh request for one provider credential.""" + DeleteProviderRefresh: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DeleteProviderRefreshRequest, _openshell_pb2.DeleteProviderRefreshResponse] + """Delete gateway-owned refresh configuration for one provider credential.""" + DeleteProvider: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DeleteProviderRequest, _openshell_pb2.DeleteProviderResponse] + """Delete a provider by name.""" + DeleteProviderProfile: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DeleteProviderProfileRequest, _openshell_pb2.DeleteProviderProfileResponse] + """Delete a custom provider type profile by id.""" + GetSandboxConfig: _grpc.UnaryUnaryMultiCallable[_sandbox_pb2.GetSandboxConfigRequest, _sandbox_pb2.GetSandboxConfigResponse] + """Get sandbox settings by id (called by users, and by supervisors at startup + and in their poll loop). A supervisor whose session pushes configuration + receives later updates over ConnectSupervisor and stops polling. + """ + GetGatewayConfig: _grpc.UnaryUnaryMultiCallable[_sandbox_pb2.GetGatewayConfigRequest, _sandbox_pb2.GetGatewayConfigResponse] + """Get gateway-global settings (read-only runtime configuration; any + authenticated user may read these without requiring Platform Admin). + + Scope-only (no role): scopes are granted by the IdP at token issuance, + orthogonal to workspace membership. Deployments that enable scope + enforcement configure the IdP to grant config:read (or openshell:all) + to all sandbox users, so this does not block least-privilege flows. + """ + UpdateConfig: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.UpdateConfigRequest, _openshell_pb2.UpdateConfigResponse] + """Update settings or policy at sandbox or global scope.""" + GetSandboxPolicyStatus: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxPolicyStatusRequest, _openshell_pb2.GetSandboxPolicyStatusResponse] + """Get the load status of a specific policy version.""" + ListSandboxPolicies: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxPoliciesRequest, _openshell_pb2.ListSandboxPoliciesResponse] + """List policy history for a sandbox.""" + ReportPolicyStatus: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ReportPolicyStatusRequest, _openshell_pb2.ReportPolicyStatusResponse] + """Report policy load result (called by sandbox after reload attempt).""" + ReportEndpointStatus: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ReportEndpointStatusRequest, _openshell_pb2.ReportEndpointStatusResponse] + """Replace the gateway's observed tool server endpoint status for one sandbox.""" + ReportProviderReadiness: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ReportProviderReadinessRequest, _openshell_pb2.ReportProviderReadinessResponse] + """Report installed provider state for the current ConnectSupervisor session. + Replacing or losing that session invalidates its observations. + """ + ReportSandboxConfiguration: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ReportSandboxConfigurationRequest, _openshell_pb2.ReportSandboxConfigurationResponse] + """Register startup and acknowledge an exact validated runtime configuration.""" + GetSandboxProviderEnvironment: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxProviderEnvironmentRequest, _openshell_pb2.GetSandboxProviderEnvironmentResponse] + """Get provider environment for a sandbox (called by the sandbox supervisor at + startup and by its poll loop). Polling projection of the provider + environment delivered over ConnectSupervisor; removed with the polling RPCs. + """ + ExchangeProviderSubjectToken: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ExchangeProviderSubjectTokenRequest, _openshell_pb2.ExchangeProviderSubjectTokenResponse] + """Exchange a stored provider subject token for an intermediate token scoped + to the calling supervisor's SPIFFE identity. + """ + GetSandboxLogs: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxLogsRequest, _openshell_pb2.GetSandboxLogsResponse] + """Fetch recent sandbox logs (one-shot).""" + PushSandboxLogs: _grpc.StreamUnaryMultiCallable[_openshell_pb2.PushSandboxLogsRequest, _openshell_pb2.PushSandboxLogsResponse] + """Push sandbox supervisor logs to the server (client-streaming).""" + ConnectSupervisor: _grpc.StreamStreamMultiCallable[_openshell_pb2.SupervisorMessage, _openshell_pb2.GatewayMessage] + """Persistent supervisor-to-gateway session (bidirectional streaming). + + The supervisor opens this stream at startup and keeps it alive for the + sandbox lifetime. The gateway uses it to coordinate relay channels for + SSH connect, ExecSandbox, targetable sandbox services, and configuration + delivery. Supervisors advertise optional stream features in + SupervisorHello, and the gateway sends only payloads the supervisor + advertises. Raw service bytes flow over RelayStream calls (separate HTTP/2 + streams on the same connection), not over this stream. + """ + ReportMainProcessExit: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ReportMainProcessExitRequest, _openshell_pb2.ReportMainProcessExitResponse] + """Persist the canonical main process result before the supervisor exits.""" + FinalizeMainProcessExit: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.FinalizeMainProcessExitRequest, _openshell_pb2.FinalizeMainProcessExitResponse] + """Confirm that foreground terminal delivery completed naturally.""" + RelayStream: _grpc.StreamStreamMultiCallable[_openshell_pb2.RelayFrame, _openshell_pb2.RelayFrame] + """Raw byte relay between supervisor and gateway. + + The supervisor initiates this call after receiving a RelayOpen message + on its ConnectSupervisor stream. The first RelayFrame carries a + RelayInit with the channel_id to associate the new HTTP/2 stream with + the pending relay slot on the gateway. Subsequent frames carry raw bytes in either + direction between the gateway-side waiter (ForwardTcp / exec handler) + and the supervisor-side target bridge. + + This rides the same TCP+TLS+HTTP/2 connection as ConnectSupervisor — + no new TLS handshake, no reverse HTTP CONNECT. + """ + PeerRelay: _grpc.StreamStreamMultiCallable[_openshell_pb2.PeerRelayFrame, _openshell_pb2.PeerRelayFrame] + """Internal gateway-to-gateway relay forwarding. + + A gateway replica that receives a user request for a sandbox whose + supervisor session is owned by a different replica opens this stream to the + owner. The first frame carries PeerRelayInit; subsequent frames carry raw + bytes in either direction. This RPC is authenticated as a gateway peer, not + as a user or sandbox supervisor. + """ + PeerReportProviderReadiness: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ReportProviderReadinessRequest, _openshell_pb2.ReportProviderReadinessResponse] + """Internal gateway-to-owner forwarding for supervisor-bound state.""" + PeerReportEndpointStatus: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ReportEndpointStatusRequest, _openshell_pb2.ReportEndpointStatusResponse] + PeerGetSandboxProviderStatus: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxProviderStatusRequest, _openshell_pb2.GetSandboxProviderStatusResponse] + PeerNotifyConfigUpdate: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.PeerNotifyConfigUpdateRequest, _openshell_pb2.PeerNotifyConfigUpdateResponse] + """Best-effort notification to the replica that owns a supervisor session. + The receiver rebuilds snapshots from authoritative state. + """ + WatchSandbox: _grpc.UnaryStreamMultiCallable[_openshell_pb2.WatchSandboxRequest, _openshell_pb2.SandboxStreamEvent] + """Watch a sandbox and stream updates. + + This stream can include: + - Sandbox status snapshots (phase/status) + - OpenShell server process logs correlated by sandbox_id + - Platform events correlated to the sandbox + """ + SubmitPolicyAnalysis: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.SubmitPolicyAnalysisRequest, _openshell_pb2.SubmitPolicyAnalysisResponse] + """--------------------------------------------------------------------------- + Draft policy recommendation RPCs + --------------------------------------------------------------------------- + + Submit denial analysis results from sandbox (summaries + proposed chunks). + """ + GetDraftPolicy: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetDraftPolicyRequest, _openshell_pb2.GetDraftPolicyResponse] + """Get draft policy recommendations for a sandbox.""" + ApproveDraftChunk: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ApproveDraftChunkRequest, _openshell_pb2.ApproveDraftChunkResponse] + """Approve a single draft policy chunk (merges into active policy).""" + RejectDraftChunk: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.RejectDraftChunkRequest, _openshell_pb2.RejectDraftChunkResponse] + """Reject a single draft policy chunk.""" + ApproveAllDraftChunks: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ApproveAllDraftChunksRequest, _openshell_pb2.ApproveAllDraftChunksResponse] + """Approve all pending draft chunks (skips security-flagged unless forced).""" + EditDraftChunk: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.EditDraftChunkRequest, _openshell_pb2.EditDraftChunkResponse] + """Edit a pending draft chunk in-place (e.g. narrow allowed_ips).""" + UndoDraftChunk: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.UndoDraftChunkRequest, _openshell_pb2.UndoDraftChunkResponse] + """Reverse an approval (remove merged rule from active policy).""" + ClearDraftChunks: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ClearDraftChunksRequest, _openshell_pb2.ClearDraftChunksResponse] + """Clear all pending draft chunks for a sandbox.""" + GetDraftHistory: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetDraftHistoryRequest, _openshell_pb2.GetDraftHistoryResponse] + """Get decision history for a sandbox's draft policy.""" + IssueSandboxToken: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.IssueSandboxTokenRequest, _openshell_pb2.IssueSandboxTokenResponse] + """Exchange a sandbox-bootstrap credential (e.g. a Kubernetes projected + ServiceAccount token) for a gateway-minted JWT bound to the calling + sandbox's UUID. Used by the Kubernetes driver path; singleplayer + drivers receive the gateway JWT directly from the create-sandbox flow + and never call this RPC. + """ + RefreshSandboxToken: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.RefreshSandboxTokenRequest, _openshell_pb2.RefreshSandboxTokenResponse] + """Renew the calling sandbox's gateway JWT. Older tokens remain valid + until their own expiry; deployments should keep token TTLs short to + bound replay exposure. The supervisor calls this from a background + task at ~80% of the token's lifetime; the new token is cached in + memory only — the on-disk bootstrap file is intentionally not + rewritten. + """ + CreateWorkspace: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.CreateWorkspaceRequest, _openshell_pb2.CreateWorkspaceResponse] + """--------------------------------------------------------------------------- + Workspace management RPCs + --------------------------------------------------------------------------- + + Create a workspace. + """ + GetWorkspace: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.GetWorkspaceRequest, _openshell_pb2.GetWorkspaceResponse] + """Fetch a workspace by name.""" + ListWorkspaces: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListWorkspacesRequest, _openshell_pb2.ListWorkspacesResponse] + """List workspaces.""" + DeleteWorkspace: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.DeleteWorkspaceRequest, _openshell_pb2.DeleteWorkspaceResponse] + """Delete a workspace by name.""" + AddWorkspaceMember: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.AddWorkspaceMemberRequest, _openshell_pb2.AddWorkspaceMemberResponse] + """Add a member to a workspace.""" + RemoveWorkspaceMember: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.RemoveWorkspaceMemberRequest, _openshell_pb2.RemoveWorkspaceMemberResponse] + """Remove a member from a workspace.""" + ListWorkspaceMembers: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.ListWorkspaceMembersRequest, _openshell_pb2.ListWorkspaceMembersResponse] + """List members of a workspace.""" + +@_typing.type_check_only +class OpenShellAsyncStub(OpenShellStub): + """OpenShell service provides sandbox, provider, and runtime management capabilities. + + Conventions: + - This file owns the public API resource model exposed to OpenShell clients. + - `Sandbox`, `SandboxSpec`, `SandboxStatus`, and `SandboxPhase` are gateway-owned + public types. Internal compute drivers must not import or return them directly. + - The gateway translates internal compute-driver observations into these public + resource messages before persisting or returning them to clients. + """ + + def __init__(self, channel: _aio.Channel) -> None: ... + Health: _aio.UnaryUnaryMultiCallable[_openshell_pb2.HealthRequest, _openshell_pb2.HealthResponse] # type: ignore[assignment] + """Check the health of the service.""" + GetCurrentUser: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetCurrentUserRequest, _openshell_pb2.GetCurrentUserResponse] # type: ignore[assignment] + """Return the authenticated caller identity established by the gateway.""" + GetGatewayInfo: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetGatewayInfoRequest, _openshell_pb2.GetGatewayInfoResponse] # type: ignore[assignment] + """Fetch elevated live gateway runtime metadata.""" + CreateSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.CreateSandboxRequest, _openshell_pb2.SandboxResponse] # type: ignore[assignment] + """Create a new sandbox.""" + BeginRootfsTarStaging: _aio.UnaryUnaryMultiCallable[_openshell_pb2.BeginRootfsTarStagingRequest, _openshell_pb2.BeginRootfsTarStagingResponse] # type: ignore[assignment] + """Allocate a gateway-owned staging slot for a local rootfs tar archive. + + The gateway creates a request-scoped directory inside the compute driver's + staging root and returns an opaque single-use token plus the absolute path + the client must write the archive to. The token is then passed as + `template.driver_config..rootfs_tar_staging_token` on + CreateSandbox; callers never name a filesystem path themselves. Only a + client sharing the gateway's filesystem can complete the upload. + """ + GetSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxRequest, _openshell_pb2.SandboxResponse] # type: ignore[assignment] + """Fetch a sandbox by name.""" + ListSandboxes: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxesRequest, _openshell_pb2.ListSandboxesResponse] # type: ignore[assignment] + """List sandboxes.""" + CreateSandboxTemplate: _aio.UnaryUnaryMultiCallable[_openshell_pb2.CreateSandboxTemplateRequest, _openshell_pb2.SandboxTemplateResponse] # type: ignore[assignment] + """Create a reusable sandbox workload template.""" + GetSandboxTemplate: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxTemplateRequest, _openshell_pb2.SandboxTemplateResponse] # type: ignore[assignment] + """Fetch a reusable sandbox workload template by name.""" + ListSandboxTemplates: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxTemplatesRequest, _openshell_pb2.ListSandboxTemplatesResponse] # type: ignore[assignment] + """List reusable sandbox workload templates.""" + DeleteSandboxTemplate: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DeleteSandboxTemplateRequest, _openshell_pb2.DeleteSandboxTemplateResponse] # type: ignore[assignment] + """Delete a reusable sandbox workload template by name.""" + ListSandboxProviders: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxProvidersRequest, _openshell_pb2.ListSandboxProvidersResponse] # type: ignore[assignment] + """List provider records attached to a sandbox.""" + AttachSandboxProvider: _aio.UnaryUnaryMultiCallable[_openshell_pb2.AttachSandboxProviderRequest, _openshell_pb2.AttachSandboxProviderResponse] # type: ignore[assignment] + """Attach a provider record to an existing sandbox.""" + DetachSandboxProvider: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DetachSandboxProviderRequest, _openshell_pb2.DetachSandboxProviderResponse] # type: ignore[assignment] + """Detach a provider record from an existing sandbox.""" + GetSandboxProviderStatus: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxProviderStatusRequest, _openshell_pb2.GetSandboxProviderStatusResponse] # type: ignore[assignment] + """Inspect the installed authority for one sandbox provider mutation.""" + DeleteSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DeleteSandboxRequest, _openshell_pb2.DeleteSandboxResponse] # type: ignore[assignment] + """Delete a sandbox by name.""" + StopSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.StopSandboxRequest, _openshell_pb2.SandboxResponse] # type: ignore[assignment] + """Stop a sandbox while retaining its persistent state.""" + StartSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.StartSandboxRequest, _openshell_pb2.SandboxResponse] # type: ignore[assignment] + """Start a previously stopped sandbox.""" + SuspendSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.SuspendSandboxRequest, _openshell_pb2.SandboxResponse] # type: ignore[assignment] + """Freeze a ready sandbox and retain its memory state for a later resume. + Requires a compute driver and isolation backend that support state + retention. + """ + ResumeSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ResumeSandboxRequest, _openshell_pb2.SandboxResponse] # type: ignore[assignment] + """Restore a suspended sandbox in a new runtime generation.""" + CreateSshSession: _aio.UnaryUnaryMultiCallable[_openshell_pb2.CreateSshSessionRequest, _openshell_pb2.CreateSshSessionResponse] # type: ignore[assignment] + """Create a short-lived SSH session for a sandbox.""" + ExposeService: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ExposeServiceRequest, _openshell_pb2.ServiceEndpointResponse] # type: ignore[assignment] + """Create or update a sandbox HTTP service endpoint for local routing.""" + GetService: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetServiceRequest, _openshell_pb2.ServiceEndpointResponse] # type: ignore[assignment] + """Fetch one sandbox HTTP service endpoint.""" + ListServices: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListServicesRequest, _openshell_pb2.ListServicesResponse] # type: ignore[assignment] + """List sandbox HTTP service endpoints.""" + DeleteService: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DeleteServiceRequest, _openshell_pb2.DeleteServiceResponse] # type: ignore[assignment] + """Delete one sandbox HTTP service endpoint.""" + RevokeSshSession: _aio.UnaryUnaryMultiCallable[_openshell_pb2.RevokeSshSessionRequest, _openshell_pb2.RevokeSshSessionResponse] # type: ignore[assignment] + """Revoke a previously issued SSH session.""" + ExecSandbox: _aio.UnaryStreamMultiCallable[_openshell_pb2.ExecSandboxRequest, _openshell_pb2.ExecSandboxEvent] # type: ignore[assignment] + """Execute a command in a ready sandbox and stream output.""" + ForwardTcp: _aio.StreamStreamMultiCallable[_openshell_pb2.TcpForwardFrame, _openshell_pb2.TcpForwardFrame] # type: ignore[assignment] + """Forward one CLI-side TCP connection to a loopback TCP target in a sandbox.""" + ExecSandboxInteractive: _aio.StreamStreamMultiCallable[_openshell_pb2.ExecSandboxInput, _openshell_pb2.ExecSandboxEvent] # type: ignore[assignment] + """Execute an interactive command with bidirectional stdin/stdout streaming. + The first client message MUST carry an ExecSandboxInput with the start + variant. Subsequent messages carry stdin bytes or window resize events. + """ + CreateProvider: _aio.UnaryUnaryMultiCallable[_openshell_pb2.CreateProviderRequest, _openshell_pb2.ProviderResponse] # type: ignore[assignment] + """Create a provider.""" + GetProvider: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderRequest, _openshell_pb2.ProviderResponse] # type: ignore[assignment] + """Fetch a provider by name.""" + GetProviderCredentials: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderCredentialsRequest, _openshell_pb2.GetProviderCredentialsResponse] # type: ignore[assignment] + """Export selected usable runtime credentials. Only directly authenticated + mTLS operators may call this method; refresh material is never returned. + """ + ListProviders: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListProvidersRequest, _openshell_pb2.ListProvidersResponse] # type: ignore[assignment] + """List providers.""" + ListProviderProfiles: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListProviderProfilesRequest, _openshell_pb2.ListProviderProfilesResponse] # type: ignore[assignment] + """List available provider type profiles.""" + GetProviderProfile: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderProfileRequest, _openshell_pb2.ProviderProfileResponse] # type: ignore[assignment] + """Fetch one provider type profile by id.""" + ImportProviderProfiles: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ImportProviderProfilesRequest, _openshell_pb2.ImportProviderProfilesResponse] # type: ignore[assignment] + """Import custom provider type profiles.""" + UpdateProviderProfiles: _aio.UnaryUnaryMultiCallable[_openshell_pb2.UpdateProviderProfilesRequest, _openshell_pb2.UpdateProviderProfilesResponse] # type: ignore[assignment] + """Update an existing custom provider type profile.""" + LintProviderProfiles: _aio.UnaryUnaryMultiCallable[_openshell_pb2.LintProviderProfilesRequest, _openshell_pb2.LintProviderProfilesResponse] # type: ignore[assignment] + """Validate provider type profiles without registering them.""" + UpdateProvider: _aio.UnaryUnaryMultiCallable[_openshell_pb2.UpdateProviderRequest, _openshell_pb2.ProviderResponse] # type: ignore[assignment] + """Update an existing provider by name.""" + GetProviderRefreshStatus: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetProviderRefreshStatusRequest, _openshell_pb2.GetProviderRefreshStatusResponse] # type: ignore[assignment] + """Fetch refresh status for one provider or provider credential.""" + ConfigureProviderRefresh: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ConfigureProviderRefreshRequest, _openshell_pb2.ConfigureProviderRefreshResponse] # type: ignore[assignment] + """Configure gateway-owned refresh material for one provider credential.""" + RotateProviderCredential: _aio.UnaryUnaryMultiCallable[_openshell_pb2.RotateProviderCredentialRequest, _openshell_pb2.RotateProviderCredentialResponse] # type: ignore[assignment] + """Record a gateway-owned refresh request for one provider credential.""" + DeleteProviderRefresh: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DeleteProviderRefreshRequest, _openshell_pb2.DeleteProviderRefreshResponse] # type: ignore[assignment] + """Delete gateway-owned refresh configuration for one provider credential.""" + DeleteProvider: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DeleteProviderRequest, _openshell_pb2.DeleteProviderResponse] # type: ignore[assignment] + """Delete a provider by name.""" + DeleteProviderProfile: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DeleteProviderProfileRequest, _openshell_pb2.DeleteProviderProfileResponse] # type: ignore[assignment] + """Delete a custom provider type profile by id.""" + GetSandboxConfig: _aio.UnaryUnaryMultiCallable[_sandbox_pb2.GetSandboxConfigRequest, _sandbox_pb2.GetSandboxConfigResponse] # type: ignore[assignment] + """Get sandbox settings by id (called by users, and by supervisors at startup + and in their poll loop). A supervisor whose session pushes configuration + receives later updates over ConnectSupervisor and stops polling. + """ + GetGatewayConfig: _aio.UnaryUnaryMultiCallable[_sandbox_pb2.GetGatewayConfigRequest, _sandbox_pb2.GetGatewayConfigResponse] # type: ignore[assignment] + """Get gateway-global settings (read-only runtime configuration; any + authenticated user may read these without requiring Platform Admin). + + Scope-only (no role): scopes are granted by the IdP at token issuance, + orthogonal to workspace membership. Deployments that enable scope + enforcement configure the IdP to grant config:read (or openshell:all) + to all sandbox users, so this does not block least-privilege flows. + """ + UpdateConfig: _aio.UnaryUnaryMultiCallable[_openshell_pb2.UpdateConfigRequest, _openshell_pb2.UpdateConfigResponse] # type: ignore[assignment] + """Update settings or policy at sandbox or global scope.""" + GetSandboxPolicyStatus: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxPolicyStatusRequest, _openshell_pb2.GetSandboxPolicyStatusResponse] # type: ignore[assignment] + """Get the load status of a specific policy version.""" + ListSandboxPolicies: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListSandboxPoliciesRequest, _openshell_pb2.ListSandboxPoliciesResponse] # type: ignore[assignment] + """List policy history for a sandbox.""" + ReportPolicyStatus: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ReportPolicyStatusRequest, _openshell_pb2.ReportPolicyStatusResponse] # type: ignore[assignment] + """Report policy load result (called by sandbox after reload attempt).""" + ReportEndpointStatus: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ReportEndpointStatusRequest, _openshell_pb2.ReportEndpointStatusResponse] # type: ignore[assignment] + """Replace the gateway's observed tool server endpoint status for one sandbox.""" + ReportProviderReadiness: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ReportProviderReadinessRequest, _openshell_pb2.ReportProviderReadinessResponse] # type: ignore[assignment] + """Report installed provider state for the current ConnectSupervisor session. + Replacing or losing that session invalidates its observations. + """ + ReportSandboxConfiguration: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ReportSandboxConfigurationRequest, _openshell_pb2.ReportSandboxConfigurationResponse] # type: ignore[assignment] + """Register startup and acknowledge an exact validated runtime configuration.""" + GetSandboxProviderEnvironment: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxProviderEnvironmentRequest, _openshell_pb2.GetSandboxProviderEnvironmentResponse] # type: ignore[assignment] + """Get provider environment for a sandbox (called by the sandbox supervisor at + startup and by its poll loop). Polling projection of the provider + environment delivered over ConnectSupervisor; removed with the polling RPCs. + """ + ExchangeProviderSubjectToken: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ExchangeProviderSubjectTokenRequest, _openshell_pb2.ExchangeProviderSubjectTokenResponse] # type: ignore[assignment] + """Exchange a stored provider subject token for an intermediate token scoped + to the calling supervisor's SPIFFE identity. + """ + GetSandboxLogs: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxLogsRequest, _openshell_pb2.GetSandboxLogsResponse] # type: ignore[assignment] + """Fetch recent sandbox logs (one-shot).""" + PushSandboxLogs: _aio.StreamUnaryMultiCallable[_openshell_pb2.PushSandboxLogsRequest, _openshell_pb2.PushSandboxLogsResponse] # type: ignore[assignment] + """Push sandbox supervisor logs to the server (client-streaming).""" + ConnectSupervisor: _aio.StreamStreamMultiCallable[_openshell_pb2.SupervisorMessage, _openshell_pb2.GatewayMessage] # type: ignore[assignment] + """Persistent supervisor-to-gateway session (bidirectional streaming). + + The supervisor opens this stream at startup and keeps it alive for the + sandbox lifetime. The gateway uses it to coordinate relay channels for + SSH connect, ExecSandbox, targetable sandbox services, and configuration + delivery. Supervisors advertise optional stream features in + SupervisorHello, and the gateway sends only payloads the supervisor + advertises. Raw service bytes flow over RelayStream calls (separate HTTP/2 + streams on the same connection), not over this stream. + """ + ReportMainProcessExit: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ReportMainProcessExitRequest, _openshell_pb2.ReportMainProcessExitResponse] # type: ignore[assignment] + """Persist the canonical main process result before the supervisor exits.""" + FinalizeMainProcessExit: _aio.UnaryUnaryMultiCallable[_openshell_pb2.FinalizeMainProcessExitRequest, _openshell_pb2.FinalizeMainProcessExitResponse] # type: ignore[assignment] + """Confirm that foreground terminal delivery completed naturally.""" + RelayStream: _aio.StreamStreamMultiCallable[_openshell_pb2.RelayFrame, _openshell_pb2.RelayFrame] # type: ignore[assignment] + """Raw byte relay between supervisor and gateway. + + The supervisor initiates this call after receiving a RelayOpen message + on its ConnectSupervisor stream. The first RelayFrame carries a + RelayInit with the channel_id to associate the new HTTP/2 stream with + the pending relay slot on the gateway. Subsequent frames carry raw bytes in either + direction between the gateway-side waiter (ForwardTcp / exec handler) + and the supervisor-side target bridge. + + This rides the same TCP+TLS+HTTP/2 connection as ConnectSupervisor — + no new TLS handshake, no reverse HTTP CONNECT. + """ + PeerRelay: _aio.StreamStreamMultiCallable[_openshell_pb2.PeerRelayFrame, _openshell_pb2.PeerRelayFrame] # type: ignore[assignment] + """Internal gateway-to-gateway relay forwarding. + + A gateway replica that receives a user request for a sandbox whose + supervisor session is owned by a different replica opens this stream to the + owner. The first frame carries PeerRelayInit; subsequent frames carry raw + bytes in either direction. This RPC is authenticated as a gateway peer, not + as a user or sandbox supervisor. + """ + PeerReportProviderReadiness: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ReportProviderReadinessRequest, _openshell_pb2.ReportProviderReadinessResponse] # type: ignore[assignment] + """Internal gateway-to-owner forwarding for supervisor-bound state.""" + PeerReportEndpointStatus: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ReportEndpointStatusRequest, _openshell_pb2.ReportEndpointStatusResponse] # type: ignore[assignment] + PeerGetSandboxProviderStatus: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetSandboxProviderStatusRequest, _openshell_pb2.GetSandboxProviderStatusResponse] # type: ignore[assignment] + PeerNotifyConfigUpdate: _aio.UnaryUnaryMultiCallable[_openshell_pb2.PeerNotifyConfigUpdateRequest, _openshell_pb2.PeerNotifyConfigUpdateResponse] # type: ignore[assignment] + """Best-effort notification to the replica that owns a supervisor session. + The receiver rebuilds snapshots from authoritative state. + """ + WatchSandbox: _aio.UnaryStreamMultiCallable[_openshell_pb2.WatchSandboxRequest, _openshell_pb2.SandboxStreamEvent] # type: ignore[assignment] + """Watch a sandbox and stream updates. + + This stream can include: + - Sandbox status snapshots (phase/status) + - OpenShell server process logs correlated by sandbox_id + - Platform events correlated to the sandbox + """ + SubmitPolicyAnalysis: _aio.UnaryUnaryMultiCallable[_openshell_pb2.SubmitPolicyAnalysisRequest, _openshell_pb2.SubmitPolicyAnalysisResponse] # type: ignore[assignment] + """--------------------------------------------------------------------------- + Draft policy recommendation RPCs + --------------------------------------------------------------------------- + + Submit denial analysis results from sandbox (summaries + proposed chunks). + """ + GetDraftPolicy: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetDraftPolicyRequest, _openshell_pb2.GetDraftPolicyResponse] # type: ignore[assignment] + """Get draft policy recommendations for a sandbox.""" + ApproveDraftChunk: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ApproveDraftChunkRequest, _openshell_pb2.ApproveDraftChunkResponse] # type: ignore[assignment] + """Approve a single draft policy chunk (merges into active policy).""" + RejectDraftChunk: _aio.UnaryUnaryMultiCallable[_openshell_pb2.RejectDraftChunkRequest, _openshell_pb2.RejectDraftChunkResponse] # type: ignore[assignment] + """Reject a single draft policy chunk.""" + ApproveAllDraftChunks: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ApproveAllDraftChunksRequest, _openshell_pb2.ApproveAllDraftChunksResponse] # type: ignore[assignment] + """Approve all pending draft chunks (skips security-flagged unless forced).""" + EditDraftChunk: _aio.UnaryUnaryMultiCallable[_openshell_pb2.EditDraftChunkRequest, _openshell_pb2.EditDraftChunkResponse] # type: ignore[assignment] + """Edit a pending draft chunk in-place (e.g. narrow allowed_ips).""" + UndoDraftChunk: _aio.UnaryUnaryMultiCallable[_openshell_pb2.UndoDraftChunkRequest, _openshell_pb2.UndoDraftChunkResponse] # type: ignore[assignment] + """Reverse an approval (remove merged rule from active policy).""" + ClearDraftChunks: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ClearDraftChunksRequest, _openshell_pb2.ClearDraftChunksResponse] # type: ignore[assignment] + """Clear all pending draft chunks for a sandbox.""" + GetDraftHistory: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetDraftHistoryRequest, _openshell_pb2.GetDraftHistoryResponse] # type: ignore[assignment] + """Get decision history for a sandbox's draft policy.""" + IssueSandboxToken: _aio.UnaryUnaryMultiCallable[_openshell_pb2.IssueSandboxTokenRequest, _openshell_pb2.IssueSandboxTokenResponse] # type: ignore[assignment] + """Exchange a sandbox-bootstrap credential (e.g. a Kubernetes projected + ServiceAccount token) for a gateway-minted JWT bound to the calling + sandbox's UUID. Used by the Kubernetes driver path; singleplayer + drivers receive the gateway JWT directly from the create-sandbox flow + and never call this RPC. + """ + RefreshSandboxToken: _aio.UnaryUnaryMultiCallable[_openshell_pb2.RefreshSandboxTokenRequest, _openshell_pb2.RefreshSandboxTokenResponse] # type: ignore[assignment] + """Renew the calling sandbox's gateway JWT. Older tokens remain valid + until their own expiry; deployments should keep token TTLs short to + bound replay exposure. The supervisor calls this from a background + task at ~80% of the token's lifetime; the new token is cached in + memory only — the on-disk bootstrap file is intentionally not + rewritten. + """ + CreateWorkspace: _aio.UnaryUnaryMultiCallable[_openshell_pb2.CreateWorkspaceRequest, _openshell_pb2.CreateWorkspaceResponse] # type: ignore[assignment] + """--------------------------------------------------------------------------- + Workspace management RPCs + --------------------------------------------------------------------------- + + Create a workspace. + """ + GetWorkspace: _aio.UnaryUnaryMultiCallable[_openshell_pb2.GetWorkspaceRequest, _openshell_pb2.GetWorkspaceResponse] # type: ignore[assignment] + """Fetch a workspace by name.""" + ListWorkspaces: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListWorkspacesRequest, _openshell_pb2.ListWorkspacesResponse] # type: ignore[assignment] + """List workspaces.""" + DeleteWorkspace: _aio.UnaryUnaryMultiCallable[_openshell_pb2.DeleteWorkspaceRequest, _openshell_pb2.DeleteWorkspaceResponse] # type: ignore[assignment] + """Delete a workspace by name.""" + AddWorkspaceMember: _aio.UnaryUnaryMultiCallable[_openshell_pb2.AddWorkspaceMemberRequest, _openshell_pb2.AddWorkspaceMemberResponse] # type: ignore[assignment] + """Add a member to a workspace.""" + RemoveWorkspaceMember: _aio.UnaryUnaryMultiCallable[_openshell_pb2.RemoveWorkspaceMemberRequest, _openshell_pb2.RemoveWorkspaceMemberResponse] # type: ignore[assignment] + """Remove a member from a workspace.""" + ListWorkspaceMembers: _aio.UnaryUnaryMultiCallable[_openshell_pb2.ListWorkspaceMembersRequest, _openshell_pb2.ListWorkspaceMembersResponse] # type: ignore[assignment] + """List members of a workspace.""" + +class OpenShellServicer: + """OpenShell service provides sandbox, provider, and runtime management capabilities. + + Conventions: + - This file owns the public API resource model exposed to OpenShell clients. + - `Sandbox`, `SandboxSpec`, `SandboxStatus`, and `SandboxPhase` are gateway-owned + public types. Internal compute drivers must not import or return them directly. + - The gateway translates internal compute-driver observations into these public + resource messages before persisting or returning them to clients. + """ + + def Health( + self, + request: _openshell_pb2.HealthRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.HealthResponse, _abc.Awaitable[_openshell_pb2.HealthResponse]]: + """Check the health of the service.""" + + def GetCurrentUser( + self, + request: _openshell_pb2.GetCurrentUserRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetCurrentUserResponse, _abc.Awaitable[_openshell_pb2.GetCurrentUserResponse]]: + """Return the authenticated caller identity established by the gateway.""" + + def GetGatewayInfo( + self, + request: _openshell_pb2.GetGatewayInfoRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetGatewayInfoResponse, _abc.Awaitable[_openshell_pb2.GetGatewayInfoResponse]]: + """Fetch elevated live gateway runtime metadata.""" + + def CreateSandbox( + self, + request: _openshell_pb2.CreateSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxResponse, _abc.Awaitable[_openshell_pb2.SandboxResponse]]: + """Create a new sandbox.""" + + def BeginRootfsTarStaging( + self, + request: _openshell_pb2.BeginRootfsTarStagingRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.BeginRootfsTarStagingResponse, _abc.Awaitable[_openshell_pb2.BeginRootfsTarStagingResponse]]: + """Allocate a gateway-owned staging slot for a local rootfs tar archive. + + The gateway creates a request-scoped directory inside the compute driver's + staging root and returns an opaque single-use token plus the absolute path + the client must write the archive to. The token is then passed as + `template.driver_config..rootfs_tar_staging_token` on + CreateSandbox; callers never name a filesystem path themselves. Only a + client sharing the gateway's filesystem can complete the upload. + """ + + def GetSandbox( + self, + request: _openshell_pb2.GetSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxResponse, _abc.Awaitable[_openshell_pb2.SandboxResponse]]: + """Fetch a sandbox by name.""" + + def ListSandboxes( + self, + request: _openshell_pb2.ListSandboxesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListSandboxesResponse, _abc.Awaitable[_openshell_pb2.ListSandboxesResponse]]: + """List sandboxes.""" + + def CreateSandboxTemplate( + self, + request: _openshell_pb2.CreateSandboxTemplateRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxTemplateResponse, _abc.Awaitable[_openshell_pb2.SandboxTemplateResponse]]: + """Create a reusable sandbox workload template.""" + + def GetSandboxTemplate( + self, + request: _openshell_pb2.GetSandboxTemplateRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxTemplateResponse, _abc.Awaitable[_openshell_pb2.SandboxTemplateResponse]]: + """Fetch a reusable sandbox workload template by name.""" + + def ListSandboxTemplates( + self, + request: _openshell_pb2.ListSandboxTemplatesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListSandboxTemplatesResponse, _abc.Awaitable[_openshell_pb2.ListSandboxTemplatesResponse]]: + """List reusable sandbox workload templates.""" + + def DeleteSandboxTemplate( + self, + request: _openshell_pb2.DeleteSandboxTemplateRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DeleteSandboxTemplateResponse, _abc.Awaitable[_openshell_pb2.DeleteSandboxTemplateResponse]]: + """Delete a reusable sandbox workload template by name.""" + + def ListSandboxProviders( + self, + request: _openshell_pb2.ListSandboxProvidersRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListSandboxProvidersResponse, _abc.Awaitable[_openshell_pb2.ListSandboxProvidersResponse]]: + """List provider records attached to a sandbox.""" + + def AttachSandboxProvider( + self, + request: _openshell_pb2.AttachSandboxProviderRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.AttachSandboxProviderResponse, _abc.Awaitable[_openshell_pb2.AttachSandboxProviderResponse]]: + """Attach a provider record to an existing sandbox.""" + + def DetachSandboxProvider( + self, + request: _openshell_pb2.DetachSandboxProviderRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DetachSandboxProviderResponse, _abc.Awaitable[_openshell_pb2.DetachSandboxProviderResponse]]: + """Detach a provider record from an existing sandbox.""" + + def GetSandboxProviderStatus( + self, + request: _openshell_pb2.GetSandboxProviderStatusRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetSandboxProviderStatusResponse, _abc.Awaitable[_openshell_pb2.GetSandboxProviderStatusResponse]]: + """Inspect the installed authority for one sandbox provider mutation.""" + + def DeleteSandbox( + self, + request: _openshell_pb2.DeleteSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DeleteSandboxResponse, _abc.Awaitable[_openshell_pb2.DeleteSandboxResponse]]: + """Delete a sandbox by name.""" + + def StopSandbox( + self, + request: _openshell_pb2.StopSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxResponse, _abc.Awaitable[_openshell_pb2.SandboxResponse]]: + """Stop a sandbox while retaining its persistent state.""" + + def StartSandbox( + self, + request: _openshell_pb2.StartSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxResponse, _abc.Awaitable[_openshell_pb2.SandboxResponse]]: + """Start a previously stopped sandbox.""" + + def SuspendSandbox( + self, + request: _openshell_pb2.SuspendSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxResponse, _abc.Awaitable[_openshell_pb2.SandboxResponse]]: + """Freeze a ready sandbox and retain its memory state for a later resume. + Requires a compute driver and isolation backend that support state + retention. + """ + + def ResumeSandbox( + self, + request: _openshell_pb2.ResumeSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxResponse, _abc.Awaitable[_openshell_pb2.SandboxResponse]]: + """Restore a suspended sandbox in a new runtime generation.""" + + def CreateSshSession( + self, + request: _openshell_pb2.CreateSshSessionRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.CreateSshSessionResponse, _abc.Awaitable[_openshell_pb2.CreateSshSessionResponse]]: + """Create a short-lived SSH session for a sandbox.""" + + def ExposeService( + self, + request: _openshell_pb2.ExposeServiceRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ServiceEndpointResponse, _abc.Awaitable[_openshell_pb2.ServiceEndpointResponse]]: + """Create or update a sandbox HTTP service endpoint for local routing.""" + + def GetService( + self, + request: _openshell_pb2.GetServiceRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ServiceEndpointResponse, _abc.Awaitable[_openshell_pb2.ServiceEndpointResponse]]: + """Fetch one sandbox HTTP service endpoint.""" + + def ListServices( + self, + request: _openshell_pb2.ListServicesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListServicesResponse, _abc.Awaitable[_openshell_pb2.ListServicesResponse]]: + """List sandbox HTTP service endpoints.""" + + def DeleteService( + self, + request: _openshell_pb2.DeleteServiceRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DeleteServiceResponse, _abc.Awaitable[_openshell_pb2.DeleteServiceResponse]]: + """Delete one sandbox HTTP service endpoint.""" + + def RevokeSshSession( + self, + request: _openshell_pb2.RevokeSshSessionRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.RevokeSshSessionResponse, _abc.Awaitable[_openshell_pb2.RevokeSshSessionResponse]]: + """Revoke a previously issued SSH session.""" + + def ExecSandbox( + self, + request: _openshell_pb2.ExecSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_abc.Iterator[_openshell_pb2.ExecSandboxEvent], _abc.AsyncIterator[_openshell_pb2.ExecSandboxEvent]]: + """Execute a command in a ready sandbox and stream output.""" + + def ForwardTcp( + self, + request_iterator: _MaybeAsyncIterator[_openshell_pb2.TcpForwardFrame], + context: _ServicerContext, + ) -> _typing.Union[_abc.Iterator[_openshell_pb2.TcpForwardFrame], _abc.AsyncIterator[_openshell_pb2.TcpForwardFrame]]: + """Forward one CLI-side TCP connection to a loopback TCP target in a sandbox.""" + + def ExecSandboxInteractive( + self, + request_iterator: _MaybeAsyncIterator[_openshell_pb2.ExecSandboxInput], + context: _ServicerContext, + ) -> _typing.Union[_abc.Iterator[_openshell_pb2.ExecSandboxEvent], _abc.AsyncIterator[_openshell_pb2.ExecSandboxEvent]]: + """Execute an interactive command with bidirectional stdin/stdout streaming. + The first client message MUST carry an ExecSandboxInput with the start + variant. Subsequent messages carry stdin bytes or window resize events. + """ + + def CreateProvider( + self, + request: _openshell_pb2.CreateProviderRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ProviderResponse, _abc.Awaitable[_openshell_pb2.ProviderResponse]]: + """Create a provider.""" + + def GetProvider( + self, + request: _openshell_pb2.GetProviderRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ProviderResponse, _abc.Awaitable[_openshell_pb2.ProviderResponse]]: + """Fetch a provider by name.""" + + def GetProviderCredentials( + self, + request: _openshell_pb2.GetProviderCredentialsRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetProviderCredentialsResponse, _abc.Awaitable[_openshell_pb2.GetProviderCredentialsResponse]]: + """Export selected usable runtime credentials. Only directly authenticated + mTLS operators may call this method; refresh material is never returned. + """ + + def ListProviders( + self, + request: _openshell_pb2.ListProvidersRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListProvidersResponse, _abc.Awaitable[_openshell_pb2.ListProvidersResponse]]: + """List providers.""" + + def ListProviderProfiles( + self, + request: _openshell_pb2.ListProviderProfilesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListProviderProfilesResponse, _abc.Awaitable[_openshell_pb2.ListProviderProfilesResponse]]: + """List available provider type profiles.""" + + def GetProviderProfile( + self, + request: _openshell_pb2.GetProviderProfileRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ProviderProfileResponse, _abc.Awaitable[_openshell_pb2.ProviderProfileResponse]]: + """Fetch one provider type profile by id.""" + + def ImportProviderProfiles( + self, + request: _openshell_pb2.ImportProviderProfilesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ImportProviderProfilesResponse, _abc.Awaitable[_openshell_pb2.ImportProviderProfilesResponse]]: + """Import custom provider type profiles.""" + + def UpdateProviderProfiles( + self, + request: _openshell_pb2.UpdateProviderProfilesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.UpdateProviderProfilesResponse, _abc.Awaitable[_openshell_pb2.UpdateProviderProfilesResponse]]: + """Update an existing custom provider type profile.""" + + def LintProviderProfiles( + self, + request: _openshell_pb2.LintProviderProfilesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.LintProviderProfilesResponse, _abc.Awaitable[_openshell_pb2.LintProviderProfilesResponse]]: + """Validate provider type profiles without registering them.""" + + def UpdateProvider( + self, + request: _openshell_pb2.UpdateProviderRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ProviderResponse, _abc.Awaitable[_openshell_pb2.ProviderResponse]]: + """Update an existing provider by name.""" + + def GetProviderRefreshStatus( + self, + request: _openshell_pb2.GetProviderRefreshStatusRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetProviderRefreshStatusResponse, _abc.Awaitable[_openshell_pb2.GetProviderRefreshStatusResponse]]: + """Fetch refresh status for one provider or provider credential.""" + + def ConfigureProviderRefresh( + self, + request: _openshell_pb2.ConfigureProviderRefreshRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ConfigureProviderRefreshResponse, _abc.Awaitable[_openshell_pb2.ConfigureProviderRefreshResponse]]: + """Configure gateway-owned refresh material for one provider credential.""" + + def RotateProviderCredential( + self, + request: _openshell_pb2.RotateProviderCredentialRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.RotateProviderCredentialResponse, _abc.Awaitable[_openshell_pb2.RotateProviderCredentialResponse]]: + """Record a gateway-owned refresh request for one provider credential.""" + + def DeleteProviderRefresh( + self, + request: _openshell_pb2.DeleteProviderRefreshRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DeleteProviderRefreshResponse, _abc.Awaitable[_openshell_pb2.DeleteProviderRefreshResponse]]: + """Delete gateway-owned refresh configuration for one provider credential.""" + + def DeleteProvider( + self, + request: _openshell_pb2.DeleteProviderRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DeleteProviderResponse, _abc.Awaitable[_openshell_pb2.DeleteProviderResponse]]: + """Delete a provider by name.""" + + def DeleteProviderProfile( + self, + request: _openshell_pb2.DeleteProviderProfileRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DeleteProviderProfileResponse, _abc.Awaitable[_openshell_pb2.DeleteProviderProfileResponse]]: + """Delete a custom provider type profile by id.""" + + def GetSandboxConfig( + self, + request: _sandbox_pb2.GetSandboxConfigRequest, + context: _ServicerContext, + ) -> _typing.Union[_sandbox_pb2.GetSandboxConfigResponse, _abc.Awaitable[_sandbox_pb2.GetSandboxConfigResponse]]: + """Get sandbox settings by id (called by users, and by supervisors at startup + and in their poll loop). A supervisor whose session pushes configuration + receives later updates over ConnectSupervisor and stops polling. + """ + + def GetGatewayConfig( + self, + request: _sandbox_pb2.GetGatewayConfigRequest, + context: _ServicerContext, + ) -> _typing.Union[_sandbox_pb2.GetGatewayConfigResponse, _abc.Awaitable[_sandbox_pb2.GetGatewayConfigResponse]]: + """Get gateway-global settings (read-only runtime configuration; any + authenticated user may read these without requiring Platform Admin). + + Scope-only (no role): scopes are granted by the IdP at token issuance, + orthogonal to workspace membership. Deployments that enable scope + enforcement configure the IdP to grant config:read (or openshell:all) + to all sandbox users, so this does not block least-privilege flows. + """ + + def UpdateConfig( + self, + request: _openshell_pb2.UpdateConfigRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.UpdateConfigResponse, _abc.Awaitable[_openshell_pb2.UpdateConfigResponse]]: + """Update settings or policy at sandbox or global scope.""" + + def GetSandboxPolicyStatus( + self, + request: _openshell_pb2.GetSandboxPolicyStatusRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetSandboxPolicyStatusResponse, _abc.Awaitable[_openshell_pb2.GetSandboxPolicyStatusResponse]]: + """Get the load status of a specific policy version.""" + + def ListSandboxPolicies( + self, + request: _openshell_pb2.ListSandboxPoliciesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListSandboxPoliciesResponse, _abc.Awaitable[_openshell_pb2.ListSandboxPoliciesResponse]]: + """List policy history for a sandbox.""" + + def ReportPolicyStatus( + self, + request: _openshell_pb2.ReportPolicyStatusRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ReportPolicyStatusResponse, _abc.Awaitable[_openshell_pb2.ReportPolicyStatusResponse]]: + """Report policy load result (called by sandbox after reload attempt).""" + + def ReportEndpointStatus( + self, + request: _openshell_pb2.ReportEndpointStatusRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ReportEndpointStatusResponse, _abc.Awaitable[_openshell_pb2.ReportEndpointStatusResponse]]: + """Replace the gateway's observed tool server endpoint status for one sandbox.""" + + def ReportProviderReadiness( + self, + request: _openshell_pb2.ReportProviderReadinessRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ReportProviderReadinessResponse, _abc.Awaitable[_openshell_pb2.ReportProviderReadinessResponse]]: + """Report installed provider state for the current ConnectSupervisor session. + Replacing or losing that session invalidates its observations. + """ + + def ReportSandboxConfiguration( + self, + request: _openshell_pb2.ReportSandboxConfigurationRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ReportSandboxConfigurationResponse, _abc.Awaitable[_openshell_pb2.ReportSandboxConfigurationResponse]]: + """Register startup and acknowledge an exact validated runtime configuration.""" + + def GetSandboxProviderEnvironment( + self, + request: _openshell_pb2.GetSandboxProviderEnvironmentRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetSandboxProviderEnvironmentResponse, _abc.Awaitable[_openshell_pb2.GetSandboxProviderEnvironmentResponse]]: + """Get provider environment for a sandbox (called by the sandbox supervisor at + startup and by its poll loop). Polling projection of the provider + environment delivered over ConnectSupervisor; removed with the polling RPCs. + """ + + def ExchangeProviderSubjectToken( + self, + request: _openshell_pb2.ExchangeProviderSubjectTokenRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ExchangeProviderSubjectTokenResponse, _abc.Awaitable[_openshell_pb2.ExchangeProviderSubjectTokenResponse]]: + """Exchange a stored provider subject token for an intermediate token scoped + to the calling supervisor's SPIFFE identity. + """ + + def GetSandboxLogs( + self, + request: _openshell_pb2.GetSandboxLogsRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetSandboxLogsResponse, _abc.Awaitable[_openshell_pb2.GetSandboxLogsResponse]]: + """Fetch recent sandbox logs (one-shot).""" + + def PushSandboxLogs( + self, + request_iterator: _MaybeAsyncIterator[_openshell_pb2.PushSandboxLogsRequest], + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.PushSandboxLogsResponse, _abc.Awaitable[_openshell_pb2.PushSandboxLogsResponse]]: + """Push sandbox supervisor logs to the server (client-streaming).""" + + def ConnectSupervisor( + self, + request_iterator: _MaybeAsyncIterator[_openshell_pb2.SupervisorMessage], + context: _ServicerContext, + ) -> _typing.Union[_abc.Iterator[_openshell_pb2.GatewayMessage], _abc.AsyncIterator[_openshell_pb2.GatewayMessage]]: + """Persistent supervisor-to-gateway session (bidirectional streaming). + + The supervisor opens this stream at startup and keeps it alive for the + sandbox lifetime. The gateway uses it to coordinate relay channels for + SSH connect, ExecSandbox, targetable sandbox services, and configuration + delivery. Supervisors advertise optional stream features in + SupervisorHello, and the gateway sends only payloads the supervisor + advertises. Raw service bytes flow over RelayStream calls (separate HTTP/2 + streams on the same connection), not over this stream. + """ + + def ReportMainProcessExit( + self, + request: _openshell_pb2.ReportMainProcessExitRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ReportMainProcessExitResponse, _abc.Awaitable[_openshell_pb2.ReportMainProcessExitResponse]]: + """Persist the canonical main process result before the supervisor exits.""" + + def FinalizeMainProcessExit( + self, + request: _openshell_pb2.FinalizeMainProcessExitRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.FinalizeMainProcessExitResponse, _abc.Awaitable[_openshell_pb2.FinalizeMainProcessExitResponse]]: + """Confirm that foreground terminal delivery completed naturally.""" + + def RelayStream( + self, + request_iterator: _MaybeAsyncIterator[_openshell_pb2.RelayFrame], + context: _ServicerContext, + ) -> _typing.Union[_abc.Iterator[_openshell_pb2.RelayFrame], _abc.AsyncIterator[_openshell_pb2.RelayFrame]]: + """Raw byte relay between supervisor and gateway. + + The supervisor initiates this call after receiving a RelayOpen message + on its ConnectSupervisor stream. The first RelayFrame carries a + RelayInit with the channel_id to associate the new HTTP/2 stream with + the pending relay slot on the gateway. Subsequent frames carry raw bytes in either + direction between the gateway-side waiter (ForwardTcp / exec handler) + and the supervisor-side target bridge. + + This rides the same TCP+TLS+HTTP/2 connection as ConnectSupervisor — + no new TLS handshake, no reverse HTTP CONNECT. + """ + + def PeerRelay( + self, + request_iterator: _MaybeAsyncIterator[_openshell_pb2.PeerRelayFrame], + context: _ServicerContext, + ) -> _typing.Union[_abc.Iterator[_openshell_pb2.PeerRelayFrame], _abc.AsyncIterator[_openshell_pb2.PeerRelayFrame]]: + """Internal gateway-to-gateway relay forwarding. + + A gateway replica that receives a user request for a sandbox whose + supervisor session is owned by a different replica opens this stream to the + owner. The first frame carries PeerRelayInit; subsequent frames carry raw + bytes in either direction. This RPC is authenticated as a gateway peer, not + as a user or sandbox supervisor. + """ + + def PeerReportProviderReadiness( + self, + request: _openshell_pb2.ReportProviderReadinessRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ReportProviderReadinessResponse, _abc.Awaitable[_openshell_pb2.ReportProviderReadinessResponse]]: + """Internal gateway-to-owner forwarding for supervisor-bound state.""" + + def PeerReportEndpointStatus( + self, + request: _openshell_pb2.ReportEndpointStatusRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ReportEndpointStatusResponse, _abc.Awaitable[_openshell_pb2.ReportEndpointStatusResponse]]: ... + + def PeerGetSandboxProviderStatus( + self, + request: _openshell_pb2.GetSandboxProviderStatusRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetSandboxProviderStatusResponse, _abc.Awaitable[_openshell_pb2.GetSandboxProviderStatusResponse]]: ... + + def PeerNotifyConfigUpdate( + self, + request: _openshell_pb2.PeerNotifyConfigUpdateRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.PeerNotifyConfigUpdateResponse, _abc.Awaitable[_openshell_pb2.PeerNotifyConfigUpdateResponse]]: + """Best-effort notification to the replica that owns a supervisor session. + The receiver rebuilds snapshots from authoritative state. + """ + + def WatchSandbox( + self, + request: _openshell_pb2.WatchSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_abc.Iterator[_openshell_pb2.SandboxStreamEvent], _abc.AsyncIterator[_openshell_pb2.SandboxStreamEvent]]: + """Watch a sandbox and stream updates. + + This stream can include: + - Sandbox status snapshots (phase/status) + - OpenShell server process logs correlated by sandbox_id + - Platform events correlated to the sandbox + """ + + def SubmitPolicyAnalysis( + self, + request: _openshell_pb2.SubmitPolicyAnalysisRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SubmitPolicyAnalysisResponse, _abc.Awaitable[_openshell_pb2.SubmitPolicyAnalysisResponse]]: + """--------------------------------------------------------------------------- + Draft policy recommendation RPCs + --------------------------------------------------------------------------- + + Submit denial analysis results from sandbox (summaries + proposed chunks). + """ + + def GetDraftPolicy( + self, + request: _openshell_pb2.GetDraftPolicyRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetDraftPolicyResponse, _abc.Awaitable[_openshell_pb2.GetDraftPolicyResponse]]: + """Get draft policy recommendations for a sandbox.""" + + def ApproveDraftChunk( + self, + request: _openshell_pb2.ApproveDraftChunkRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ApproveDraftChunkResponse, _abc.Awaitable[_openshell_pb2.ApproveDraftChunkResponse]]: + """Approve a single draft policy chunk (merges into active policy).""" + + def RejectDraftChunk( + self, + request: _openshell_pb2.RejectDraftChunkRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.RejectDraftChunkResponse, _abc.Awaitable[_openshell_pb2.RejectDraftChunkResponse]]: + """Reject a single draft policy chunk.""" + + def ApproveAllDraftChunks( + self, + request: _openshell_pb2.ApproveAllDraftChunksRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ApproveAllDraftChunksResponse, _abc.Awaitable[_openshell_pb2.ApproveAllDraftChunksResponse]]: + """Approve all pending draft chunks (skips security-flagged unless forced).""" + + def EditDraftChunk( + self, + request: _openshell_pb2.EditDraftChunkRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.EditDraftChunkResponse, _abc.Awaitable[_openshell_pb2.EditDraftChunkResponse]]: + """Edit a pending draft chunk in-place (e.g. narrow allowed_ips).""" + + def UndoDraftChunk( + self, + request: _openshell_pb2.UndoDraftChunkRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.UndoDraftChunkResponse, _abc.Awaitable[_openshell_pb2.UndoDraftChunkResponse]]: + """Reverse an approval (remove merged rule from active policy).""" + + def ClearDraftChunks( + self, + request: _openshell_pb2.ClearDraftChunksRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ClearDraftChunksResponse, _abc.Awaitable[_openshell_pb2.ClearDraftChunksResponse]]: + """Clear all pending draft chunks for a sandbox.""" + + def GetDraftHistory( + self, + request: _openshell_pb2.GetDraftHistoryRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetDraftHistoryResponse, _abc.Awaitable[_openshell_pb2.GetDraftHistoryResponse]]: + """Get decision history for a sandbox's draft policy.""" + + def IssueSandboxToken( + self, + request: _openshell_pb2.IssueSandboxTokenRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.IssueSandboxTokenResponse, _abc.Awaitable[_openshell_pb2.IssueSandboxTokenResponse]]: + """Exchange a sandbox-bootstrap credential (e.g. a Kubernetes projected + ServiceAccount token) for a gateway-minted JWT bound to the calling + sandbox's UUID. Used by the Kubernetes driver path; singleplayer + drivers receive the gateway JWT directly from the create-sandbox flow + and never call this RPC. + """ + + def RefreshSandboxToken( + self, + request: _openshell_pb2.RefreshSandboxTokenRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.RefreshSandboxTokenResponse, _abc.Awaitable[_openshell_pb2.RefreshSandboxTokenResponse]]: + """Renew the calling sandbox's gateway JWT. Older tokens remain valid + until their own expiry; deployments should keep token TTLs short to + bound replay exposure. The supervisor calls this from a background + task at ~80% of the token's lifetime; the new token is cached in + memory only — the on-disk bootstrap file is intentionally not + rewritten. + """ + + def CreateWorkspace( + self, + request: _openshell_pb2.CreateWorkspaceRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.CreateWorkspaceResponse, _abc.Awaitable[_openshell_pb2.CreateWorkspaceResponse]]: + """--------------------------------------------------------------------------- + Workspace management RPCs + --------------------------------------------------------------------------- + + Create a workspace. + """ + + def GetWorkspace( + self, + request: _openshell_pb2.GetWorkspaceRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.GetWorkspaceResponse, _abc.Awaitable[_openshell_pb2.GetWorkspaceResponse]]: + """Fetch a workspace by name.""" + + def ListWorkspaces( + self, + request: _openshell_pb2.ListWorkspacesRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListWorkspacesResponse, _abc.Awaitable[_openshell_pb2.ListWorkspacesResponse]]: + """List workspaces.""" + + def DeleteWorkspace( + self, + request: _openshell_pb2.DeleteWorkspaceRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.DeleteWorkspaceResponse, _abc.Awaitable[_openshell_pb2.DeleteWorkspaceResponse]]: + """Delete a workspace by name.""" + + def AddWorkspaceMember( + self, + request: _openshell_pb2.AddWorkspaceMemberRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.AddWorkspaceMemberResponse, _abc.Awaitable[_openshell_pb2.AddWorkspaceMemberResponse]]: + """Add a member to a workspace.""" + + def RemoveWorkspaceMember( + self, + request: _openshell_pb2.RemoveWorkspaceMemberRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.RemoveWorkspaceMemberResponse, _abc.Awaitable[_openshell_pb2.RemoveWorkspaceMemberResponse]]: + """Remove a member from a workspace.""" + + def ListWorkspaceMembers( + self, + request: _openshell_pb2.ListWorkspaceMembersRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.ListWorkspaceMembersResponse, _abc.Awaitable[_openshell_pb2.ListWorkspaceMembersResponse]]: + """List members of a workspace.""" + +def add_OpenShellServicer_to_server(servicer: OpenShellServicer, server: _typing.Union[_grpc.Server, _aio.Server]) -> None: ... + +class SandboxUpdatesStub: + """Optional sandbox mutations are separate from OpenShell so existing generated + OpenShell server implementations remain source-compatible. + """ + + @_typing.overload + def __new__(cls, channel: _grpc.Channel) -> _Self: ... + @_typing.overload + def __new__(cls, channel: _aio.Channel) -> SandboxUpdatesAsyncStub: ... + UpdateSandbox: _grpc.UnaryUnaryMultiCallable[_openshell_pb2.UpdateSandboxRequest, _openshell_pb2.SandboxResponse] + """Update the workload image, command, environment, labels, or annotations of a + stopped sandbox while preserving its identity and retained storage. Requires + compute-driver support for the selected changes and explicit gateway activation + of sandbox updates. + """ + +@_typing.type_check_only +class SandboxUpdatesAsyncStub(SandboxUpdatesStub): + """Optional sandbox mutations are separate from OpenShell so existing generated + OpenShell server implementations remain source-compatible. + """ + + def __init__(self, channel: _aio.Channel) -> None: ... + UpdateSandbox: _aio.UnaryUnaryMultiCallable[_openshell_pb2.UpdateSandboxRequest, _openshell_pb2.SandboxResponse] # type: ignore[assignment] + """Update the workload image, command, environment, labels, or annotations of a + stopped sandbox while preserving its identity and retained storage. Requires + compute-driver support for the selected changes and explicit gateway activation + of sandbox updates. + """ + +class SandboxUpdatesServicer: + """Optional sandbox mutations are separate from OpenShell so existing generated + OpenShell server implementations remain source-compatible. + """ + + def UpdateSandbox( + self, + request: _openshell_pb2.UpdateSandboxRequest, + context: _ServicerContext, + ) -> _typing.Union[_openshell_pb2.SandboxResponse, _abc.Awaitable[_openshell_pb2.SandboxResponse]]: + """Update the workload image, command, environment, labels, or annotations of a + stopped sandbox while preserving its identity and retained storage. Requires + compute-driver support for the selected changes and explicit gateway activation + of sandbox updates. + """ + +def add_SandboxUpdatesServicer_to_server(servicer: SandboxUpdatesServicer, server: _typing.Union[_grpc.Server, _aio.Server]) -> None: ... diff --git a/src/openshell/_proto/options_pb2.py b/src/openshell/_proto/options_pb2.py new file mode 100644 index 0000000..395a2d3 --- /dev/null +++ b/src/openshell/_proto/options_pb2.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: options.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'options.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\roptions.proto\x12\x14openshell.options.v1\x1a google/protobuf/descriptor.proto\"b\n\x11\x41uthorizationRule\x12\x11\n\tauth_mode\x18\x01 \x01(\t\x12\x16\n\x0eworkspace_role\x18\x02 \x01(\t\x12\x13\n\x0bglobal_role\x18\x03 \x01(\t\x12\r\n\x05scope\x18\x04 \x01(\t:`\n\rauthorization\x12\x1e.google.protobuf.MethodOptions\x18\xd0\x86\x03 \x01(\x0b\x32\'.openshell.options.v1.AuthorizationRule:/\n\x06secret\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'options_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_AUTHORIZATIONRULE']._serialized_start=73 + _globals['_AUTHORIZATIONRULE']._serialized_end=171 +# @@protoc_insertion_point(module_scope) diff --git a/src/openshell/_proto/options_pb2.pyi b/src/openshell/_proto/options_pb2.pyi new file mode 100644 index 0000000..4398ccc --- /dev/null +++ b/src/openshell/_proto/options_pb2.pyi @@ -0,0 +1,22 @@ +from google.protobuf import descriptor_pb2 as _descriptor_pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from typing import ClassVar as _ClassVar, Optional as _Optional + +DESCRIPTOR: _descriptor.FileDescriptor +AUTHORIZATION_FIELD_NUMBER: _ClassVar[int] +authorization: _descriptor.FieldDescriptor +SECRET_FIELD_NUMBER: _ClassVar[int] +secret: _descriptor.FieldDescriptor + +class AuthorizationRule(_message.Message): + __slots__ = ("auth_mode", "workspace_role", "global_role", "scope") + AUTH_MODE_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_ROLE_FIELD_NUMBER: _ClassVar[int] + GLOBAL_ROLE_FIELD_NUMBER: _ClassVar[int] + SCOPE_FIELD_NUMBER: _ClassVar[int] + auth_mode: str + workspace_role: str + global_role: str + scope: str + def __init__(self, auth_mode: _Optional[str] = ..., workspace_role: _Optional[str] = ..., global_role: _Optional[str] = ..., scope: _Optional[str] = ...) -> None: ... diff --git a/src/openshell/_proto/options_pb2_grpc.py b/src/openshell/_proto/options_pb2_grpc.py new file mode 100644 index 0000000..03f9cc9 --- /dev/null +++ b/src/openshell/_proto/options_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in options_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/src/openshell/_proto/options_pb2_grpc.pyi b/src/openshell/_proto/options_pb2_grpc.pyi new file mode 100644 index 0000000..3127e0d --- /dev/null +++ b/src/openshell/_proto/options_pb2_grpc.pyi @@ -0,0 +1,22 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 +""" + +from collections import abc as _abc +from grpc import aio as _aio +import abc as _abc_1 +import grpc as _grpc +import typing as _typing + +_T = _typing.TypeVar("_T") + +class _MaybeAsyncIterator(_abc.AsyncIterator[_T], _abc.Iterator[_T], metaclass=_abc_1.ABCMeta): ... + +class _ServicerContext(_grpc.ServicerContext, _aio.ServicerContext): # type: ignore[misc, type-arg] + ... + +GRPC_GENERATED_VERSION: str +GRPC_VERSION: str diff --git a/src/openshell/_proto/sandbox_pb2.py b/src/openshell/_proto/sandbox_pb2.py new file mode 100644 index 0000000..60933e2 --- /dev/null +++ b/src/openshell/_proto/sandbox_pb2.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: sandbox.proto +# Protobuf Python Version: 6.31.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 6, + 31, + 1, + '', + 'sandbox.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from . import datamodel_pb2 as datamodel__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rsandbox.proto\x12\x14openshell.sandbox.v1\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x0f\x64\x61tamodel.proto\"\xc3\x04\n\rSandboxPolicy\x12\x0f\n\x07version\x18\x01 \x01(\r\x12:\n\nfilesystem\x18\x02 \x01(\x0b\x32&.openshell.sandbox.v1.FilesystemPolicy\x12\x36\n\x08landlock\x18\x03 \x01(\x0b\x32$.openshell.sandbox.v1.LandlockPolicy\x12\x34\n\x07process\x18\x04 \x01(\x0b\x32#.openshell.sandbox.v1.ProcessPolicy\x12R\n\x10network_policies\x18\x05 \x03(\x0b\x32\x38.openshell.sandbox.v1.SandboxPolicy.NetworkPoliciesEntry\x12X\n\x13network_middlewares\x18\x06 \x03(\x0b\x32;.openshell.sandbox.v1.SandboxPolicy.NetworkMiddlewaresEntry\x1a_\n\x14NetworkPoliciesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.openshell.sandbox.v1.NetworkPolicyRule:\x02\x38\x01\x1ah\n\x17NetworkMiddlewaresEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12<\n\x05value\x18\x02 \x01(\x0b\x32-.openshell.sandbox.v1.NetworkMiddlewareConfig:\x02\x38\x01\"R\n\x10\x46ilesystemPolicy\x12\x17\n\x0finclude_workdir\x18\x01 \x01(\x08\x12\x11\n\tread_only\x18\x02 \x03(\t\x12\x12\n\nread_write\x18\x03 \x03(\t\"\'\n\x0eLandlockPolicy\x12\x15\n\rcompatibility\x18\x01 \x01(\t\":\n\rProcessPolicy\x12\x13\n\x0brun_as_user\x18\x01 \x01(\t\x12\x14\n\x0crun_as_group\x18\x02 \x01(\t\"\x92\x01\n\x11NetworkPolicyRule\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x38\n\tendpoints\x18\x02 \x03(\x0b\x32%.openshell.sandbox.v1.NetworkEndpoint\x12\x35\n\x08\x62inaries\x18\x03 \x03(\x0b\x32#.openshell.sandbox.v1.NetworkBinary\"\xca\x01\n\x17NetworkMiddlewareConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nmiddleware\x18\x02 \x01(\t\x12\'\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x10\n\x08on_error\x18\x04 \x01(\t\x12\x43\n\tendpoints\x18\x05 \x01(\x0b\x32\x30.openshell.sandbox.v1.MiddlewareEndpointSelector\x12\r\n\x05order\x18\x06 \x01(\x05\">\n\x1aMiddlewareEndpointSelector\x12\x0f\n\x07include\x18\x01 \x03(\t\x12\x0f\n\x07\x65xclude\x18\x02 \x03(\t\",\n\x18NetworkCredentialBinding\x12\x10\n\x08provider\x18\x01 \x01(\t\"\xdf\x08\n\x0fNetworkEndpoint\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x10\n\x08protocol\x18\x03 \x01(\t\x12\x31\n\x03tls\x18\x04 \x01(\x0e\x32$.openshell.sandbox.v1.NetworkTlsMode\x12\x41\n\x0b\x65nforcement\x18\x05 \x01(\x0e\x32,.openshell.sandbox.v1.NetworkEnforcementMode\x12\x39\n\x06\x61\x63\x63\x65ss\x18\x06 \x01(\x0e\x32).openshell.sandbox.v1.NetworkAccessPreset\x12+\n\x05rules\x18\x07 \x03(\x0b\x32\x1c.openshell.sandbox.v1.L7Rule\x12\x13\n\x0b\x61llowed_ips\x18\x08 \x03(\t\x12\r\n\x05ports\x18\t \x03(\r\x12\x34\n\ndeny_rules\x18\n \x03(\x0b\x32 .openshell.sandbox.v1.L7DenyRule\x12\x1b\n\x13\x61llow_encoded_slash\x18\x0b \x01(\x08\x12\x19\n\x11persisted_queries\x18\x0c \x01(\t\x12\x65\n\x19graphql_persisted_queries\x18\r \x03(\x0b\x32\x42.openshell.sandbox.v1.NetworkEndpoint.GraphqlPersistedQueriesEntry\x12\x1e\n\x16graphql_max_body_bytes\x18\x0e \x01(\r\x12\x0c\n\x04path\x18\x0f \x01(\t\x12$\n\x1cwebsocket_credential_rewrite\x18\x10 \x01(\x08\x12\'\n\x1frequest_body_credential_rewrite\x18\x11 \x01(\x08\x12\x18\n\x10\x61\x64visor_proposed\x18\x12 \x01(\x08\x12\x1a\n\x12\x63redential_signing\x18\x13 \x01(\t\x12\x17\n\x0fsigning_service\x18\x14 \x01(\t\x12\x16\n\x0esigning_region\x18\x15 \x01(\t\x12\x1f\n\x17json_rpc_max_body_bytes\x18\x16 \x01(\r\x12-\n\x03mcp\x18\x17 \x01(\x0b\x32 .openshell.sandbox.v1.McpOptions\x12J\n\x12\x63redential_binding\x18\x18 \x01(\x0b\x32..openshell.sandbox.v1.NetworkCredentialBinding\x12%\n\x1d\x61llow_uninspected_credentials\x18\x19 \x01(\x08\x12\x1d\n\x15provider_credentialed\x18\x1a \x01(\x08\x12\x19\n\x11token_grant_owner\x18\x1b \x01(\t\x1a\x66\n\x1cGraphqlPersistedQueriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x35\n\x05value\x18\x02 \x01(\x0b\x32&.openshell.sandbox.v1.GraphqlOperation:\x02\x38\x01\"\x9e\x01\n\nMcpOptions\x12\x1e\n\x11strict_tool_names\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12(\n\x1b\x61llow_all_known_mcp_methods\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\x10\n\x08versions\x18\x03 \x03(\tB\x14\n\x12_strict_tool_namesB\x1e\n\x1c_allow_all_known_mcp_methods\"R\n\x10GraphqlOperation\x12\x16\n\x0eoperation_type\x18\x01 \x01(\t\x12\x16\n\x0eoperation_name\x18\x02 \x01(\t\x12\x0e\n\x06\x66ields\x18\x03 \x03(\t\"\xa4\x03\n\nL7DenyRule\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x0f\n\x07\x63ommand\x18\x03 \x01(\t\x12:\n\x05query\x18\x04 \x03(\x0b\x32+.openshell.sandbox.v1.L7DenyRule.QueryEntry\x12\x16\n\x0eoperation_type\x18\x05 \x01(\t\x12\x16\n\x0eoperation_name\x18\x06 \x01(\t\x12\x0e\n\x06\x66ields\x18\x07 \x03(\t\x12<\n\x06params\x18\t \x03(\x0b\x32,.openshell.sandbox.v1.L7DenyRule.ParamsEntry\x1aR\n\nQueryEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.openshell.sandbox.v1.L7QueryMatcher:\x02\x38\x01\x1aS\n\x0bParamsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.openshell.sandbox.v1.L7QueryMatcher:\x02\x38\x01J\x04\x08\x08\x10\t\"6\n\x06L7Rule\x12,\n\x05\x61llow\x18\x01 \x01(\x0b\x32\x1d.openshell.sandbox.v1.L7Allow\"\x9b\x03\n\x07L7Allow\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x0f\n\x07\x63ommand\x18\x03 \x01(\t\x12\x37\n\x05query\x18\x04 \x03(\x0b\x32(.openshell.sandbox.v1.L7Allow.QueryEntry\x12\x16\n\x0eoperation_type\x18\x05 \x01(\t\x12\x16\n\x0eoperation_name\x18\x06 \x01(\t\x12\x0e\n\x06\x66ields\x18\x07 \x03(\t\x12\x39\n\x06params\x18\t \x03(\x0b\x32).openshell.sandbox.v1.L7Allow.ParamsEntry\x1aR\n\nQueryEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.openshell.sandbox.v1.L7QueryMatcher:\x02\x38\x01\x1aS\n\x0bParamsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x33\n\x05value\x18\x02 \x01(\x0b\x32$.openshell.sandbox.v1.L7QueryMatcher:\x02\x38\x01J\x04\x08\x08\x10\t\"+\n\x0eL7QueryMatcher\x12\x0c\n\x04glob\x18\x01 \x01(\t\x12\x0b\n\x03\x61ny\x18\x02 \x03(\t\",\n\rNetworkBinary\x12\x0c\n\x04path\x18\x01 \x01(\tJ\x04\x08\x02\x10\x03R\x07harness\"k\n\x17GetSandboxConfigRequest\x12\x42\n\x0fworkspace_scope\x18\x03 \x01(\x0b\x32).openshell.datamodel.v1.WorkspaceSelector\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x19\n\x17GetGatewayConfigRequest\"\xda\x01\n\x18GetGatewayConfigResponse\x12N\n\x08settings\x18\x01 \x03(\x0b\x32<.openshell.sandbox.v1.GetGatewayConfigResponse.SettingsEntry\x12\x19\n\x11settings_revision\x18\x02 \x01(\x04\x1aS\n\rSettingsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x31\n\x05value\x18\x02 \x01(\x0b\x32\".openshell.sandbox.v1.SettingValue:\x02\x38\x01\"q\n\x0cSettingValue\x12\x16\n\x0cstring_value\x18\x01 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x02 \x01(\x08H\x00\x12\x13\n\tint_value\x18\x03 \x01(\x03H\x00\x12\x15\n\x0b\x62ytes_value\x18\x04 \x01(\x0cH\x00\x42\x07\n\x05value\"x\n\x10\x45\x66\x66\x65\x63tiveSetting\x12\x31\n\x05value\x18\x01 \x01(\x0b\x32\".openshell.sandbox.v1.SettingValue\x12\x31\n\x05scope\x18\x02 \x01(\x0e\x32\".openshell.sandbox.v1.SettingScope\"\xcb\x06\n\x15SandboxConfigSnapshot\x12\x33\n\x06policy\x18\x01 \x01(\x0b\x32#.openshell.sandbox.v1.SandboxPolicy\x12\x0f\n\x07version\x18\x02 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x03 \x01(\t\x12K\n\x08settings\x18\x04 \x03(\x0b\x32\x39.openshell.sandbox.v1.SandboxConfigSnapshot.SettingsEntry\x12\x17\n\x0f\x63onfig_revision\x18\x05 \x01(\x04\x12\x39\n\rpolicy_source\x18\x06 \x01(\x0e\x32\".openshell.sandbox.v1.PolicySource\x12\x1d\n\x15global_policy_version\x18\x07 \x01(\r\x12\x1d\n\x15provider_env_revision\x18\x08 \x01(\x04\x12Y\n\x1esupervisor_middleware_services\x18\t \x03(\x0b\x32\x31.openshell.sandbox.v1.SupervisorMiddlewareService\x12\x11\n\tworkspace\x18\n \x01(\t\x12&\n\x1epolicy_validation_failure_mode\x18\x0b \x01(\t\x12(\n extension_authentication_enabled\x18\x0c \x01(\x08\x12\x1e\n\x16\x63onfiguration_admitted\x18\r \x01(\x08\x12!\n\x19provider_attachment_epoch\x18\x0e \x01(\t\x12!\n\x19\x63onfiguration_instance_id\x18\x0f \x01(\t\x12\x1b\n\x13\x63onfiguration_error\x18\x10 \x01(\t\x12\x19\n\x11settings_revision\x18\x11 \x01(\x04\x12\x41\n\x0eservice_routes\x18\x12 \x03(\x0b\x32).openshell.sandbox.v1.SandboxServiceRoute\x1aW\n\rSettingsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x35\n\x05value\x18\x02 \x01(\x0b\x32&.openshell.sandbox.v1.EffectiveSetting:\x02\x38\x01\"\xd1\x06\n\x18GetSandboxConfigResponse\x12\x33\n\x06policy\x18\x01 \x01(\x0b\x32#.openshell.sandbox.v1.SandboxPolicy\x12\x0f\n\x07version\x18\x02 \x01(\r\x12\x13\n\x0bpolicy_hash\x18\x03 \x01(\t\x12N\n\x08settings\x18\x04 \x03(\x0b\x32<.openshell.sandbox.v1.GetSandboxConfigResponse.SettingsEntry\x12\x17\n\x0f\x63onfig_revision\x18\x05 \x01(\x04\x12\x39\n\rpolicy_source\x18\x06 \x01(\x0e\x32\".openshell.sandbox.v1.PolicySource\x12\x1d\n\x15global_policy_version\x18\x07 \x01(\r\x12\x1d\n\x15provider_env_revision\x18\x08 \x01(\x04\x12Y\n\x1esupervisor_middleware_services\x18\t \x03(\x0b\x32\x31.openshell.sandbox.v1.SupervisorMiddlewareService\x12\x11\n\tworkspace\x18\n \x01(\t\x12&\n\x1epolicy_validation_failure_mode\x18\x0b \x01(\t\x12(\n extension_authentication_enabled\x18\x0c \x01(\x08\x12!\n\x19provider_attachment_epoch\x18\x0e \x01(\t\x12\x1e\n\x16\x63onfiguration_admitted\x18\r \x01(\x08\x12\x1b\n\x13\x63onfiguration_error\x18\x10 \x01(\t\x12!\n\x19\x63onfiguration_instance_id\x18\x0f \x01(\t\x12\x19\n\x11settings_revision\x18\x11 \x01(\x04\x12\x41\n\x0eservice_routes\x18\x12 \x03(\x0b\x32).openshell.sandbox.v1.SandboxServiceRoute\x1aW\n\rSettingsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x35\n\x05value\x18\x02 \x01(\x0b\x32&.openshell.sandbox.v1.EffectiveSetting:\x02\x38\x01\"\x83\x01\n\x13SandboxServiceRoute\x12\x13\n\x0b\x65ndpoint_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0btarget_port\x18\x03 \x01(\r\x12\x1a\n\x12\x61uthorization_mode\x18\x04 \x01(\x05\x12\x18\n\x10resource_version\x18\x05 \x01(\x04\"\x83\x03\n\x1bSupervisorMiddlewareService\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rgrpc_endpoint\x18\x02 \x01(\t\x12\x19\n\x11max_payload_bytes\x18\x03 \x01(\x04\x12\x32\n\x0frequest_timeout\x18h \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x17\n\x0ftls_ca_cert_pem\x18\x05 \x01(\x0c\x12\x10\n\x08\x61udience\x18\x06 \x01(\t\x12 \n\x18\x61llow_insecure_transport\x18\x07 \x01(\x08\x12O\n\x0e\x62inding_policy\x18\x08 \x01(\x0e\x32\x37.openshell.sandbox.v1.SupervisorMiddlewareBindingPolicy\x12\x43\n\x08\x62indings\x18\t \x03(\x0e\x32\x31.openshell.sandbox.v1.SupervisorMiddlewareBindingJ\x04\x08\x04\x10\x05R\x07timeout*\x97\x01\n\x0eNetworkTlsMode\x12 \n\x1cNETWORK_TLS_MODE_UNSPECIFIED\x10\x00\x12\x19\n\x15NETWORK_TLS_MODE_SKIP\x10\x01\x12\"\n\x1aNETWORK_TLS_MODE_TERMINATE\x10\x02\x1a\x02\x08\x01\x12$\n\x1cNETWORK_TLS_MODE_PASSTHROUGH\x10\x03\x1a\x02\x08\x01*\x8c\x01\n\x16NetworkEnforcementMode\x12(\n$NETWORK_ENFORCEMENT_MODE_UNSPECIFIED\x10\x00\x12$\n NETWORK_ENFORCEMENT_MODE_ENFORCE\x10\x01\x12\"\n\x1eNETWORK_ENFORCEMENT_MODE_AUDIT\x10\x02*\xa7\x01\n\x13NetworkAccessPreset\x12%\n!NETWORK_ACCESS_PRESET_UNSPECIFIED\x10\x00\x12#\n\x1fNETWORK_ACCESS_PRESET_READ_ONLY\x10\x01\x12$\n NETWORK_ACCESS_PRESET_READ_WRITE\x10\x02\x12\x1e\n\x1aNETWORK_ACCESS_PRESET_FULL\x10\x03*b\n\x0cSettingScope\x12\x1d\n\x19SETTING_SCOPE_UNSPECIFIED\x10\x00\x12\x19\n\x15SETTING_SCOPE_SANDBOX\x10\x01\x12\x18\n\x14SETTING_SCOPE_GLOBAL\x10\x02*b\n\x0cPolicySource\x12\x1d\n\x19POLICY_SOURCE_UNSPECIFIED\x10\x00\x12\x19\n\x15POLICY_SOURCE_SANDBOX\x10\x01\x12\x18\n\x14POLICY_SOURCE_GLOBAL\x10\x02*\xef\x01\n!SupervisorMiddlewareBindingPolicy\x12\x34\n0SUPERVISOR_MIDDLEWARE_BINDING_POLICY_UNSPECIFIED\x10\x00\x12\x30\n,SUPERVISOR_MIDDLEWARE_BINDING_POLICY_DYNAMIC\x10\x01\x12\x32\n.SUPERVISOR_MIDDLEWARE_BINDING_POLICY_ALLOWLIST\x10\x02\x12.\n*SUPERVISOR_MIDDLEWARE_BINDING_POLICY_EXACT\x10\x03*\x8d\x02\n\x1bSupervisorMiddlewareBinding\x12-\n)SUPERVISOR_MIDDLEWARE_BINDING_UNSPECIFIED\x10\x00\x12>\n:SUPERVISOR_MIDDLEWARE_BINDING_HTTP_REQUEST_PRE_CREDENTIALS\x10\x01\x12:\n6SUPERVISOR_MIDDLEWARE_BINDING_HTTP_RESPONSE_PRE_RETURN\x10\x02\x12\x43\n?SUPERVISOR_MIDDLEWARE_BINDING_WEBSOCKET_MESSAGE_PRE_CREDENTIALS\x10\x03\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'sandbox_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_NETWORKTLSMODE'].values_by_name["NETWORK_TLS_MODE_TERMINATE"]._loaded_options = None + _globals['_NETWORKTLSMODE'].values_by_name["NETWORK_TLS_MODE_TERMINATE"]._serialized_options = b'\010\001' + _globals['_NETWORKTLSMODE'].values_by_name["NETWORK_TLS_MODE_PASSTHROUGH"]._loaded_options = None + _globals['_NETWORKTLSMODE'].values_by_name["NETWORK_TLS_MODE_PASSTHROUGH"]._serialized_options = b'\010\001' + _globals['_SANDBOXPOLICY_NETWORKPOLICIESENTRY']._loaded_options = None + _globals['_SANDBOXPOLICY_NETWORKPOLICIESENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXPOLICY_NETWORKMIDDLEWARESENTRY']._loaded_options = None + _globals['_SANDBOXPOLICY_NETWORKMIDDLEWARESENTRY']._serialized_options = b'8\001' + _globals['_NETWORKENDPOINT_GRAPHQLPERSISTEDQUERIESENTRY']._loaded_options = None + _globals['_NETWORKENDPOINT_GRAPHQLPERSISTEDQUERIESENTRY']._serialized_options = b'8\001' + _globals['_L7DENYRULE_QUERYENTRY']._loaded_options = None + _globals['_L7DENYRULE_QUERYENTRY']._serialized_options = b'8\001' + _globals['_L7DENYRULE_PARAMSENTRY']._loaded_options = None + _globals['_L7DENYRULE_PARAMSENTRY']._serialized_options = b'8\001' + _globals['_L7ALLOW_QUERYENTRY']._loaded_options = None + _globals['_L7ALLOW_QUERYENTRY']._serialized_options = b'8\001' + _globals['_L7ALLOW_PARAMSENTRY']._loaded_options = None + _globals['_L7ALLOW_PARAMSENTRY']._serialized_options = b'8\001' + _globals['_GETGATEWAYCONFIGRESPONSE_SETTINGSENTRY']._loaded_options = None + _globals['_GETGATEWAYCONFIGRESPONSE_SETTINGSENTRY']._serialized_options = b'8\001' + _globals['_SANDBOXCONFIGSNAPSHOT_SETTINGSENTRY']._loaded_options = None + _globals['_SANDBOXCONFIGSNAPSHOT_SETTINGSENTRY']._serialized_options = b'8\001' + _globals['_GETSANDBOXCONFIGRESPONSE_SETTINGSENTRY']._loaded_options = None + _globals['_GETSANDBOXCONFIGRESPONSE_SETTINGSENTRY']._serialized_options = b'8\001' + _globals['_NETWORKTLSMODE']._serialized_start=6517 + _globals['_NETWORKTLSMODE']._serialized_end=6668 + _globals['_NETWORKENFORCEMENTMODE']._serialized_start=6671 + _globals['_NETWORKENFORCEMENTMODE']._serialized_end=6811 + _globals['_NETWORKACCESSPRESET']._serialized_start=6814 + _globals['_NETWORKACCESSPRESET']._serialized_end=6981 + _globals['_SETTINGSCOPE']._serialized_start=6983 + _globals['_SETTINGSCOPE']._serialized_end=7081 + _globals['_POLICYSOURCE']._serialized_start=7083 + _globals['_POLICYSOURCE']._serialized_end=7181 + _globals['_SUPERVISORMIDDLEWAREBINDINGPOLICY']._serialized_start=7184 + _globals['_SUPERVISORMIDDLEWAREBINDINGPOLICY']._serialized_end=7423 + _globals['_SUPERVISORMIDDLEWAREBINDING']._serialized_start=7426 + _globals['_SUPERVISORMIDDLEWAREBINDING']._serialized_end=7695 + _globals['_SANDBOXPOLICY']._serialized_start=119 + _globals['_SANDBOXPOLICY']._serialized_end=698 + _globals['_SANDBOXPOLICY_NETWORKPOLICIESENTRY']._serialized_start=497 + _globals['_SANDBOXPOLICY_NETWORKPOLICIESENTRY']._serialized_end=592 + _globals['_SANDBOXPOLICY_NETWORKMIDDLEWARESENTRY']._serialized_start=594 + _globals['_SANDBOXPOLICY_NETWORKMIDDLEWARESENTRY']._serialized_end=698 + _globals['_FILESYSTEMPOLICY']._serialized_start=700 + _globals['_FILESYSTEMPOLICY']._serialized_end=782 + _globals['_LANDLOCKPOLICY']._serialized_start=784 + _globals['_LANDLOCKPOLICY']._serialized_end=823 + _globals['_PROCESSPOLICY']._serialized_start=825 + _globals['_PROCESSPOLICY']._serialized_end=883 + _globals['_NETWORKPOLICYRULE']._serialized_start=886 + _globals['_NETWORKPOLICYRULE']._serialized_end=1032 + _globals['_NETWORKMIDDLEWARECONFIG']._serialized_start=1035 + _globals['_NETWORKMIDDLEWARECONFIG']._serialized_end=1237 + _globals['_MIDDLEWAREENDPOINTSELECTOR']._serialized_start=1239 + _globals['_MIDDLEWAREENDPOINTSELECTOR']._serialized_end=1301 + _globals['_NETWORKCREDENTIALBINDING']._serialized_start=1303 + _globals['_NETWORKCREDENTIALBINDING']._serialized_end=1347 + _globals['_NETWORKENDPOINT']._serialized_start=1350 + _globals['_NETWORKENDPOINT']._serialized_end=2469 + _globals['_NETWORKENDPOINT_GRAPHQLPERSISTEDQUERIESENTRY']._serialized_start=2367 + _globals['_NETWORKENDPOINT_GRAPHQLPERSISTEDQUERIESENTRY']._serialized_end=2469 + _globals['_MCPOPTIONS']._serialized_start=2472 + _globals['_MCPOPTIONS']._serialized_end=2630 + _globals['_GRAPHQLOPERATION']._serialized_start=2632 + _globals['_GRAPHQLOPERATION']._serialized_end=2714 + _globals['_L7DENYRULE']._serialized_start=2717 + _globals['_L7DENYRULE']._serialized_end=3137 + _globals['_L7DENYRULE_QUERYENTRY']._serialized_start=2964 + _globals['_L7DENYRULE_QUERYENTRY']._serialized_end=3046 + _globals['_L7DENYRULE_PARAMSENTRY']._serialized_start=3048 + _globals['_L7DENYRULE_PARAMSENTRY']._serialized_end=3131 + _globals['_L7RULE']._serialized_start=3139 + _globals['_L7RULE']._serialized_end=3193 + _globals['_L7ALLOW']._serialized_start=3196 + _globals['_L7ALLOW']._serialized_end=3607 + _globals['_L7ALLOW_QUERYENTRY']._serialized_start=2964 + _globals['_L7ALLOW_QUERYENTRY']._serialized_end=3046 + _globals['_L7ALLOW_PARAMSENTRY']._serialized_start=3048 + _globals['_L7ALLOW_PARAMSENTRY']._serialized_end=3131 + _globals['_L7QUERYMATCHER']._serialized_start=3609 + _globals['_L7QUERYMATCHER']._serialized_end=3652 + _globals['_NETWORKBINARY']._serialized_start=3654 + _globals['_NETWORKBINARY']._serialized_end=3698 + _globals['_GETSANDBOXCONFIGREQUEST']._serialized_start=3700 + _globals['_GETSANDBOXCONFIGREQUEST']._serialized_end=3807 + _globals['_GETGATEWAYCONFIGREQUEST']._serialized_start=3809 + _globals['_GETGATEWAYCONFIGREQUEST']._serialized_end=3834 + _globals['_GETGATEWAYCONFIGRESPONSE']._serialized_start=3837 + _globals['_GETGATEWAYCONFIGRESPONSE']._serialized_end=4055 + _globals['_GETGATEWAYCONFIGRESPONSE_SETTINGSENTRY']._serialized_start=3972 + _globals['_GETGATEWAYCONFIGRESPONSE_SETTINGSENTRY']._serialized_end=4055 + _globals['_SETTINGVALUE']._serialized_start=4057 + _globals['_SETTINGVALUE']._serialized_end=4170 + _globals['_EFFECTIVESETTING']._serialized_start=4172 + _globals['_EFFECTIVESETTING']._serialized_end=4292 + _globals['_SANDBOXCONFIGSNAPSHOT']._serialized_start=4295 + _globals['_SANDBOXCONFIGSNAPSHOT']._serialized_end=5138 + _globals['_SANDBOXCONFIGSNAPSHOT_SETTINGSENTRY']._serialized_start=5051 + _globals['_SANDBOXCONFIGSNAPSHOT_SETTINGSENTRY']._serialized_end=5138 + _globals['_GETSANDBOXCONFIGRESPONSE']._serialized_start=5141 + _globals['_GETSANDBOXCONFIGRESPONSE']._serialized_end=5990 + _globals['_GETSANDBOXCONFIGRESPONSE_SETTINGSENTRY']._serialized_start=5051 + _globals['_GETSANDBOXCONFIGRESPONSE_SETTINGSENTRY']._serialized_end=5138 + _globals['_SANDBOXSERVICEROUTE']._serialized_start=5993 + _globals['_SANDBOXSERVICEROUTE']._serialized_end=6124 + _globals['_SUPERVISORMIDDLEWARESERVICE']._serialized_start=6127 + _globals['_SUPERVISORMIDDLEWARESERVICE']._serialized_end=6514 +# @@protoc_insertion_point(module_scope) diff --git a/src/openshell/_proto/sandbox_pb2.pyi b/src/openshell/_proto/sandbox_pb2.pyi new file mode 100644 index 0000000..fec9fa6 --- /dev/null +++ b/src/openshell/_proto/sandbox_pb2.pyi @@ -0,0 +1,528 @@ +import datetime + +from google.protobuf import struct_pb2 as _struct_pb2 +from google.protobuf import duration_pb2 as _duration_pb2 +from . import datamodel_pb2 as _datamodel_pb2 +from google.protobuf.internal import containers as _containers +from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from collections.abc import Iterable as _Iterable, Mapping as _Mapping +from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union + +DESCRIPTOR: _descriptor.FileDescriptor + +class NetworkTlsMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + NETWORK_TLS_MODE_UNSPECIFIED: _ClassVar[NetworkTlsMode] + NETWORK_TLS_MODE_SKIP: _ClassVar[NetworkTlsMode] + NETWORK_TLS_MODE_TERMINATE: _ClassVar[NetworkTlsMode] + NETWORK_TLS_MODE_PASSTHROUGH: _ClassVar[NetworkTlsMode] + +class NetworkEnforcementMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + NETWORK_ENFORCEMENT_MODE_UNSPECIFIED: _ClassVar[NetworkEnforcementMode] + NETWORK_ENFORCEMENT_MODE_ENFORCE: _ClassVar[NetworkEnforcementMode] + NETWORK_ENFORCEMENT_MODE_AUDIT: _ClassVar[NetworkEnforcementMode] + +class NetworkAccessPreset(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + NETWORK_ACCESS_PRESET_UNSPECIFIED: _ClassVar[NetworkAccessPreset] + NETWORK_ACCESS_PRESET_READ_ONLY: _ClassVar[NetworkAccessPreset] + NETWORK_ACCESS_PRESET_READ_WRITE: _ClassVar[NetworkAccessPreset] + NETWORK_ACCESS_PRESET_FULL: _ClassVar[NetworkAccessPreset] + +class SettingScope(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + SETTING_SCOPE_UNSPECIFIED: _ClassVar[SettingScope] + SETTING_SCOPE_SANDBOX: _ClassVar[SettingScope] + SETTING_SCOPE_GLOBAL: _ClassVar[SettingScope] + +class PolicySource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + POLICY_SOURCE_UNSPECIFIED: _ClassVar[PolicySource] + POLICY_SOURCE_SANDBOX: _ClassVar[PolicySource] + POLICY_SOURCE_GLOBAL: _ClassVar[PolicySource] + +class SupervisorMiddlewareBindingPolicy(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + SUPERVISOR_MIDDLEWARE_BINDING_POLICY_UNSPECIFIED: _ClassVar[SupervisorMiddlewareBindingPolicy] + SUPERVISOR_MIDDLEWARE_BINDING_POLICY_DYNAMIC: _ClassVar[SupervisorMiddlewareBindingPolicy] + SUPERVISOR_MIDDLEWARE_BINDING_POLICY_ALLOWLIST: _ClassVar[SupervisorMiddlewareBindingPolicy] + SUPERVISOR_MIDDLEWARE_BINDING_POLICY_EXACT: _ClassVar[SupervisorMiddlewareBindingPolicy] + +class SupervisorMiddlewareBinding(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + SUPERVISOR_MIDDLEWARE_BINDING_UNSPECIFIED: _ClassVar[SupervisorMiddlewareBinding] + SUPERVISOR_MIDDLEWARE_BINDING_HTTP_REQUEST_PRE_CREDENTIALS: _ClassVar[SupervisorMiddlewareBinding] + SUPERVISOR_MIDDLEWARE_BINDING_HTTP_RESPONSE_PRE_RETURN: _ClassVar[SupervisorMiddlewareBinding] + SUPERVISOR_MIDDLEWARE_BINDING_WEBSOCKET_MESSAGE_PRE_CREDENTIALS: _ClassVar[SupervisorMiddlewareBinding] +NETWORK_TLS_MODE_UNSPECIFIED: NetworkTlsMode +NETWORK_TLS_MODE_SKIP: NetworkTlsMode +NETWORK_TLS_MODE_TERMINATE: NetworkTlsMode +NETWORK_TLS_MODE_PASSTHROUGH: NetworkTlsMode +NETWORK_ENFORCEMENT_MODE_UNSPECIFIED: NetworkEnforcementMode +NETWORK_ENFORCEMENT_MODE_ENFORCE: NetworkEnforcementMode +NETWORK_ENFORCEMENT_MODE_AUDIT: NetworkEnforcementMode +NETWORK_ACCESS_PRESET_UNSPECIFIED: NetworkAccessPreset +NETWORK_ACCESS_PRESET_READ_ONLY: NetworkAccessPreset +NETWORK_ACCESS_PRESET_READ_WRITE: NetworkAccessPreset +NETWORK_ACCESS_PRESET_FULL: NetworkAccessPreset +SETTING_SCOPE_UNSPECIFIED: SettingScope +SETTING_SCOPE_SANDBOX: SettingScope +SETTING_SCOPE_GLOBAL: SettingScope +POLICY_SOURCE_UNSPECIFIED: PolicySource +POLICY_SOURCE_SANDBOX: PolicySource +POLICY_SOURCE_GLOBAL: PolicySource +SUPERVISOR_MIDDLEWARE_BINDING_POLICY_UNSPECIFIED: SupervisorMiddlewareBindingPolicy +SUPERVISOR_MIDDLEWARE_BINDING_POLICY_DYNAMIC: SupervisorMiddlewareBindingPolicy +SUPERVISOR_MIDDLEWARE_BINDING_POLICY_ALLOWLIST: SupervisorMiddlewareBindingPolicy +SUPERVISOR_MIDDLEWARE_BINDING_POLICY_EXACT: SupervisorMiddlewareBindingPolicy +SUPERVISOR_MIDDLEWARE_BINDING_UNSPECIFIED: SupervisorMiddlewareBinding +SUPERVISOR_MIDDLEWARE_BINDING_HTTP_REQUEST_PRE_CREDENTIALS: SupervisorMiddlewareBinding +SUPERVISOR_MIDDLEWARE_BINDING_HTTP_RESPONSE_PRE_RETURN: SupervisorMiddlewareBinding +SUPERVISOR_MIDDLEWARE_BINDING_WEBSOCKET_MESSAGE_PRE_CREDENTIALS: SupervisorMiddlewareBinding + +class SandboxPolicy(_message.Message): + __slots__ = ("version", "filesystem", "landlock", "process", "network_policies", "network_middlewares") + class NetworkPoliciesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: NetworkPolicyRule + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[NetworkPolicyRule, _Mapping]] = ...) -> None: ... + class NetworkMiddlewaresEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: NetworkMiddlewareConfig + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[NetworkMiddlewareConfig, _Mapping]] = ...) -> None: ... + VERSION_FIELD_NUMBER: _ClassVar[int] + FILESYSTEM_FIELD_NUMBER: _ClassVar[int] + LANDLOCK_FIELD_NUMBER: _ClassVar[int] + PROCESS_FIELD_NUMBER: _ClassVar[int] + NETWORK_POLICIES_FIELD_NUMBER: _ClassVar[int] + NETWORK_MIDDLEWARES_FIELD_NUMBER: _ClassVar[int] + version: int + filesystem: FilesystemPolicy + landlock: LandlockPolicy + process: ProcessPolicy + network_policies: _containers.MessageMap[str, NetworkPolicyRule] + network_middlewares: _containers.MessageMap[str, NetworkMiddlewareConfig] + def __init__(self, version: _Optional[int] = ..., filesystem: _Optional[_Union[FilesystemPolicy, _Mapping]] = ..., landlock: _Optional[_Union[LandlockPolicy, _Mapping]] = ..., process: _Optional[_Union[ProcessPolicy, _Mapping]] = ..., network_policies: _Optional[_Mapping[str, NetworkPolicyRule]] = ..., network_middlewares: _Optional[_Mapping[str, NetworkMiddlewareConfig]] = ...) -> None: ... + +class FilesystemPolicy(_message.Message): + __slots__ = ("include_workdir", "read_only", "read_write") + INCLUDE_WORKDIR_FIELD_NUMBER: _ClassVar[int] + READ_ONLY_FIELD_NUMBER: _ClassVar[int] + READ_WRITE_FIELD_NUMBER: _ClassVar[int] + include_workdir: bool + read_only: _containers.RepeatedScalarFieldContainer[str] + read_write: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, include_workdir: bool = ..., read_only: _Optional[_Iterable[str]] = ..., read_write: _Optional[_Iterable[str]] = ...) -> None: ... + +class LandlockPolicy(_message.Message): + __slots__ = ("compatibility",) + COMPATIBILITY_FIELD_NUMBER: _ClassVar[int] + compatibility: str + def __init__(self, compatibility: _Optional[str] = ...) -> None: ... + +class ProcessPolicy(_message.Message): + __slots__ = ("run_as_user", "run_as_group") + RUN_AS_USER_FIELD_NUMBER: _ClassVar[int] + RUN_AS_GROUP_FIELD_NUMBER: _ClassVar[int] + run_as_user: str + run_as_group: str + def __init__(self, run_as_user: _Optional[str] = ..., run_as_group: _Optional[str] = ...) -> None: ... + +class NetworkPolicyRule(_message.Message): + __slots__ = ("name", "endpoints", "binaries") + NAME_FIELD_NUMBER: _ClassVar[int] + ENDPOINTS_FIELD_NUMBER: _ClassVar[int] + BINARIES_FIELD_NUMBER: _ClassVar[int] + name: str + endpoints: _containers.RepeatedCompositeFieldContainer[NetworkEndpoint] + binaries: _containers.RepeatedCompositeFieldContainer[NetworkBinary] + def __init__(self, name: _Optional[str] = ..., endpoints: _Optional[_Iterable[_Union[NetworkEndpoint, _Mapping]]] = ..., binaries: _Optional[_Iterable[_Union[NetworkBinary, _Mapping]]] = ...) -> None: ... + +class NetworkMiddlewareConfig(_message.Message): + __slots__ = ("name", "middleware", "config", "on_error", "endpoints", "order") + NAME_FIELD_NUMBER: _ClassVar[int] + MIDDLEWARE_FIELD_NUMBER: _ClassVar[int] + CONFIG_FIELD_NUMBER: _ClassVar[int] + ON_ERROR_FIELD_NUMBER: _ClassVar[int] + ENDPOINTS_FIELD_NUMBER: _ClassVar[int] + ORDER_FIELD_NUMBER: _ClassVar[int] + name: str + middleware: str + config: _struct_pb2.Struct + on_error: str + endpoints: MiddlewareEndpointSelector + order: int + def __init__(self, name: _Optional[str] = ..., middleware: _Optional[str] = ..., config: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., on_error: _Optional[str] = ..., endpoints: _Optional[_Union[MiddlewareEndpointSelector, _Mapping]] = ..., order: _Optional[int] = ...) -> None: ... + +class MiddlewareEndpointSelector(_message.Message): + __slots__ = ("include", "exclude") + INCLUDE_FIELD_NUMBER: _ClassVar[int] + EXCLUDE_FIELD_NUMBER: _ClassVar[int] + include: _containers.RepeatedScalarFieldContainer[str] + exclude: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, include: _Optional[_Iterable[str]] = ..., exclude: _Optional[_Iterable[str]] = ...) -> None: ... + +class NetworkCredentialBinding(_message.Message): + __slots__ = ("provider",) + PROVIDER_FIELD_NUMBER: _ClassVar[int] + provider: str + def __init__(self, provider: _Optional[str] = ...) -> None: ... + +class NetworkEndpoint(_message.Message): + __slots__ = ("host", "port", "protocol", "tls", "enforcement", "access", "rules", "allowed_ips", "ports", "deny_rules", "allow_encoded_slash", "persisted_queries", "graphql_persisted_queries", "graphql_max_body_bytes", "path", "websocket_credential_rewrite", "request_body_credential_rewrite", "advisor_proposed", "credential_signing", "signing_service", "signing_region", "json_rpc_max_body_bytes", "mcp", "credential_binding", "allow_uninspected_credentials", "provider_credentialed", "token_grant_owner") + class GraphqlPersistedQueriesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: GraphqlOperation + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[GraphqlOperation, _Mapping]] = ...) -> None: ... + HOST_FIELD_NUMBER: _ClassVar[int] + PORT_FIELD_NUMBER: _ClassVar[int] + PROTOCOL_FIELD_NUMBER: _ClassVar[int] + TLS_FIELD_NUMBER: _ClassVar[int] + ENFORCEMENT_FIELD_NUMBER: _ClassVar[int] + ACCESS_FIELD_NUMBER: _ClassVar[int] + RULES_FIELD_NUMBER: _ClassVar[int] + ALLOWED_IPS_FIELD_NUMBER: _ClassVar[int] + PORTS_FIELD_NUMBER: _ClassVar[int] + DENY_RULES_FIELD_NUMBER: _ClassVar[int] + ALLOW_ENCODED_SLASH_FIELD_NUMBER: _ClassVar[int] + PERSISTED_QUERIES_FIELD_NUMBER: _ClassVar[int] + GRAPHQL_PERSISTED_QUERIES_FIELD_NUMBER: _ClassVar[int] + GRAPHQL_MAX_BODY_BYTES_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + WEBSOCKET_CREDENTIAL_REWRITE_FIELD_NUMBER: _ClassVar[int] + REQUEST_BODY_CREDENTIAL_REWRITE_FIELD_NUMBER: _ClassVar[int] + ADVISOR_PROPOSED_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_SIGNING_FIELD_NUMBER: _ClassVar[int] + SIGNING_SERVICE_FIELD_NUMBER: _ClassVar[int] + SIGNING_REGION_FIELD_NUMBER: _ClassVar[int] + JSON_RPC_MAX_BODY_BYTES_FIELD_NUMBER: _ClassVar[int] + MCP_FIELD_NUMBER: _ClassVar[int] + CREDENTIAL_BINDING_FIELD_NUMBER: _ClassVar[int] + ALLOW_UNINSPECTED_CREDENTIALS_FIELD_NUMBER: _ClassVar[int] + PROVIDER_CREDENTIALED_FIELD_NUMBER: _ClassVar[int] + TOKEN_GRANT_OWNER_FIELD_NUMBER: _ClassVar[int] + host: str + port: int + protocol: str + tls: NetworkTlsMode + enforcement: NetworkEnforcementMode + access: NetworkAccessPreset + rules: _containers.RepeatedCompositeFieldContainer[L7Rule] + allowed_ips: _containers.RepeatedScalarFieldContainer[str] + ports: _containers.RepeatedScalarFieldContainer[int] + deny_rules: _containers.RepeatedCompositeFieldContainer[L7DenyRule] + allow_encoded_slash: bool + persisted_queries: str + graphql_persisted_queries: _containers.MessageMap[str, GraphqlOperation] + graphql_max_body_bytes: int + path: str + websocket_credential_rewrite: bool + request_body_credential_rewrite: bool + advisor_proposed: bool + credential_signing: str + signing_service: str + signing_region: str + json_rpc_max_body_bytes: int + mcp: McpOptions + credential_binding: NetworkCredentialBinding + allow_uninspected_credentials: bool + provider_credentialed: bool + token_grant_owner: str + def __init__(self, host: _Optional[str] = ..., port: _Optional[int] = ..., protocol: _Optional[str] = ..., tls: _Optional[_Union[NetworkTlsMode, str]] = ..., enforcement: _Optional[_Union[NetworkEnforcementMode, str]] = ..., access: _Optional[_Union[NetworkAccessPreset, str]] = ..., rules: _Optional[_Iterable[_Union[L7Rule, _Mapping]]] = ..., allowed_ips: _Optional[_Iterable[str]] = ..., ports: _Optional[_Iterable[int]] = ..., deny_rules: _Optional[_Iterable[_Union[L7DenyRule, _Mapping]]] = ..., allow_encoded_slash: bool = ..., persisted_queries: _Optional[str] = ..., graphql_persisted_queries: _Optional[_Mapping[str, GraphqlOperation]] = ..., graphql_max_body_bytes: _Optional[int] = ..., path: _Optional[str] = ..., websocket_credential_rewrite: bool = ..., request_body_credential_rewrite: bool = ..., advisor_proposed: bool = ..., credential_signing: _Optional[str] = ..., signing_service: _Optional[str] = ..., signing_region: _Optional[str] = ..., json_rpc_max_body_bytes: _Optional[int] = ..., mcp: _Optional[_Union[McpOptions, _Mapping]] = ..., credential_binding: _Optional[_Union[NetworkCredentialBinding, _Mapping]] = ..., allow_uninspected_credentials: bool = ..., provider_credentialed: bool = ..., token_grant_owner: _Optional[str] = ...) -> None: ... + +class McpOptions(_message.Message): + __slots__ = ("strict_tool_names", "allow_all_known_mcp_methods", "versions") + STRICT_TOOL_NAMES_FIELD_NUMBER: _ClassVar[int] + ALLOW_ALL_KNOWN_MCP_METHODS_FIELD_NUMBER: _ClassVar[int] + VERSIONS_FIELD_NUMBER: _ClassVar[int] + strict_tool_names: bool + allow_all_known_mcp_methods: bool + versions: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, strict_tool_names: bool = ..., allow_all_known_mcp_methods: bool = ..., versions: _Optional[_Iterable[str]] = ...) -> None: ... + +class GraphqlOperation(_message.Message): + __slots__ = ("operation_type", "operation_name", "fields") + OPERATION_TYPE_FIELD_NUMBER: _ClassVar[int] + OPERATION_NAME_FIELD_NUMBER: _ClassVar[int] + FIELDS_FIELD_NUMBER: _ClassVar[int] + operation_type: str + operation_name: str + fields: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, operation_type: _Optional[str] = ..., operation_name: _Optional[str] = ..., fields: _Optional[_Iterable[str]] = ...) -> None: ... + +class L7DenyRule(_message.Message): + __slots__ = ("method", "path", "command", "query", "operation_type", "operation_name", "fields", "params") + class QueryEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: L7QueryMatcher + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[L7QueryMatcher, _Mapping]] = ...) -> None: ... + class ParamsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: L7QueryMatcher + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[L7QueryMatcher, _Mapping]] = ...) -> None: ... + METHOD_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + COMMAND_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + OPERATION_TYPE_FIELD_NUMBER: _ClassVar[int] + OPERATION_NAME_FIELD_NUMBER: _ClassVar[int] + FIELDS_FIELD_NUMBER: _ClassVar[int] + PARAMS_FIELD_NUMBER: _ClassVar[int] + method: str + path: str + command: str + query: _containers.MessageMap[str, L7QueryMatcher] + operation_type: str + operation_name: str + fields: _containers.RepeatedScalarFieldContainer[str] + params: _containers.MessageMap[str, L7QueryMatcher] + def __init__(self, method: _Optional[str] = ..., path: _Optional[str] = ..., command: _Optional[str] = ..., query: _Optional[_Mapping[str, L7QueryMatcher]] = ..., operation_type: _Optional[str] = ..., operation_name: _Optional[str] = ..., fields: _Optional[_Iterable[str]] = ..., params: _Optional[_Mapping[str, L7QueryMatcher]] = ...) -> None: ... + +class L7Rule(_message.Message): + __slots__ = ("allow",) + ALLOW_FIELD_NUMBER: _ClassVar[int] + allow: L7Allow + def __init__(self, allow: _Optional[_Union[L7Allow, _Mapping]] = ...) -> None: ... + +class L7Allow(_message.Message): + __slots__ = ("method", "path", "command", "query", "operation_type", "operation_name", "fields", "params") + class QueryEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: L7QueryMatcher + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[L7QueryMatcher, _Mapping]] = ...) -> None: ... + class ParamsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: L7QueryMatcher + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[L7QueryMatcher, _Mapping]] = ...) -> None: ... + METHOD_FIELD_NUMBER: _ClassVar[int] + PATH_FIELD_NUMBER: _ClassVar[int] + COMMAND_FIELD_NUMBER: _ClassVar[int] + QUERY_FIELD_NUMBER: _ClassVar[int] + OPERATION_TYPE_FIELD_NUMBER: _ClassVar[int] + OPERATION_NAME_FIELD_NUMBER: _ClassVar[int] + FIELDS_FIELD_NUMBER: _ClassVar[int] + PARAMS_FIELD_NUMBER: _ClassVar[int] + method: str + path: str + command: str + query: _containers.MessageMap[str, L7QueryMatcher] + operation_type: str + operation_name: str + fields: _containers.RepeatedScalarFieldContainer[str] + params: _containers.MessageMap[str, L7QueryMatcher] + def __init__(self, method: _Optional[str] = ..., path: _Optional[str] = ..., command: _Optional[str] = ..., query: _Optional[_Mapping[str, L7QueryMatcher]] = ..., operation_type: _Optional[str] = ..., operation_name: _Optional[str] = ..., fields: _Optional[_Iterable[str]] = ..., params: _Optional[_Mapping[str, L7QueryMatcher]] = ...) -> None: ... + +class L7QueryMatcher(_message.Message): + __slots__ = ("glob", "any") + GLOB_FIELD_NUMBER: _ClassVar[int] + ANY_FIELD_NUMBER: _ClassVar[int] + glob: str + any: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, glob: _Optional[str] = ..., any: _Optional[_Iterable[str]] = ...) -> None: ... + +class NetworkBinary(_message.Message): + __slots__ = ("path",) + PATH_FIELD_NUMBER: _ClassVar[int] + path: str + def __init__(self, path: _Optional[str] = ...) -> None: ... + +class GetSandboxConfigRequest(_message.Message): + __slots__ = ("workspace_scope", "name") + WORKSPACE_SCOPE_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + workspace_scope: _datamodel_pb2.WorkspaceSelector + name: str + def __init__(self, workspace_scope: _Optional[_Union[_datamodel_pb2.WorkspaceSelector, _Mapping]] = ..., name: _Optional[str] = ...) -> None: ... + +class GetGatewayConfigRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GetGatewayConfigResponse(_message.Message): + __slots__ = ("settings", "settings_revision") + class SettingsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: SettingValue + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[SettingValue, _Mapping]] = ...) -> None: ... + SETTINGS_FIELD_NUMBER: _ClassVar[int] + SETTINGS_REVISION_FIELD_NUMBER: _ClassVar[int] + settings: _containers.MessageMap[str, SettingValue] + settings_revision: int + def __init__(self, settings: _Optional[_Mapping[str, SettingValue]] = ..., settings_revision: _Optional[int] = ...) -> None: ... + +class SettingValue(_message.Message): + __slots__ = ("string_value", "bool_value", "int_value", "bytes_value") + STRING_VALUE_FIELD_NUMBER: _ClassVar[int] + BOOL_VALUE_FIELD_NUMBER: _ClassVar[int] + INT_VALUE_FIELD_NUMBER: _ClassVar[int] + BYTES_VALUE_FIELD_NUMBER: _ClassVar[int] + string_value: str + bool_value: bool + int_value: int + bytes_value: bytes + def __init__(self, string_value: _Optional[str] = ..., bool_value: bool = ..., int_value: _Optional[int] = ..., bytes_value: _Optional[bytes] = ...) -> None: ... + +class EffectiveSetting(_message.Message): + __slots__ = ("value", "scope") + VALUE_FIELD_NUMBER: _ClassVar[int] + SCOPE_FIELD_NUMBER: _ClassVar[int] + value: SettingValue + scope: SettingScope + def __init__(self, value: _Optional[_Union[SettingValue, _Mapping]] = ..., scope: _Optional[_Union[SettingScope, str]] = ...) -> None: ... + +class SandboxConfigSnapshot(_message.Message): + __slots__ = ("policy", "version", "policy_hash", "settings", "config_revision", "policy_source", "global_policy_version", "provider_env_revision", "supervisor_middleware_services", "workspace", "policy_validation_failure_mode", "extension_authentication_enabled", "configuration_admitted", "provider_attachment_epoch", "configuration_instance_id", "configuration_error", "settings_revision", "service_routes") + class SettingsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: EffectiveSetting + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[EffectiveSetting, _Mapping]] = ...) -> None: ... + POLICY_FIELD_NUMBER: _ClassVar[int] + VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + SETTINGS_FIELD_NUMBER: _ClassVar[int] + CONFIG_REVISION_FIELD_NUMBER: _ClassVar[int] + POLICY_SOURCE_FIELD_NUMBER: _ClassVar[int] + GLOBAL_POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + SUPERVISOR_MIDDLEWARE_SERVICES_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + POLICY_VALIDATION_FAILURE_MODE_FIELD_NUMBER: _ClassVar[int] + EXTENSION_AUTHENTICATION_ENABLED_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_ADMITTED_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ATTACHMENT_EPOCH_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_ERROR_FIELD_NUMBER: _ClassVar[int] + SETTINGS_REVISION_FIELD_NUMBER: _ClassVar[int] + SERVICE_ROUTES_FIELD_NUMBER: _ClassVar[int] + policy: SandboxPolicy + version: int + policy_hash: str + settings: _containers.MessageMap[str, EffectiveSetting] + config_revision: int + policy_source: PolicySource + global_policy_version: int + provider_env_revision: int + supervisor_middleware_services: _containers.RepeatedCompositeFieldContainer[SupervisorMiddlewareService] + workspace: str + policy_validation_failure_mode: str + extension_authentication_enabled: bool + configuration_admitted: bool + provider_attachment_epoch: str + configuration_instance_id: str + configuration_error: str + settings_revision: int + service_routes: _containers.RepeatedCompositeFieldContainer[SandboxServiceRoute] + def __init__(self, policy: _Optional[_Union[SandboxPolicy, _Mapping]] = ..., version: _Optional[int] = ..., policy_hash: _Optional[str] = ..., settings: _Optional[_Mapping[str, EffectiveSetting]] = ..., config_revision: _Optional[int] = ..., policy_source: _Optional[_Union[PolicySource, str]] = ..., global_policy_version: _Optional[int] = ..., provider_env_revision: _Optional[int] = ..., supervisor_middleware_services: _Optional[_Iterable[_Union[SupervisorMiddlewareService, _Mapping]]] = ..., workspace: _Optional[str] = ..., policy_validation_failure_mode: _Optional[str] = ..., extension_authentication_enabled: bool = ..., configuration_admitted: bool = ..., provider_attachment_epoch: _Optional[str] = ..., configuration_instance_id: _Optional[str] = ..., configuration_error: _Optional[str] = ..., settings_revision: _Optional[int] = ..., service_routes: _Optional[_Iterable[_Union[SandboxServiceRoute, _Mapping]]] = ...) -> None: ... + +class GetSandboxConfigResponse(_message.Message): + __slots__ = ("policy", "version", "policy_hash", "settings", "config_revision", "policy_source", "global_policy_version", "provider_env_revision", "supervisor_middleware_services", "workspace", "policy_validation_failure_mode", "extension_authentication_enabled", "provider_attachment_epoch", "configuration_admitted", "configuration_error", "configuration_instance_id", "settings_revision", "service_routes") + class SettingsEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: EffectiveSetting + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[EffectiveSetting, _Mapping]] = ...) -> None: ... + POLICY_FIELD_NUMBER: _ClassVar[int] + VERSION_FIELD_NUMBER: _ClassVar[int] + POLICY_HASH_FIELD_NUMBER: _ClassVar[int] + SETTINGS_FIELD_NUMBER: _ClassVar[int] + CONFIG_REVISION_FIELD_NUMBER: _ClassVar[int] + POLICY_SOURCE_FIELD_NUMBER: _ClassVar[int] + GLOBAL_POLICY_VERSION_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ENV_REVISION_FIELD_NUMBER: _ClassVar[int] + SUPERVISOR_MIDDLEWARE_SERVICES_FIELD_NUMBER: _ClassVar[int] + WORKSPACE_FIELD_NUMBER: _ClassVar[int] + POLICY_VALIDATION_FAILURE_MODE_FIELD_NUMBER: _ClassVar[int] + EXTENSION_AUTHENTICATION_ENABLED_FIELD_NUMBER: _ClassVar[int] + PROVIDER_ATTACHMENT_EPOCH_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_ADMITTED_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_ERROR_FIELD_NUMBER: _ClassVar[int] + CONFIGURATION_INSTANCE_ID_FIELD_NUMBER: _ClassVar[int] + SETTINGS_REVISION_FIELD_NUMBER: _ClassVar[int] + SERVICE_ROUTES_FIELD_NUMBER: _ClassVar[int] + policy: SandboxPolicy + version: int + policy_hash: str + settings: _containers.MessageMap[str, EffectiveSetting] + config_revision: int + policy_source: PolicySource + global_policy_version: int + provider_env_revision: int + supervisor_middleware_services: _containers.RepeatedCompositeFieldContainer[SupervisorMiddlewareService] + workspace: str + policy_validation_failure_mode: str + extension_authentication_enabled: bool + provider_attachment_epoch: str + configuration_admitted: bool + configuration_error: str + configuration_instance_id: str + settings_revision: int + service_routes: _containers.RepeatedCompositeFieldContainer[SandboxServiceRoute] + def __init__(self, policy: _Optional[_Union[SandboxPolicy, _Mapping]] = ..., version: _Optional[int] = ..., policy_hash: _Optional[str] = ..., settings: _Optional[_Mapping[str, EffectiveSetting]] = ..., config_revision: _Optional[int] = ..., policy_source: _Optional[_Union[PolicySource, str]] = ..., global_policy_version: _Optional[int] = ..., provider_env_revision: _Optional[int] = ..., supervisor_middleware_services: _Optional[_Iterable[_Union[SupervisorMiddlewareService, _Mapping]]] = ..., workspace: _Optional[str] = ..., policy_validation_failure_mode: _Optional[str] = ..., extension_authentication_enabled: bool = ..., provider_attachment_epoch: _Optional[str] = ..., configuration_admitted: bool = ..., configuration_error: _Optional[str] = ..., configuration_instance_id: _Optional[str] = ..., settings_revision: _Optional[int] = ..., service_routes: _Optional[_Iterable[_Union[SandboxServiceRoute, _Mapping]]] = ...) -> None: ... + +class SandboxServiceRoute(_message.Message): + __slots__ = ("endpoint_id", "name", "target_port", "authorization_mode", "resource_version") + ENDPOINT_ID_FIELD_NUMBER: _ClassVar[int] + NAME_FIELD_NUMBER: _ClassVar[int] + TARGET_PORT_FIELD_NUMBER: _ClassVar[int] + AUTHORIZATION_MODE_FIELD_NUMBER: _ClassVar[int] + RESOURCE_VERSION_FIELD_NUMBER: _ClassVar[int] + endpoint_id: str + name: str + target_port: int + authorization_mode: int + resource_version: int + def __init__(self, endpoint_id: _Optional[str] = ..., name: _Optional[str] = ..., target_port: _Optional[int] = ..., authorization_mode: _Optional[int] = ..., resource_version: _Optional[int] = ...) -> None: ... + +class SupervisorMiddlewareService(_message.Message): + __slots__ = ("name", "grpc_endpoint", "max_payload_bytes", "request_timeout", "tls_ca_cert_pem", "audience", "allow_insecure_transport", "binding_policy", "bindings") + NAME_FIELD_NUMBER: _ClassVar[int] + GRPC_ENDPOINT_FIELD_NUMBER: _ClassVar[int] + MAX_PAYLOAD_BYTES_FIELD_NUMBER: _ClassVar[int] + REQUEST_TIMEOUT_FIELD_NUMBER: _ClassVar[int] + TLS_CA_CERT_PEM_FIELD_NUMBER: _ClassVar[int] + AUDIENCE_FIELD_NUMBER: _ClassVar[int] + ALLOW_INSECURE_TRANSPORT_FIELD_NUMBER: _ClassVar[int] + BINDING_POLICY_FIELD_NUMBER: _ClassVar[int] + BINDINGS_FIELD_NUMBER: _ClassVar[int] + name: str + grpc_endpoint: str + max_payload_bytes: int + request_timeout: _duration_pb2.Duration + tls_ca_cert_pem: bytes + audience: str + allow_insecure_transport: bool + binding_policy: SupervisorMiddlewareBindingPolicy + bindings: _containers.RepeatedScalarFieldContainer[SupervisorMiddlewareBinding] + def __init__(self, name: _Optional[str] = ..., grpc_endpoint: _Optional[str] = ..., max_payload_bytes: _Optional[int] = ..., request_timeout: _Optional[_Union[datetime.timedelta, _duration_pb2.Duration, _Mapping]] = ..., tls_ca_cert_pem: _Optional[bytes] = ..., audience: _Optional[str] = ..., allow_insecure_transport: bool = ..., binding_policy: _Optional[_Union[SupervisorMiddlewareBindingPolicy, str]] = ..., bindings: _Optional[_Iterable[_Union[SupervisorMiddlewareBinding, str]]] = ...) -> None: ... diff --git a/src/openshell/_proto/sandbox_pb2_grpc.py b/src/openshell/_proto/sandbox_pb2_grpc.py new file mode 100644 index 0000000..52a9192 --- /dev/null +++ b/src/openshell/_proto/sandbox_pb2_grpc.py @@ -0,0 +1,24 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + + +GRPC_GENERATED_VERSION = '1.78.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + ' but the generated code in sandbox_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) diff --git a/src/openshell/_proto/sandbox_pb2_grpc.pyi b/src/openshell/_proto/sandbox_pb2_grpc.pyi new file mode 100644 index 0000000..3127e0d --- /dev/null +++ b/src/openshell/_proto/sandbox_pb2_grpc.pyi @@ -0,0 +1,22 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +SPDX-License-Identifier: Apache-2.0 +""" + +from collections import abc as _abc +from grpc import aio as _aio +import abc as _abc_1 +import grpc as _grpc +import typing as _typing + +_T = _typing.TypeVar("_T") + +class _MaybeAsyncIterator(_abc.AsyncIterator[_T], _abc.Iterator[_T], metaclass=_abc_1.ABCMeta): ... + +class _ServicerContext(_grpc.ServicerContext, _aio.ServicerContext): # type: ignore[misc, type-arg] + ... + +GRPC_GENERATED_VERSION: str +GRPC_VERSION: str From 47bbcf9c36654bb149c89f176512de6774316031 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 15:19:17 -0800 Subject: [PATCH 05/12] ci: run checks, a Python 3.11-3.14 test matrix, and the build The aggregating ci job is the single required check, named like sdk-go's. Signed-off-by: Piotr Mlocek --- .github/workflows/ci.yml | 92 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0f482d3 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +name: ci + +on: + pull_request: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + checks: + name: checks + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + + # fetch-core.sh reads proto/ and sdk/conformance from NVIDIA/OpenShell + # at the pinned ref (public, no credentials). + - name: Format, lint, typecheck, proto and fixture drift + run: mise run check + + test: + name: test (${{ matrix.python }}) + runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + # Keep in sync with requires-python and the classifiers in pyproject.toml. + python: ["3.11", "3.12", "3.13", "3.14"] + env: + UV_PYTHON: ${{ matrix.python }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + + - name: Unit tests + run: mise run test + + build: + name: build + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + # setuptools-scm reads the version from git history. + fetch-depth: 0 + + - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + + - name: Build, verify, and install the wheel and sdist + run: mise run build + + # The one required status check. Its name matches ai-openshell/sdk-go, so + # rulesets can require `ci` in every SDK repository regardless of the jobs + # each one runs. + ci: + name: ci + if: always() + needs: [checks, test, build] + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Require every job to succeed + env: + RESULTS: ${{ join(needs.*.result, ' ') }} + run: | + for result in $RESULTS; do + if [ "$result" != success ]; then + echo "::error::a required job finished with '$result' ($RESULTS)" + exit 1 + fi + done From ace5bb096fe7531ad818cebb87ab70a97cacc9f0 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 15:19:17 -0800 Subject: [PATCH 06/12] docs: describe the SDK, the core pin, and the move Signed-off-by: Piotr Mlocek --- README.md | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index efa012c..293fc66 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,50 @@ -# sdk-python +# OpenShell Python SDK -Python SDK for OpenShell. +The `openshell` package is the Python client for the +[OpenShell](https://github.com/NVIDIA/OpenShell) gateway: sandbox lifecycle, +templates, workspaces, exec, and provider credentials, plus the generated gRPC +bindings under `openshell._proto`. + +```shell +pip install openshell +``` + +The SDK moved here from NVIDIA/OpenShell. The package name, import paths, and +API are unchanged, including `openshell._proto`. Releases published from +NVIDIA/OpenShell stay on PyPI. + +## Development + +Tools are managed by [mise](https://mise.jdx.dev/) and dependencies by +[uv](https://docs.astral.sh/uv/). + +```shell +mise run ci # checks, tests, build, and install smoke test +mise run check # format, lint, typecheck, proto and fixture drift +mise run test # unit tests; UV_PYTHON=3.11 picks the interpreter +mise run proto:gen # regenerate src/openshell/_proto from the pinned protos +mise run core:version +``` + +## Core version and generated bindings + +The bindings are generated from `proto/` in NVIDIA/OpenShell at the ref in +`OPENSHELL_CORE_REF` (`mise.toml`, currently `v0.1.7`) and committed under +`src/openshell/_proto`: + +- Building a wheel or sdist needs neither a core checkout nor network access. +- A change of the pin shows the effect on the generated API in its diff. +- `mise run proto:check` fails when the committed bindings differ from the + pinned protos, and `mise run conformance:check` does the same for the + vendored test fixtures. + +## History + +The history up to the move was imported from NVIDIA/OpenShell at `v0.1.7`. +The scripts that extracted and verified it are not on `main`. They are kept at +the `migration/v0.1.7` tag, in +[hack/migration](https://github.com/ai-openshell/sdk-python/tree/migration/v0.1.7/hack/migration). ## License -Apache-2.0. See [LICENSE](./LICENSE). +Apache-2.0. See [LICENSE](LICENSE). From f3d79f0c918a98db2e6f5dcd5b239764310d8798 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 15:38:57 -0800 Subject: [PATCH 07/12] build: fetch the protos with buf export proto:fetch exports openshell.proto and credential_driver.proto from core at OPENSHELL_CORE_REF, and buf adds their imports, the same way sdk-go reads the protos through a buf git input. The generator compiles whatever proto/ holds instead of keeping its own file list. grpcio-tools still generates the bindings, and they are unchanged. fetch-core.sh is now only for the vendored conformance fixtures. Signed-off-by: Piotr Mlocek --- README.md | 3 ++- mise.toml | 13 +++++++++++-- scripts/fetch-core.sh | 4 ++++ scripts/generate_python_proto.py | 20 +++++++++----------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 293fc66..a6475ab 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,8 @@ mise run core:version The bindings are generated from `proto/` in NVIDIA/OpenShell at the ref in `OPENSHELL_CORE_REF` (`mise.toml`, currently `v0.1.7`) and committed under -`src/openshell/_proto`: +`src/openshell/_proto`. `buf export` fetches the protos, the same way sdk-go +reads them, and `grpcio-tools` generates the bindings: - Building a wheel or sdist needs neither a core checkout nor network access. - A change of the pin shows the effect on the generated API in its diff. diff --git a/mise.toml b/mise.toml index 4b1c71e..ff5d3d2 100644 --- a/mise.toml +++ b/mise.toml @@ -10,6 +10,7 @@ min_version = { soft = "2026.9.9" } [tools] python = "3.14.5" +buf = "1.72.0" uv = "0.10.12" [env] @@ -29,8 +30,16 @@ description = "Install the SDK and its development dependencies" run = "uv sync --frozen --group dev" [tasks."proto:fetch"] -description = "Fetch core's proto/ at the pinned ref into proto/" -run = "scripts/fetch-core.sh $OPENSHELL_CORE_REF . proto" +description = "Export the SDK's protos from core at the pinned ref into proto/" +# buf follows the imports of the two root files, so proto/ holds exactly the +# files the SDK compiles. +run = """ +#!/usr/bin/env bash +set -euo pipefail +rm -rf proto +buf export "https://github.com/NVIDIA/OpenShell.git#ref=${OPENSHELL_CORE_REF},depth=1,subdir=proto" \ + --path openshell.proto --path credential_driver.proto --output proto +""" sources = ["mise.toml"] outputs = ["proto/openshell.proto"] diff --git a/scripts/fetch-core.sh b/scripts/fetch-core.sh index 76d4070..46dd554 100755 --- a/scripts/fetch-core.sh +++ b/scripts/fetch-core.sh @@ -4,6 +4,10 @@ # fetch-core.sh: copy files from NVIDIA/OpenShell at a pinned ref. # +# The protos come from `buf export` (mise run proto:fetch); this script fetches +# the other core files the repository checks against, such as the vendored +# conformance fixtures. +# # Usage: fetch-core.sh ... # # Fetches only (a tag or a full commit SHA), without history or unneeded diff --git a/scripts/generate_python_proto.py b/scripts/generate_python_proto.py index ead6c58..f23e19d 100644 --- a/scripts/generate_python_proto.py +++ b/scripts/generate_python_proto.py @@ -9,14 +9,9 @@ import sys from pathlib import Path -PROTO_FILES = [ - "proto/openshell.proto", - "proto/datamodel.proto", - "proto/options.proto", - "proto/sandbox.proto", - "proto/extension.proto", - "proto/credential_driver.proto", -] +# `mise run proto:fetch` exports exactly the SDK's protos (two roots and their +# imports) into proto/, so every file there is compiled. +PROTO_DIR = Path("proto") def main() -> None: @@ -31,6 +26,9 @@ def main() -> None: ) args = parser.parse_args() output_dir = Path("src/openshell/_proto") + proto_files = sorted(str(path) for path in PROTO_DIR.glob("*.proto")) + if not proto_files: + sys.exit(f"no .proto files in {PROTO_DIR}/; run `mise run proto:fetch`") subprocess.run( [ @@ -48,19 +46,19 @@ def main() -> None: ] ), "--grpc_python_out=src/openshell/_proto", - *PROTO_FILES, + *proto_files, ], check=True, ) # Rewrite only imports of our generated modules, leaving google.protobuf # imports intact. The same rule covers runtime modules and type stubs. - modules = "|".join(re.escape(f"{Path(path).stem}_pb2") for path in PROTO_FILES) + modules = "|".join(re.escape(f"{Path(path).stem}_pb2") for path in proto_files) pattern = rf"^import ({modules})( as \w+)?$" suffixes = ["_pb2.py", "_pb2_grpc.py"] if not args.no_pyi: suffixes.extend(["_pb2.pyi", "_pb2_grpc.pyi"]) - for proto in PROTO_FILES: + for proto in proto_files: for suffix in suffixes: file_path = output_dir / f"{Path(proto).stem}{suffix}" text = file_path.read_text() From 31a0a14f3a86d86fac2ae69ebfdeb69ef593b560 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Wed, 4 Nov 2026 16:40:37 -0800 Subject: [PATCH 08/12] build: pin Python in .python-version for both uv and mise mise reads .python-version once idiomatic_version_file_enable_tools includes python, so the version lives in one file instead of mise.toml plus whatever uv picks. mise still pins uv and buf exactly. [tool.uv] required-version rejects uv older than 0.10 when uv is installed without mise. Signed-off-by: Piotr Mlocek --- .python-version | 1 + README.md | 3 ++- mise.toml | 5 ++++- pyproject.toml | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .python-version diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..a6d9ada --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14.5 diff --git a/README.md b/README.md index a6475ab..f70c706 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ NVIDIA/OpenShell stay on PyPI. ## Development Tools are managed by [mise](https://mise.jdx.dev/) and dependencies by -[uv](https://docs.astral.sh/uv/). +[uv](https://docs.astral.sh/uv/). The Python version is pinned in +`.python-version`, which both read. ```shell mise run ci # checks, tests, build, and install smoke test diff --git a/mise.toml b/mise.toml index ff5d3d2..2597641 100644 --- a/mise.toml +++ b/mise.toml @@ -8,8 +8,11 @@ min_version = { soft = "2026.9.9" } +# Python is pinned once, in .python-version, which both uv and mise read. +[settings] +idiomatic_version_file_enable_tools = ["python"] + [tools] -python = "3.14.5" buf = "1.72.0" uv = "0.10.12" diff --git a/pyproject.toml b/pyproject.toml index b445434..73ad3a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,11 @@ dev = [ "types-protobuf>=6.32,<7", ] +# mise pins uv exactly (mise.toml); this rejects older versions when uv is +# installed some other way. +[tool.uv] +required-version = ">=0.10" + [tool.setuptools] package-dir = { "" = "src" } include-package-data = false From 1960370795d7845ec92a943b8e03888f1293c38f Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Sun, 8 Nov 2026 15:40:45 -0800 Subject: [PATCH 09/12] chore: add the repository basics from sdk-go AGENTS.md, CONTRIBUTING.md and SECURITY.md describe this repository's tasks, conventions and reporting path. CODEOWNERS gives the SDK to the sdk team, with maintainers as fallback and infra for CI. Dependabot updates the uv lockfile weekly and actions daily, and CodeQL scans the Python sources, without the generated bindings. Signed-off-by: Piotr Mlocek --- .github/CODEOWNERS | 7 +++++ .github/dependabot.yml | 20 ++++++++++++ .github/workflows/codeql.yml | 46 ++++++++++++++++++++++++++++ AGENTS.md | 34 +++++++++++++++++++++ CONTRIBUTING.md | 59 ++++++++++++++++++++++++++++++++++++ README.md | 4 ++- SECURITY.md | 15 +++++++++ 7 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 AGENTS.md create mode 100644 CONTRIBUTING.md create mode 100644 SECURITY.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..e5ae30b --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: Apache-2.0 + +# The sdk team owns the SDK; OpenShell maintainers review as a fallback. +* @ai-openshell/sdk @ai-openshell/maintainers + +# CI needs an infra review. +/.github/ @ai-openshell/infra diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..72ac067 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: Apache-2.0 + +version: 2 +updates: + - package-ecosystem: "uv" + directory: "/" + schedule: + interval: "weekly" + cooldown: + default-days: 7 + groups: + python-minor-and-patch: + update-types: ["minor", "patch"] + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + cooldown: + default-days: 7 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..f50ecb5 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: Apache-2.0 + +name: CodeQL + +on: + pull_request: + push: + branches: [main] + schedule: + - cron: "29 5 * * 1" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: codeql-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + analyze: + name: CodeQL (python) + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + security-events: write + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + # Python needs no build. The generated bindings are left out. + - name: Initialize CodeQL + uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3 + with: + languages: python + build-mode: none + config: | + paths-ignore: + - src/openshell/_proto + + - name: Analyze + uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3 + with: + category: /language:python diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..88eb465 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,34 @@ +# Agent Instructions + +The OpenShell Python SDK: package `openshell` on PyPI, a client for the +OpenShell gateway. See [CONTRIBUTING.md](CONTRIBUTING.md) for tasks and the +release model. + +## Commands + +- `mise run ci` runs the full pipeline (format check, lint, type check, proto + check, conformance check, unit tests, build). +- `mise run proto:gen` regenerates `src/openshell/_proto` from core at the ref + pinned in `OPENSHELL_CORE_REF` (`mise.toml`). Never edit generated files by + hand. +- Use `uv` for Python commands (`uv run`, `uv sync`), never `pip` directly. + +## Code conventions + +- The SDK supports Python 3.11 and newer. Don't use syntax or standard library + features from later versions. +- The public API is what `openshell/__init__.py` exports in `__all__`. Users + also import `openshell._proto` directly, so keep its module paths stable. +- Unit tests live in `tests/` and are named `*_test.py`; fixtures go in + `tests/fixtures/`. +- Files copied from core must stay identical to core at the pin; + `mise run conformance:check` compares them. +- New files need only the license line `SPDX-License-Identifier: Apache-2.0` + in a comment. Keep the existing headers as they are. + +## Commits + +- Use Conventional Commits and sign off every commit (`--signoff`). +- Never mention Claude or any AI agent in commits, pull request descriptions, or + issues (no author attribution, no Co-Authored-By, no "Generated with" + footers). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..be20d04 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,59 @@ +# Contributing to the OpenShell Python SDK + +## Setup + +Install [mise](https://mise.jdx.dev/), then install the pinned tools and the +development dependencies: + +```shell +mise install +mise run sync +``` + +mise reads the Python version from `.python-version`, and uv manages the +virtual environment. `mise tasks` lists every task. The ones you need most: + +| Task | What it does | +|------|--------------| +| `mise run ci` | Everything CI runs: checks, unit tests, build | +| `mise run check` | Format check, lint, type check, proto check, conformance check | +| `mise run format` | Format the code | +| `mise run test` | Unit tests; `UV_PYTHON=3.11` picks the interpreter | +| `mise run build` | Build the wheel and sdist, verify them, and install them on Python 3.11 | +| `mise run proto:gen` | Regenerate the bindings from core at the pinned ref | +| `mise run core:version` | Print the pinned core version | + +CI runs the unit tests on every Python version the package supports (3.11 to +3.14). + +## Commits and pull requests + +- Use [Conventional Commits](https://www.conventionalcommits.org/): + `(): `. +- Sign off every commit (`git commit --signoff`) for the [Developer Certificate + of Origin](https://developercertificate.org/). +- Every change goes through a pull request with an approval from a code owner + who did not push last. +- New files need only the license line `SPDX-License-Identifier: Apache-2.0` + in a comment. Keep the existing headers as they are. + +## Bindings and core versions + +The bindings in `src/openshell/_proto` are generated from core's `proto/` at one +core ref, `OPENSHELL_CORE_REF` in `mise.toml`, and committed. Don't edit +generated files; change the pin and run `mise run proto:gen`. +`mise run proto:check` fails when the committed bindings don't match the pin. + +Shared test fixtures come from core's `sdk/conformance/` and are copied into +`tests/fixtures/`. `mise run conformance:check` compares them with core at the +pinned ref. + +## Releases + +SDK releases follow core releases: SDK `X.Y.Z` is built from core `vX.Y.Z`, and +there are no SDK-only releases. To try unreleased changes, install from the +repository: + +```shell +pip install "openshell @ git+https://github.com/ai-openshell/sdk-python@main" +``` diff --git a/README.md b/README.md index f70c706..3920b91 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,9 @@ NVIDIA/OpenShell stay on PyPI. Tools are managed by [mise](https://mise.jdx.dev/) and dependencies by [uv](https://docs.astral.sh/uv/). The Python version is pinned in -`.python-version`, which both read. +`.python-version`, which both read. See [CONTRIBUTING.md](CONTRIBUTING.md) for +setup, commit rules and the release model, and [SECURITY.md](SECURITY.md) to +report a vulnerability. ```shell mise run ci # checks, tests, build, and install smoke test diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..fb73b4a --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +## Reporting a vulnerability + +Report vulnerabilities in the OpenShell Python SDK privately through +[NVIDIA/OpenShell's private reporting +form](https://github.com/NVIDIA/OpenShell/security/advisories/new) and name +`ai-openshell/sdk-python` as the affected component. Do not disclose +vulnerabilities in public issues, discussions, or pull requests. + +The OpenShell security policy applies to this repository: the [report template, +review process, and coordinated +disclosure](https://github.com/NVIDIA/OpenShell/blob/main/SECURITY.md) are the +same. Private reporting directly on this repository will be enabled once its +process is set up; until then, use the form above. From aacbb5e7d526a974b6934ba4a39722cff28acec3 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Sun, 8 Nov 2026 16:03:37 -0800 Subject: [PATCH 10/12] chore: let the sdk team and maintainers review CI for now The infra rule comes back after the move (#15), so CI changes needed for 0.1.8 don't wait on one time zone. Signed-off-by: Piotr Mlocek --- .github/CODEOWNERS | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e5ae30b..b2d2be5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,5 @@ # SPDX-License-Identifier: Apache-2.0 # The sdk team owns the SDK; OpenShell maintainers review as a fallback. +# An infra review for CI and the release scripts comes back with #15. * @ai-openshell/sdk @ai-openshell/maintainers - -# CI needs an infra review. -/.github/ @ai-openshell/infra From 4b62d29e02d497a38b873a102e791bb89ae7b863 Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Sun, 8 Nov 2026 16:17:55 -0800 Subject: [PATCH 11/12] chore: add PR and issue templates based on core's The PR template asks for the summary, issue, changes, testing with mise run ci, and the DCO and Conventional Commits checklist. The bug and feature forms follow core's design-first forms, asking for SDK, Python and gateway versions and Python examples. Gateway, CLI and sandbox problems go to NVIDIA/OpenShell, and vulnerabilities to SECURITY.md. Signed-off-by: Piotr Mlocek --- .github/ISSUE_TEMPLATE/bug_report.yml | 97 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 14 ++++ .github/ISSUE_TEMPLATE/feature_request.yml | 86 +++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 20 +++++ 4 files changed, 217 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..a1176a5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,97 @@ +# SPDX-License-Identifier: Apache-2.0 + +name: Bug Report +description: Report unexpected behavior of the Python SDK with a clear user story and expected outcome. +type: Bug +body: + - type: markdown + attributes: + value: | + ## Bug Reports + + Describe who encountered the bug, the problem it creates, why it matters, and the observable criteria for a fix. Please check the latest `openshell` release on PyPI and search existing issues for possible duplicates before filing. + + Problems with the gateway, CLI, or sandboxes belong in [NVIDIA/OpenShell](https://github.com/NVIDIA/OpenShell/issues). Do not report security vulnerabilities here; follow [SECURITY.md](https://github.com/ai-openshell/sdk-python/blob/main/SECURITY.md) instead. + + - type: textarea + id: user-story + attributes: + label: User Story + description: Describe the specific use case and behavior you directly encountered or need. + placeholder: | + I use the OpenShell Python SDK for . + I directly encountered or need . + This affects . + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem Statement + description: Summarize what is broken in the SDK's current behavior. Describe its consequences and current workarounds in Impact / Why This Matters. + placeholder: Describe the gap or failure in the SDK's current behavior and when it occurs. + validations: + required: true + + - type: textarea + id: impact + attributes: + label: Impact / Why This Matters + description: | + Explain how the bug affects users and what they must do to work around it today. Include evidence where available, but do not diagnose the cause or prescribe the fix. + placeholder: | + When this happens, users must... + This results in... + This matters because... + validations: + required: true + + - type: textarea + id: acceptance-criteria + attributes: + label: Acceptance Criteria + description: List the specific, observable outcomes that would demonstrate the bug is fixed. + placeholder: | + - [ ] + - [ ] + validations: + required: true + + - type: textarea + id: reproduction + attributes: + label: Reproduction Steps + description: Provide a minimal Python snippet against an OpenShell gateway, and what you expected instead. + placeholder: | + from openshell import Sandbox + + with Sandbox(...) as sb: + ... + render: python + validations: + required: true + + - type: textarea + id: environment + attributes: + label: Environment + description: Include the SDK, Python, and gateway versions. + placeholder: | + - openshell (SDK): 0.x.x (output of `python -c "import openshell; print(openshell.__version__)"`) + - Python: 3.x.x + - OpenShell gateway: v0.x.x, deployment mode and compute driver + - OS: macOS 15.2 / Ubuntu 24.04 / Windows 11 + WSL2 + validations: + required: true + + - type: textarea + id: logs + attributes: + label: Logs + description: | + Include the smallest relevant traceback, error message, or log excerpt. + Redact credentials, API keys, tokens, and query parameters before pasting. + render: shell + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..bf5387b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: Apache-2.0 + +blank_issues_enabled: false +contact_links: + - name: Gateway, CLI, or sandbox problem? + url: https://github.com/NVIDIA/OpenShell/issues/new/choose + about: > + This repository is the Python SDK only. Report problems with the + OpenShell gateway, CLI, sandboxes, or the gRPC API in NVIDIA/OpenShell. + - name: Security vulnerability? + url: https://github.com/ai-openshell/sdk-python/blob/main/SECURITY.md + about: > + Do not report security vulnerabilities through GitHub issues. Follow + SECURITY.md and use the private reporting form. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..a070603 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,86 @@ +# SPDX-License-Identifier: Apache-2.0 + +name: Feature Request +description: Propose an SDK feature with a user story and API design. Not a "please build this" request. +type: Feature +body: + - type: markdown + attributes: + value: | + ## Design-First Feature Proposals + + Describe who needs the feature, the problem it solves, why the current gap matters, the API you would like to use, and the observable criteria for success. Leave implementation choices to the people building the feature. + + The SDK wraps the OpenShell gateway's API. A feature that needs a new gateway capability starts in [NVIDIA/OpenShell](https://github.com/NVIDIA/OpenShell/issues); link that issue here. + + - type: textarea + id: user-story + attributes: + label: User Story + description: Describe the specific use case and behavior you directly encountered or need. + placeholder: | + I use the OpenShell Python SDK for . + I directly encountered or need . + This affects . + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem Statement + description: Summarize the capability missing from the SDK today. Describe its consequences and current workarounds in Impact / Why This Matters. + validations: + required: true + + - type: textarea + id: impact + attributes: + label: Impact / Why This Matters + description: | + Explain what users must do today and why that is insufficient, for example calling `openshell._proto` stubs directly. Include concrete evidence where available, but do not prescribe the implementation. + placeholder: | + Without this feature, users must... + This results in... + This matters because... + validations: + required: true + + - type: textarea + id: design + attributes: + label: Proposed API + description: | + How should this look to an SDK user? Show a notional Python example and describe the externally observable behavior. + render: python + validations: + required: true + + - type: textarea + id: acceptance-criteria + attributes: + label: Acceptance Criteria + description: List specific, observable outcomes that would make this feature complete without prescribing how implementers achieve them. + placeholder: | + - [ ] + - [ ] + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives Considered + description: Explain what you tried with the current SDK, including the generated `openshell._proto` stubs, and why the proposal serves your use case better. + validations: + required: true + + - type: checkboxes + id: checklist + attributes: + label: Checklist + options: + - label: I've reviewed existing issues and the README + required: true + - label: This is a design proposal, not a "please build this" request + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..b11ea56 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,20 @@ +## Summary + + +## Related Issue + + +## Changes + + +## Testing + +- [ ] `mise run ci` passes +- [ ] Unit tests added/updated (if applicable) +- [ ] E2E tests added/updated (if applicable) + +## Checklist + +- [ ] Follows [Conventional Commits](https://www.conventionalcommits.org/) +- [ ] Commits are signed off (DCO) +- [ ] README or CONTRIBUTING.md updated (if applicable) From 79eed089a407d07b4d7087fd0d0dc206593dd6cd Mon Sep 17 00:00:00 2001 From: Piotr Mlocek Date: Sun, 8 Nov 2026 16:06:23 -0800 Subject: [PATCH 12/12] ci(release): tag, publish to PyPI and release when a stable pin lands release.yml runs on pushes to main and stops unless the pin moved to a stable core tag. Then: - tag: scripts/release/tag-release.sh (from sdk-go's) tags vX.Y.Z at the merged commit and creates a draft GitHub release with the PR's description as notes. It skips what exists, a published release ends the run, and a push that adds the pin (the import) releases nothing. - build: mise run build at the tag's version, plus checksums, uploaded as an artifact. No tokens, no tool cache. - publish-pypi: trusted publishing from the pypi environment, the only job with id-token: write. - github-release: attach the files and checksums, then publish the draft. The tag job uses GITHUB_TOKEN instead of the bot App, so the release doesn't wait for #7; nothing triggers on tags. The build version now comes from OPENSHELL_SDK_VERSION when it is set, because the pretend version in mise.toml couldn't be overridden from the shell. CONTRIBUTING.md describes the release flow. Signed-off-by: Piotr Mlocek --- .github/workflows/release.yml | 144 +++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 21 ++++- mise.toml | 4 +- scripts/release/tag-release.sh | 127 +++++++++++++++++++++++++++++ 4 files changed, 293 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100755 scripts/release/tag-release.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..646863c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,144 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Releases the SDK when a stable core pin lands on main: tag and draft release, +# build, publish to PyPI, then attach the files and publish the GitHub release. +# PyPI trusts this file, release.yml, in the pypi environment (trusted +# publishing), so the publish job needs no token. Pushed tags never trigger it. +name: release + +on: + push: + branches: [main] + workflow_dispatch: + inputs: + sha: + description: Commit on main to release (default the tip); the pin there must be stable + required: false + default: "" + +permissions: + contents: read + +concurrency: + group: release + cancel-in-progress: false + +jobs: + tag: + name: tag + # Only main releases, also when the workflow is started by hand. + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write # create the tag and the draft release + pull-requests: read # read the merged PR's body for the release notes + outputs: + tag: ${{ steps.tag.outputs.tag }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + + - id: tag + name: Tag the release and create a draft + env: + GH_TOKEN: ${{ github.token }} + EVENT: ${{ github.event_name }} + INPUT_SHA: ${{ inputs.sha }} + BEFORE: ${{ github.event.before }} + run: | + set -euo pipefail + if [ "$EVENT" = workflow_dispatch ]; then + sha=${INPUT_SHA:-$GITHUB_SHA} + git merge-base --is-ancestor "$sha" "$GITHUB_SHA" || { + echo "::error::$sha is not on main" + exit 1 + } + scripts/release/tag-release.sh --force --sha "$sha" >>"$GITHUB_OUTPUT" + else + # Compare against the commit before the push, so a pin change + # that isn't the pushed tip still counts. + scripts/release/tag-release.sh --since "$BEFORE" >>"$GITHUB_OUTPUT" + fi + + build: + name: build + needs: tag + if: needs.tag.outputs.tag != '' + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + ref: ${{ needs.tag.outputs.tag }} + persist-credentials: false + + # No tool cache: what gets published is built from fresh downloads. + - uses: jdx/mise-action@e6a8b3978addb5a52f2b4cd9d91eafa7f0ab959d # v4.2.0 + with: + cache: false + + # Builds the wheel and sdist at the tag's version, verifies the wheel, + # and installs both on the oldest supported Python. + - name: Build + env: + TAG: ${{ needs.tag.outputs.tag }} + run: OPENSHELL_SDK_VERSION="${TAG#v}" mise run build + + - name: Write checksums + run: (cd dist && sha256sum -- *) >openshell-checksums-sha256.txt + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: release + path: | + dist/ + openshell-checksums-sha256.txt + if-no-files-found: error + + publish-pypi: + name: publish-pypi + needs: [tag, build] + runs-on: ubuntu-latest + timeout-minutes: 10 + environment: + name: pypi + url: https://pypi.org/project/openshell/ + permissions: + id-token: write # trusted publishing to PyPI + steps: + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + name: release + path: release + + - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3 + with: + packages-dir: release/dist/ + + # Publishing comes last, so the release never shows without its files. If + # this job fails after PyPI accepted the upload, re-run only the failed jobs. + github-release: + name: github-release + needs: [tag, publish-pypi] + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write # attach the files and publish the release + steps: + - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + name: release + path: release + + - name: Attach the files and publish the release + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ needs.tag.outputs.tag }} + run: | + set -euo pipefail + gh release upload "$TAG" -R "$GITHUB_REPOSITORY" --clobber \ + release/dist/* release/openshell-checksums-sha256.txt + gh release edit "$TAG" -R "$GITHUB_REPOSITORY" --draft=false --latest diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index be20d04..cc4bfd6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,8 +51,25 @@ pinned ref. ## Releases SDK releases follow core releases: SDK `X.Y.Z` is built from core `vX.Y.Z`, and -there are no SDK-only releases. To try unreleased changes, install from the -repository: +there are no SDK-only releases. Pre-release pins are never released. + +Merging a pull request that moves the pin to a stable core tag releases the SDK. +`release.yml` runs on every push to `main` and does nothing unless the pin +changed to a stable tag. Then it: + +1. tags `vX.Y.Z` at the merged commit and creates a draft GitHub release, with + the pull request's description as notes (`scripts/release/tag-release.sh`); +2. builds the wheel and sdist at version `X.Y.Z`, verifies them, and writes + their checksums; +3. publishes to PyPI from the `pypi` environment with trusted publishing; +4. attaches the files and the checksums to the draft and publishes it. + +If a run fails, re-run only its failed jobs. The tag step skips a tag or draft +that exists already, and a published release is never released again. +To release a commit by hand, start the workflow on `main` with the commit's SHA +(`gh workflow run release.yml -f sha=`). + +To try unreleased changes, install from the repository: ```shell pip install "openshell @ git+https://github.com/ai-openshell/sdk-python@main" diff --git a/mise.toml b/mise.toml index 2597641..67d5a2e 100644 --- a/mise.toml +++ b/mise.toml @@ -19,7 +19,9 @@ uv = "0.10.12" [env] # The single core pin: a release tag (or a full commit SHA). OPENSHELL_CORE_REF = "v0.1.7" -SETUPTOOLS_SCM_PRETEND_VERSION_FOR_OPENSHELL = "0.0.0" +# The package version for builds. CI and local builds use 0.0.0; the release +# workflow sets OPENSHELL_SDK_VERSION to the release's version. +SETUPTOOLS_SCM_PRETEND_VERSION_FOR_OPENSHELL = "{{ get_env(name='OPENSHELL_SDK_VERSION', default='0.0.0') }}" [vars] python_paths = "src/ tests/ scripts/" diff --git a/scripts/release/tag-release.sh b/scripts/release/tag-release.sh new file mode 100755 index 0000000..2cf45f3 --- /dev/null +++ b/scripts/release/tag-release.sh @@ -0,0 +1,127 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: Apache-2.0 + +# tag-release.sh: start the lockstep SDK release for a stable core pin. +# +# Usage: tag-release.sh [--dry-run] [--force] [--sha ] [--since ] +# +# Reads the pin, OPENSHELL_CORE_REF in mise.toml, at (default: +# $GITHUB_SHA, else HEAD). A pre-release pin creates nothing. Without --force, +# nothing is created either when the pin at equals the pin at --since +# (default: the parent of ) or there is no pin there, so ordinary +# pushes to main and the push that adds mise.toml are no-ops. +# The release workflow passes the commit before the push as --since, which +# covers pushes of several commits. Then, each step only when missing: +# - tag vX.Y.Z (lightweight) at ; a tag at another commit fails +# - a draft GitHub release with the merged PR's body plus +# "Matches OpenShell core vX.Y.Z" +# Prints "tag=vX.Y.Z" when the release still has to be built and published, +# and nothing when there is nothing to release or the release is published +# already. The workflow appends the output to $GITHUB_OUTPUT. +set -euo pipefail + +sdk_repo=${SDK_REPO:-ai-openshell/sdk-python} +dry=0 +force=0 +sha=${GITHUB_SHA:-} +since= + +usage() { echo "usage: $0 [--dry-run] [--force] [--sha ] [--since ]" >&2; exit 2; } +while [ $# -gt 0 ]; do + case $1 in + --dry-run) dry=1; shift ;; + --force) force=1; shift ;; + --sha) sha=${2:?--sha needs a commit}; shift 2 ;; + --since) since=${2:?--since needs a commit}; shift 2 ;; + *) usage ;; + esac +done +[ -n "$sha" ] || sha=$(git rev-parse HEAD) +sha=$(git rev-parse "$sha^{commit}") +short=$(git rev-parse --short "$sha") + +pin_at() { git show "$1:mise.toml" 2>/dev/null | sed -n 's/^OPENSHELL_CORE_REF = "\(.*\)"$/\1/p'; } + +pin=$(pin_at "$sha") +if ! [[ "$pin" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Pin $pin is not a stable release; no SDK release." >&2 + exit 0 +fi + +if [ "$force" -eq 0 ]; then + # A new branch push reports an all-zero "before"; fall back to the parent. + if [ -z "$since" ] || ! git rev-parse --verify --quiet "$since^{commit}" >/dev/null; then + since="$sha^" + fi + old=$(pin_at "$since" || true) + if [ "$old" = "$pin" ]; then + echo "The pin is $pin both at $short and at $(git rev-parse --short "$since"); no SDK release." >&2 + exit 0 + fi + # No pin before means the push added mise.toml (the import), not a bump. + if [ -z "$old" ]; then + echo "No pin at $(git rev-parse --short "$since"); no SDK release." >&2 + exit 0 + fi +fi + +# get_or_empty : the value, empty on 404, and fail on any other +# error. gh prints the error body on stdout for a 404, so stdout is only used +# after a successful call. +get_or_empty() { + local out err + if out=$(gh api "$1" --jq "$2" 2>"${tmp}/err"); then + printf '%s' "$out" + else + err=$(cat "${tmp}/err") + grep -q 'HTTP 404' <<<"$err" || { echo "ERROR: gh api $1 failed: $err" >&2; return 1; } + fi +} +tmp=$(mktemp -d) +trap 'rm -rf "$tmp"' EXIT + +existing=$(get_or_empty "repos/$sdk_repo/git/ref/tags/$pin" '.object.sha') +if [ -n "$existing" ] && [ "$existing" != "$sha" ]; then + echo "ERROR: tag $pin exists at $existing, not at $sha. SDK tags never move; fix this by hand." >&2 + exit 1 +fi +# The tag lookup doesn't return drafts, so search the release list. +release=$(gh api --paginate "repos/$sdk_repo/releases" \ + --jq ".[] | select(.tag_name == \"$pin\") | if .draft then \"draft\" else \"published\" end" | head -1) +if [ "$release" = published ]; then + echo "Release $pin is published already; nothing to do." >&2 + exit 0 +fi + +# Release notes: the body of the PR that merged this commit, then the match line. +notes="$tmp/notes.md" +pr_body=$(get_or_empty "repos/$sdk_repo/commits/$sha/pulls" '.[0].body // empty') +{ + [ -z "$pr_body" ] || printf '%s\n\n' "$pr_body" + echo "Matches OpenShell core $pin." +} >"$notes" + +if [ "$dry" -eq 1 ]; then + if [ -n "$existing" ]; then + echo "dry-run: tag $pin exists at $sha" >&2 + else + echo "dry-run: would create tag $pin at $sha" >&2 + fi + if [ "$release" = draft ]; then + echo "dry-run: draft release $pin exists" >&2 + else + echo "dry-run: would create draft release $pin with notes:" >&2 + sed 's/^/ | /' "$notes" >&2 + fi + echo "tag=$pin" + exit 0 +fi + +if [ -z "$existing" ]; then + gh api -X POST "repos/$sdk_repo/git/refs" -f ref="refs/tags/$pin" -f sha="$sha" --silent + echo "Created tag $pin at $sha." >&2 +fi +if [ -z "$release" ]; then + gh release create "$pin" -R "$sdk_repo" --draft --verify-tag --title "$pin" --notes-file "$notes" >&2 +fi +echo "tag=$pin"