Skip to main content

OpenShell Middleware Manager

openshell-middleware-manager creates and updates Python or Rust services for OpenShell supervisor middleware. Each new project starts as a working pass-through gRPC service. It includes the protocol file for one OpenShell release, tests, dependency locks, and instructions for registering the service.

The CLI does not install or change OpenShell.

Requirements

  • Linux or macOS
  • uv
  • Network access to GitHub and the selected OpenShell release
  • For Rust projects: Cargo and a Rust 1.90-compatible toolchain

Install the CLI

Run omm without installing it permanently:

uvx --from openshell-middleware-manager omm --help

Or install omm from PyPI with uv:

uv tool install openshell-middleware-manager

To install the current development version from GitHub instead:

uv tool install \
  "openshell-middleware-manager @ git+https://github.com/NVIDIA/OpenShell-Research.git#subdirectory=projects/openshell-middleware-manager"

If you already have this repository checked out, install from its local path instead:

uv tool install /path/to/OpenShell-Research/projects/openshell-middleware-manager

Both commands install omm for use outside this repository.

To work on the CLI itself, use the locked project environment:

uv sync --locked
uv run omm --help

Quick start

Generate and run a Python starter with the installed command:

omm create audit-headers \
  --language python \
  --openshell-version v0.0.86 \
  --output /tmp/audit-headers

cd /tmp/audit-headers
uv run pytest
uv run audit-headers

Or generate and run a Rust starter:

omm create audit-headers \
  --language rust \
  --openshell-version v0.0.86 \
  --output /tmp/audit-headers-rust

cd /tmp/audit-headers-rust
cargo test --locked
cargo run --locked -- 127.0.0.1:50051

The output path must not exist. Pin an OpenShell tag when you need repeatable builds. Use --openshell-version latest when you want the newest release.

The starter templates still use the older max_body_bytes binding field, so omm create does not yet support v0.0.116. Validation stops without publishing that starter. omm update can refresh an existing service already compatible with the newer contract, such as Egress Gate.

Run omm --help for all options and omm --version for the installed OMM version. By default, omm derives the Python package name from the project name. Use --package-name to set it yourself.

Update a project

Run this inside a generated project to use the latest OpenShell release:

omm update

To choose a release or update a project in another directory:

omm update /path/to/audit-headers \
  --openshell-version v0.0.90

omm update reads .openshell-middleware-manifest.json to find the project language and Python package. It downloads the selected supervisor_middleware.proto, regenerates Python protobuf and gRPC bindings when needed, updates uv.lock or Cargo.lock, and writes the version and protocol checksum to the manifest. The manifest must name openshell-middleware-manager as its generator.

Python updates run uv sync and then uv run pytest by default. If a project needs additional build steps, supply its normal validation command:

omm update /path/to/egress-gate \
  --openshell-version v0.0.116 --check-command 'make check'

The command runs in the staged project with its isolated Python environment, after binding generation and dependency sync. Arguments are split with shell quoting rules, but no shell is invoked; use a project script for pipelines or multiple commands. A failure prevents publication. The protobuf compiler runs in a separate environment from the project's runtime dependencies.

What you get

Each project contains:

  • a pass-through implementation of Describe, ValidateConfig, and EvaluateHttpRequest;
  • the exact supervisor_middleware.proto from the selected OpenShell release;
  • generated Python gRPC bindings or Rust Tonic build configuration;
  • tests and lint/type-check configuration;
  • uv.lock or Cargo.lock; and
  • .openshell-middleware-manifest.json with the release, source URL, and protocol checksum.

Start by implementing policy behavior in the generated validate_config and evaluate_http_request functions. The generated README explains how to run the service and register it with OpenShell.

How omm protects your files

omm create builds and checks the project in a temporary directory next to the output path. It moves the finished project into place only after every check passes. If the output path already exists, including as a symlink, the command stops without changing it.

omm update works on a temporary copy of the project. It changes only the protocol, generated bindings or Rust build files, lockfile, and manifest. It runs the project checks before replacing those files. Your implementation files stay unchanged. If a file replacement fails, omm restores the files it already replaced.

A lock prevents two omm processes from changing the same path at once. Normal failures remove the lock and temporary files. If an update and its rollback both fail, omm keeps the recovery files and prints their locations.

If the process is killed, it may leave .<output>.openshell-middleware-manager.lock, the transition-safety lock .<output>.openshell-middleware-kit.lock, and a temporary project directory. The legacy-named lock prevents an older omkit process from updating the same project concurrently during the rename transition. Clean up both lock directories as follows:

  1. Open metadata.json in the lock directory.
  2. On the host listed in that file, check that the listed PID is no longer an omm or legacy omkit process.
  3. For create, also check that the requested output path does not exist. Never remove the project directory after an interrupted update.
  4. Inspect the temporary directory listed in metadata.json, then remove only that directory.
  5. Remove owner and metadata.json. Use rmdir to remove the empty lock directory. Stop if the lock directory contains any other files.

Develop the CLI

Run these checks from this directory:

uv run ruff format --check .
uv run ruff check .
uv run ty check
uv run pytest
uv build

Unit tests use local protocol fixtures. They do not contact GitHub or run uv or Cargo inside generated projects.

See RELEASING.md for the local PyPI release process.

Metadata

Release files for openshell-middleware-manager 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for openshell-middleware-manager 0.0.1
File Size Uploaded Provenance
openshell_middleware_manager-0.0.1.tar.gz 24.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for openshell-middleware-manager 0.0.1
File Interpreter ABI Platform
openshell_middleware_manager-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 55.6 kB

Release files / openshell_middleware_manager-0.0.1.tar.gz

Download URL openshell_middleware_manager-0.0.1.tar.gz
Size 24.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9efa7263f044a49b65f84cdef78eb5c37de35d226efe53987c3342c8f763c7a6
BLAKE2b-256 checksum
How to use checksums
ea3f38a13ae583d3b148c97d70beab5b14b8530fb9049b88194a6a1b02d10e0d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / openshell_middleware_manager-0.0.1-py3-none-any.whl

Download URL openshell_middleware_manager-0.0.1-py3-none-any.whl
Size 31.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2b6d120940a245cbca559f0a4f7b641500573cea768079bf10c89a533b40892a
BLAKE2b-256 checksum
How to use checksums
8a3ef0b78dfdadcf396e3320e42dad4e48e4ef581f15682683f382c3f04dcfb9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for openshell-middleware-manager 0.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.0.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page