Skip to content

rutis v0.8.0

Choose a tag to compare

@github-actions github-actions released this 08 Oct 14:29
· 486 commits to main since this release
d6ba86a

rutis 0.8.0

中文 · Migration guide

0.8.0 adds native Windows support and per-instance plugin management, and brings the core and the dylib toolchain into the release train: from this release on, every rutis package shares one version number.

Packages

All of these are at 0.8.0:

Registry Packages
crates.io rutis (the core), rutis-bridge, rutis-loader, rutis-host; the dylib toolchain rutis-sdk, rutis-dylib, rutis-dylib-meta, rutis-dylib-launcher (first release on crates.io)
npm @arcships/rutis, @arcships/rutis-runtime, @arcships/rutis-host, and the five platform host packages
PyPI rutis, rutis-host
GitHub rutis-host binaries for Linux / macOS (x64 / arm64) and Windows (x64), with SHA-256 checksums

The core has no code changes; it moves from 0.6.1 straight to 0.8.0 to line up with the train. rutis-cli keeps its own version.

What's new

  • Native Windows (x64, MSVC): embedded in Rust, Node / Python language runtimes, remote runtimes and cross-language shared services run on Windows. A local runtime gets its channel over a loopback address with a one-time token. Runtime processes join a Job Object that closes with the host, so none outlives the host however it exits. Exit reasons are reported as RuntimeState::Down as usual. The Process::launch / Process::mount compatibility API and the Cordis mount bindings generated with it start their runtimes the same way. The rutis-host command runs on Windows too: a release binary, npx @arcships/rutis-host (@arcships/rutis-host-win32-x64) and uvx rutis-host (a Windows wheel); it finds a project's virtual environment at .venv\Scripts\python.exe and uses python otherwise.
  • Instanced groups: the loader manages plugins inside instances the application creates at runtime, for example one set per session. Set instanced: true on a group and manage instances with create_instance / remove_instance / restart_instance. Configuration edits, reload and restart reach every copy; if any copy fails, the change is rolled back.
  • Service names inside instances: a service name can belong to a kind of instance and resolve to each instance's own key. Configuration and plugin code (Rust, TypeScript, Python) write only the name. Language runtimes and node links are isolated per instance.
  • Fixes:
    • A local process that exits right after starting reports its exit status on send too, not just Broken pipe.
    • Another local process that connects to the loopback listener and sends nothing no longer delays the runtime's start.
    • The Python runtime now applies a row's isolate.
  • Release: the two PyPI projects are published from separate environments.

Compatibility

A few public Rust APIs changed incompatibly: Resolved is now built with Resolved::new; EntryStatus gains Stopped and Handover gains Loopback; EntryStatus, EntryInfo, InstanceInfo, Handover and Resolved are #[non_exhaustive], so later fields and variants are no longer breaking changes. Dylib plugins must be rebuilt with the 0.8.0 SDK. See the migration guide.

Protocol versions are unchanged: local sessions use protocol 2, sessions with endpoint identity protocol 3. Use the same train version for the host and the language runtimes; instance services need 0.8 runtimes. Node 24+ and Python 3.12+ are required.

Getting started

npx @arcships/rutis-host@0.8.0 new greeter --lang node
uvx --from rutis-host==0.8.0 rutis-host new greeter-py --lang python

Then read TypeScript plugins, Python plugins, embedding in Rust or connecting nodes.