modal 1.4.2.dev12__tar.gz → 1.4.2.dev14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/PKG-INFO +1 -1
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/task_command_router_client.py +3 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/client.pyi +2 -2
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/sandbox.py +41 -9
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/sandbox.pyi +3 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/api_grpc.py +80 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/api_pb2.py +863 -749
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/api_pb2.pyi +273 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/api_pb2_grpc.py +166 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/api_pb2_grpc.pyi +52 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/modal_api_grpc.py +5 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_version/__init__.py +1 -1
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/LICENSE +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/README.md +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/__main__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_billing.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_clustered_functions.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_clustered_functions.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_container_entrypoint.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_functions.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_grpc_client.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_ipython.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_load_context.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_location.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_logs.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_object.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_output/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_output/manager.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_output/pty.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_output/rich.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_output/status.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_partial_function.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_resolver.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_resources.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/asgi.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/execution_context.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/telemetry.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_serialization.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_server.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_traceback.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_tunnel.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_tunnel.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_type_manager.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/app_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/async_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/blob_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/browser_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/deprecation.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/docker_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/function_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/git_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/hash_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/http_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/logger.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/mount_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/name_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/package_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/shell_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_utils/time_utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_vendor/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_vendor/tblib.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_vendor/version.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/_watcher.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/app.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/app.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/billing.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/2023.12.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/2024.04.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/2024.10.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/2025.06.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/README.md +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/builder/base-images.json +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/call_graph.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/_download.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/_traceback.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/app.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/billing.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/changelog.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/cluster.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/config.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/container.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/dashboard.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/dict.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/entry_point.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/environment.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/import_refs.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/launch.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/network_file_system.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/profile.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/programs/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/programs/vscode.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/queues.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/run.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/secret.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/selector.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/shell.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/token.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/utils.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cli/volume.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/client.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cls.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/cls.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/config.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/container_process.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/container_process.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/dict.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/dict.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/environments.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/environments.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/exception.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/experimental/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/experimental/flash.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/experimental/flash.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/experimental/ipython.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/file_io.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/file_io.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/file_pattern_matcher.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/functions.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/functions.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/image.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/image.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/io_streams.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/io_streams.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/mount.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/mount.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/network_file_system.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/network_file_system.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/object.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/object.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/output.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/parallel_map.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/parallel_map.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/partial_function.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/partial_function.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/proxy.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/proxy.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/py.typed +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/queue.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/queue.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/retries.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/runner.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/runner.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/running_app.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/sandbox_fs.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/sandbox_fs.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/schedule.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/scheduler_placement.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/secret.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/secret.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/server.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/server.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/serving.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/serving.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/snapshot.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/snapshot.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/stream_type.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/token_flow.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/token_flow.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/volume.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal/volume.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal.egg-info/requires.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal.egg-info/top_level.txt +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/__init__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/py.typed +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/modal_version/__main__.py +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/pyproject.toml +0 -0
- {modal-1.4.2.dev12 → modal-1.4.2.dev14}/setup.cfg +0 -0
|
@@ -126,8 +126,11 @@ async def fetch_command_router_access_v2(
|
|
|
126
126
|
server_client, sandbox_id: str
|
|
127
127
|
) -> api_pb2.SandboxGetCommandRouterAccessResponse:
|
|
128
128
|
"""Fetch direct command router access info from Modal server for a V2 sandbox."""
|
|
129
|
+
assert server_client._auth_token_manager
|
|
130
|
+
auth_token = await server_client._auth_token_manager.get_token()
|
|
129
131
|
return await server_client.stub.SandboxGetCommandRouterAccess(
|
|
130
132
|
api_pb2.SandboxGetCommandRouterAccessRequest(sandbox_id=sandbox_id),
|
|
133
|
+
metadata=[("x-modal-auth-token", auth_token)],
|
|
131
134
|
)
|
|
132
135
|
|
|
133
136
|
|
|
@@ -35,7 +35,7 @@ class _Client:
|
|
|
35
35
|
server_url: str,
|
|
36
36
|
client_type: int,
|
|
37
37
|
credentials: typing.Optional[tuple[str, str]],
|
|
38
|
-
version: str = "1.4.2.
|
|
38
|
+
version: str = "1.4.2.dev14",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -175,7 +175,7 @@ class Client:
|
|
|
175
175
|
server_url: str,
|
|
176
176
|
client_type: int,
|
|
177
177
|
credentials: typing.Optional[tuple[str, str]],
|
|
178
|
-
version: str = "1.4.2.
|
|
178
|
+
version: str = "1.4.2.dev14",
|
|
179
179
|
):
|
|
180
180
|
"""mdmd:hidden
|
|
181
181
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -1045,7 +1045,12 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1045
1045
|
req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=10)
|
|
1046
1046
|
# Use the private __client to allow `wait` to work with a detached sandbox
|
|
1047
1047
|
stub = self.__client.stub
|
|
1048
|
-
|
|
1048
|
+
if self._is_v2:
|
|
1049
|
+
assert self.__client._auth_token_manager
|
|
1050
|
+
auth_token = await self.__client._auth_token_manager.get_token()
|
|
1051
|
+
resp = await stub.SandboxWaitV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1052
|
+
else:
|
|
1053
|
+
resp = await stub.SandboxWait(req)
|
|
1049
1054
|
if resp.result.status:
|
|
1050
1055
|
logger.debug(f"Sandbox {self.object_id} wait completed with status {resp.result.status}")
|
|
1051
1056
|
self._result = resp.result
|
|
@@ -1105,7 +1110,12 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1105
1110
|
|
|
1106
1111
|
req = api_pb2.SandboxGetTunnelsRequest(sandbox_id=self.object_id, timeout=timeout)
|
|
1107
1112
|
stub = self._client.stub
|
|
1108
|
-
|
|
1113
|
+
if self._is_v2:
|
|
1114
|
+
assert self._client._auth_token_manager
|
|
1115
|
+
auth_token = await self._client._auth_token_manager.get_token()
|
|
1116
|
+
resp = await stub.SandboxGetTunnelsV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1117
|
+
else:
|
|
1118
|
+
resp = await stub.SandboxGetTunnels(req)
|
|
1109
1119
|
|
|
1110
1120
|
# If we couldn't get the tunnels in time, report the timeout.
|
|
1111
1121
|
if resp.result.status == api_pb2.GenericResult.GENERIC_STATUS_TIMEOUT:
|
|
@@ -1174,7 +1184,12 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1174
1184
|
This is a no-op if the Sandbox has already finished running."""
|
|
1175
1185
|
req = api_pb2.SandboxTerminateRequest(sandbox_id=self.object_id)
|
|
1176
1186
|
stub = self._client.stub
|
|
1177
|
-
|
|
1187
|
+
if self._is_v2:
|
|
1188
|
+
assert self._client._auth_token_manager
|
|
1189
|
+
auth_token = await self._client._auth_token_manager.get_token()
|
|
1190
|
+
await stub.SandboxTerminateV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1191
|
+
else:
|
|
1192
|
+
await stub.SandboxTerminate(req)
|
|
1178
1193
|
if wait:
|
|
1179
1194
|
await self.wait(raise_on_termination=False)
|
|
1180
1195
|
return self.returncode
|
|
@@ -1187,7 +1202,12 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1187
1202
|
|
|
1188
1203
|
req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=0)
|
|
1189
1204
|
stub = self._client.stub
|
|
1190
|
-
|
|
1205
|
+
if self._is_v2:
|
|
1206
|
+
assert self._client._auth_token_manager
|
|
1207
|
+
auth_token = await self._client._auth_token_manager.get_token()
|
|
1208
|
+
resp = await stub.SandboxWaitV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1209
|
+
else:
|
|
1210
|
+
resp = await stub.SandboxWait(req)
|
|
1191
1211
|
|
|
1192
1212
|
if resp.result.status:
|
|
1193
1213
|
self._result = resp.result
|
|
@@ -1198,7 +1218,12 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1198
1218
|
while not self._task_id:
|
|
1199
1219
|
req = api_pb2.SandboxGetTaskIdRequest(sandbox_id=self.object_id)
|
|
1200
1220
|
stub = self._client.stub
|
|
1201
|
-
|
|
1221
|
+
if self._is_v2:
|
|
1222
|
+
assert self._client._auth_token_manager
|
|
1223
|
+
auth_token = await self._client._auth_token_manager.get_token()
|
|
1224
|
+
resp = await stub.SandboxGetTaskIdV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1225
|
+
else:
|
|
1226
|
+
resp = await stub.SandboxGetTaskId(req)
|
|
1202
1227
|
if not resp.task_id and raise_if_task_complete and resp.HasField("task_result"):
|
|
1203
1228
|
msg = resp.task_result.exception or "Sandbox already finished"
|
|
1204
1229
|
raise Error(msg)
|
|
@@ -1338,11 +1363,10 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1338
1363
|
raise InvalidError(f"workdir must be an absolute path, got: {workdir}")
|
|
1339
1364
|
_validate_exec_args(args)
|
|
1340
1365
|
|
|
1341
|
-
secrets = secrets or []
|
|
1342
|
-
if
|
|
1343
|
-
secrets = [*secrets, _Secret.from_dict(env)]
|
|
1366
|
+
secrets = list(secrets or [])
|
|
1367
|
+
env_dict = {k: v for k, v in (env or {}).items() if v is not None}
|
|
1344
1368
|
|
|
1345
|
-
# Force secret resolution so we can pass the secret IDs to the backend.
|
|
1369
|
+
# Force explicit secret resolution so we can pass the secret IDs to the backend.
|
|
1346
1370
|
secret_coros = [secret.hydrate(client=self._client) for secret in secrets]
|
|
1347
1371
|
await TaskContext.gather(*secret_coros)
|
|
1348
1372
|
|
|
@@ -1355,6 +1379,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1355
1379
|
"timeout": timeout,
|
|
1356
1380
|
"workdir": workdir,
|
|
1357
1381
|
"secret_ids": [secret.object_id for secret in secrets],
|
|
1382
|
+
"env": env_dict,
|
|
1358
1383
|
"text": text,
|
|
1359
1384
|
"bufsize": bufsize,
|
|
1360
1385
|
"runtime_debug": config.get("function_runtime_debug"),
|
|
@@ -1366,6 +1391,11 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1366
1391
|
kwargs["command_router_client"] = command_router_client
|
|
1367
1392
|
return await self._exec_through_command_router(*args, **kwargs)
|
|
1368
1393
|
else:
|
|
1394
|
+
if env_dict:
|
|
1395
|
+
env_secret = _Secret.from_dict(env)
|
|
1396
|
+
await env_secret.hydrate(client=self._client)
|
|
1397
|
+
kwargs["secret_ids"] = [*kwargs["secret_ids"], env_secret.object_id]
|
|
1398
|
+
kwargs.pop("env", None)
|
|
1369
1399
|
return await self._exec_through_server(*args, **kwargs)
|
|
1370
1400
|
|
|
1371
1401
|
async def _exec_through_server(
|
|
@@ -1421,6 +1451,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1421
1451
|
timeout: Optional[int] = None,
|
|
1422
1452
|
workdir: Optional[str] = None,
|
|
1423
1453
|
secret_ids: Optional[Collection[str]] = None,
|
|
1454
|
+
env: Optional[dict[str, str]] = None,
|
|
1424
1455
|
text: bool = True,
|
|
1425
1456
|
bufsize: Literal[-1, 1] = -1,
|
|
1426
1457
|
runtime_debug: bool = False,
|
|
@@ -1463,6 +1494,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1463
1494
|
pty_info=pty_info,
|
|
1464
1495
|
runtime_debug=runtime_debug,
|
|
1465
1496
|
container_id=container_id or "",
|
|
1497
|
+
env=env or {},
|
|
1466
1498
|
)
|
|
1467
1499
|
_ = await command_router_client.exec_start(start_req)
|
|
1468
1500
|
|
|
@@ -584,6 +584,7 @@ class _Sandbox(modal._object._Object):
|
|
|
584
584
|
timeout: typing.Optional[int] = None,
|
|
585
585
|
workdir: typing.Optional[str] = None,
|
|
586
586
|
secret_ids: typing.Optional[collections.abc.Collection[str]] = None,
|
|
587
|
+
env: typing.Optional[dict[str, str]] = None,
|
|
587
588
|
text: bool = True,
|
|
588
589
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
589
590
|
runtime_debug: bool = False,
|
|
@@ -1814,6 +1815,7 @@ class Sandbox(modal.object.Object):
|
|
|
1814
1815
|
timeout: typing.Optional[int] = None,
|
|
1815
1816
|
workdir: typing.Optional[str] = None,
|
|
1816
1817
|
secret_ids: typing.Optional[collections.abc.Collection[str]] = None,
|
|
1818
|
+
env: typing.Optional[dict[str, str]] = None,
|
|
1817
1819
|
text: bool = True,
|
|
1818
1820
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
1819
1821
|
runtime_debug: bool = False,
|
|
@@ -1836,6 +1838,7 @@ class Sandbox(modal.object.Object):
|
|
|
1836
1838
|
timeout: typing.Optional[int] = None,
|
|
1837
1839
|
workdir: typing.Optional[str] = None,
|
|
1838
1840
|
secret_ids: typing.Optional[collections.abc.Collection[str]] = None,
|
|
1841
|
+
env: typing.Optional[dict[str, str]] = None,
|
|
1839
1842
|
text: bool = True,
|
|
1840
1843
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
1841
1844
|
runtime_debug: bool = False,
|
|
@@ -267,6 +267,10 @@ class ModalClientBase(abc.ABC):
|
|
|
267
267
|
async def EnvironmentDelete(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentDeleteRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
268
268
|
pass
|
|
269
269
|
|
|
270
|
+
@abc.abstractmethod
|
|
271
|
+
async def EnvironmentGetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentGetManagedRequest, modal_proto.api_pb2.EnvironmentGetManagedResponse]') -> None:
|
|
272
|
+
pass
|
|
273
|
+
|
|
270
274
|
@abc.abstractmethod
|
|
271
275
|
async def EnvironmentGetOrCreate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentGetOrCreateRequest, modal_proto.api_pb2.EnvironmentGetOrCreateResponse]') -> None:
|
|
272
276
|
pass
|
|
@@ -275,6 +279,14 @@ class ModalClientBase(abc.ABC):
|
|
|
275
279
|
async def EnvironmentList(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.EnvironmentListResponse]') -> None:
|
|
276
280
|
pass
|
|
277
281
|
|
|
282
|
+
@abc.abstractmethod
|
|
283
|
+
async def EnvironmentRoleSet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentRoleSetRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
284
|
+
pass
|
|
285
|
+
|
|
286
|
+
@abc.abstractmethod
|
|
287
|
+
async def EnvironmentSetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetManagedRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
288
|
+
pass
|
|
289
|
+
|
|
278
290
|
@abc.abstractmethod
|
|
279
291
|
async def EnvironmentUpdate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentUpdateRequest, modal_proto.api_pb2.EnvironmentListItem]') -> None:
|
|
280
292
|
pass
|
|
@@ -623,6 +635,10 @@ class ModalClientBase(abc.ABC):
|
|
|
623
635
|
async def SecretUpdate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SecretUpdateRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
624
636
|
pass
|
|
625
637
|
|
|
638
|
+
@abc.abstractmethod
|
|
639
|
+
async def ServiceUserList(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.ServiceUserListResponse]') -> None:
|
|
640
|
+
pass
|
|
641
|
+
|
|
626
642
|
@abc.abstractmethod
|
|
627
643
|
async def SharedVolumeDelete(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SharedVolumeDeleteRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
628
644
|
pass
|
|
@@ -787,6 +803,10 @@ class ModalClientBase(abc.ABC):
|
|
|
787
803
|
async def WorkspaceDashboardUrlGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.WorkspaceDashboardUrlRequest, modal_proto.api_pb2.WorkspaceDashboardUrlResponse]') -> None:
|
|
788
804
|
pass
|
|
789
805
|
|
|
806
|
+
@abc.abstractmethod
|
|
807
|
+
async def WorkspaceMembersList(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceMembersListResponse]') -> None:
|
|
808
|
+
pass
|
|
809
|
+
|
|
790
810
|
@abc.abstractmethod
|
|
791
811
|
async def WorkspaceNameLookup(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceNameLookupResponse]') -> None:
|
|
792
812
|
pass
|
|
@@ -1165,6 +1185,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1165
1185
|
modal_proto.api_pb2.EnvironmentDeleteRequest,
|
|
1166
1186
|
google.protobuf.empty_pb2.Empty,
|
|
1167
1187
|
),
|
|
1188
|
+
'/modal.client.ModalClient/EnvironmentGetManaged': grpclib.const.Handler(
|
|
1189
|
+
self.EnvironmentGetManaged,
|
|
1190
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1191
|
+
modal_proto.api_pb2.EnvironmentGetManagedRequest,
|
|
1192
|
+
modal_proto.api_pb2.EnvironmentGetManagedResponse,
|
|
1193
|
+
),
|
|
1168
1194
|
'/modal.client.ModalClient/EnvironmentGetOrCreate': grpclib.const.Handler(
|
|
1169
1195
|
self.EnvironmentGetOrCreate,
|
|
1170
1196
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -1177,6 +1203,18 @@ class ModalClientBase(abc.ABC):
|
|
|
1177
1203
|
google.protobuf.empty_pb2.Empty,
|
|
1178
1204
|
modal_proto.api_pb2.EnvironmentListResponse,
|
|
1179
1205
|
),
|
|
1206
|
+
'/modal.client.ModalClient/EnvironmentRoleSet': grpclib.const.Handler(
|
|
1207
|
+
self.EnvironmentRoleSet,
|
|
1208
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1209
|
+
modal_proto.api_pb2.EnvironmentRoleSetRequest,
|
|
1210
|
+
google.protobuf.empty_pb2.Empty,
|
|
1211
|
+
),
|
|
1212
|
+
'/modal.client.ModalClient/EnvironmentSetManaged': grpclib.const.Handler(
|
|
1213
|
+
self.EnvironmentSetManaged,
|
|
1214
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1215
|
+
modal_proto.api_pb2.EnvironmentSetManagedRequest,
|
|
1216
|
+
google.protobuf.empty_pb2.Empty,
|
|
1217
|
+
),
|
|
1180
1218
|
'/modal.client.ModalClient/EnvironmentUpdate': grpclib.const.Handler(
|
|
1181
1219
|
self.EnvironmentUpdate,
|
|
1182
1220
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -1699,6 +1737,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1699
1737
|
modal_proto.api_pb2.SecretUpdateRequest,
|
|
1700
1738
|
google.protobuf.empty_pb2.Empty,
|
|
1701
1739
|
),
|
|
1740
|
+
'/modal.client.ModalClient/ServiceUserList': grpclib.const.Handler(
|
|
1741
|
+
self.ServiceUserList,
|
|
1742
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1743
|
+
google.protobuf.empty_pb2.Empty,
|
|
1744
|
+
modal_proto.api_pb2.ServiceUserListResponse,
|
|
1745
|
+
),
|
|
1702
1746
|
'/modal.client.ModalClient/SharedVolumeDelete': grpclib.const.Handler(
|
|
1703
1747
|
self.SharedVolumeDelete,
|
|
1704
1748
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -1945,6 +1989,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1945
1989
|
modal_proto.api_pb2.WorkspaceDashboardUrlRequest,
|
|
1946
1990
|
modal_proto.api_pb2.WorkspaceDashboardUrlResponse,
|
|
1947
1991
|
),
|
|
1992
|
+
'/modal.client.ModalClient/WorkspaceMembersList': grpclib.const.Handler(
|
|
1993
|
+
self.WorkspaceMembersList,
|
|
1994
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1995
|
+
google.protobuf.empty_pb2.Empty,
|
|
1996
|
+
modal_proto.api_pb2.WorkspaceMembersListResponse,
|
|
1997
|
+
),
|
|
1948
1998
|
'/modal.client.ModalClient/WorkspaceNameLookup': grpclib.const.Handler(
|
|
1949
1999
|
self.WorkspaceNameLookup,
|
|
1950
2000
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -2329,6 +2379,12 @@ class ModalClientStub:
|
|
|
2329
2379
|
modal_proto.api_pb2.EnvironmentDeleteRequest,
|
|
2330
2380
|
google.protobuf.empty_pb2.Empty,
|
|
2331
2381
|
)
|
|
2382
|
+
self.EnvironmentGetManaged = grpclib.client.UnaryUnaryMethod(
|
|
2383
|
+
channel,
|
|
2384
|
+
'/modal.client.ModalClient/EnvironmentGetManaged',
|
|
2385
|
+
modal_proto.api_pb2.EnvironmentGetManagedRequest,
|
|
2386
|
+
modal_proto.api_pb2.EnvironmentGetManagedResponse,
|
|
2387
|
+
)
|
|
2332
2388
|
self.EnvironmentGetOrCreate = grpclib.client.UnaryUnaryMethod(
|
|
2333
2389
|
channel,
|
|
2334
2390
|
'/modal.client.ModalClient/EnvironmentGetOrCreate',
|
|
@@ -2341,6 +2397,18 @@ class ModalClientStub:
|
|
|
2341
2397
|
google.protobuf.empty_pb2.Empty,
|
|
2342
2398
|
modal_proto.api_pb2.EnvironmentListResponse,
|
|
2343
2399
|
)
|
|
2400
|
+
self.EnvironmentRoleSet = grpclib.client.UnaryUnaryMethod(
|
|
2401
|
+
channel,
|
|
2402
|
+
'/modal.client.ModalClient/EnvironmentRoleSet',
|
|
2403
|
+
modal_proto.api_pb2.EnvironmentRoleSetRequest,
|
|
2404
|
+
google.protobuf.empty_pb2.Empty,
|
|
2405
|
+
)
|
|
2406
|
+
self.EnvironmentSetManaged = grpclib.client.UnaryUnaryMethod(
|
|
2407
|
+
channel,
|
|
2408
|
+
'/modal.client.ModalClient/EnvironmentSetManaged',
|
|
2409
|
+
modal_proto.api_pb2.EnvironmentSetManagedRequest,
|
|
2410
|
+
google.protobuf.empty_pb2.Empty,
|
|
2411
|
+
)
|
|
2344
2412
|
self.EnvironmentUpdate = grpclib.client.UnaryUnaryMethod(
|
|
2345
2413
|
channel,
|
|
2346
2414
|
'/modal.client.ModalClient/EnvironmentUpdate',
|
|
@@ -2863,6 +2931,12 @@ class ModalClientStub:
|
|
|
2863
2931
|
modal_proto.api_pb2.SecretUpdateRequest,
|
|
2864
2932
|
google.protobuf.empty_pb2.Empty,
|
|
2865
2933
|
)
|
|
2934
|
+
self.ServiceUserList = grpclib.client.UnaryUnaryMethod(
|
|
2935
|
+
channel,
|
|
2936
|
+
'/modal.client.ModalClient/ServiceUserList',
|
|
2937
|
+
google.protobuf.empty_pb2.Empty,
|
|
2938
|
+
modal_proto.api_pb2.ServiceUserListResponse,
|
|
2939
|
+
)
|
|
2866
2940
|
self.SharedVolumeDelete = grpclib.client.UnaryUnaryMethod(
|
|
2867
2941
|
channel,
|
|
2868
2942
|
'/modal.client.ModalClient/SharedVolumeDelete',
|
|
@@ -3109,6 +3183,12 @@ class ModalClientStub:
|
|
|
3109
3183
|
modal_proto.api_pb2.WorkspaceDashboardUrlRequest,
|
|
3110
3184
|
modal_proto.api_pb2.WorkspaceDashboardUrlResponse,
|
|
3111
3185
|
)
|
|
3186
|
+
self.WorkspaceMembersList = grpclib.client.UnaryUnaryMethod(
|
|
3187
|
+
channel,
|
|
3188
|
+
'/modal.client.ModalClient/WorkspaceMembersList',
|
|
3189
|
+
google.protobuf.empty_pb2.Empty,
|
|
3190
|
+
modal_proto.api_pb2.WorkspaceMembersListResponse,
|
|
3191
|
+
)
|
|
3112
3192
|
self.WorkspaceNameLookup = grpclib.client.UnaryUnaryMethod(
|
|
3113
3193
|
channel,
|
|
3114
3194
|
'/modal.client.ModalClient/WorkspaceNameLookup',
|