From d978ef34882566e167ed86b7a3e785ff73578807 Mon Sep 17 00:00:00 2001 From: Zach Vorhies Date: Sun, 25 Oct 2026 22:44:20 -0700 Subject: [PATCH] release: prepare 4.10.17 Bumps all published crates, the Python package, and their internal exact pins to 4.10.17 in lockstep for supervised services with a non-blocking client (#1330): running_process_service in Python and backend_sdk::{ServiceServer, PollingFrameClient} in Rust. kitty-worker in zackees' NixOS config pins this release. Local-Gate: v1 tree=7b356dd50cf73861ab0c404acac5bb7ed15cbdc7 secs=1588 lanes=linux-quick:run Ci-Attestation: {"at":1792998816,"gate":"rust/all/fmt","host":"linux-x86_64","key":"47f5904201d8160305f2a1e7d2a7759d4424043f02fae6bbdad22fc8d6209e57","lane":"linux-quick","parents":["3cac77ae396d5e0a2c1318bb64f8c92c34810875"],"secs":1588,"stamp":"cd11253cd95204301289e2c22205f466","tree":"7b356dd50cf73861ab0c404acac5bb7ed15cbdc7","v":1,"via":"run"} Ci-Attestation: {"at":1792998816,"gate":"python/all/static","host":"linux-x86_64","key":"47f5904201d8160305f2a1e7d2a7759d4424043f02fae6bbdad22fc8d6209e57","lane":"linux-quick","parents":["3cac77ae396d5e0a2c1318bb64f8c92c34810875"],"secs":1588,"stamp":"2f27c60c0a9f0157bd4c3d4e4268fb3b","tree":"7b356dd50cf73861ab0c404acac5bb7ed15cbdc7","v":1,"via":"run"} Ci-Attestation: {"at":1792998816,"gate":"rust/x86_64-unknown-linux-gnu/check","host":"linux-x86_64","key":"47f5904201d8160305f2a1e7d2a7759d4424043f02fae6bbdad22fc8d6209e57","lane":"linux-quick","parents":["3cac77ae396d5e0a2c1318bb64f8c92c34810875"],"secs":1588,"stamp":"49d572ca76669aacfab959dd24f7bf18","tree":"7b356dd50cf73861ab0c404acac5bb7ed15cbdc7","v":1,"via":"run"} Ci-Attestation: {"at":1792998816,"gate":"rust/x86_64-unknown-linux-gnu/dylint","host":"linux-x86_64","key":"47f5904201d8160305f2a1e7d2a7759d4424043f02fae6bbdad22fc8d6209e57","lane":"linux-quick","parents":["3cac77ae396d5e0a2c1318bb64f8c92c34810875"],"secs":1588,"stamp":"6a83aa7ad05dfe737f1ec72e1fd62165","tree":"7b356dd50cf73861ab0c404acac5bb7ed15cbdc7","v":1,"via":"run"} Ci-Attestation: {"at":1792998816,"gate":"rust/x86_64-unknown-linux-gnu/test","host":"linux-x86_64","key":"47f5904201d8160305f2a1e7d2a7759d4424043f02fae6bbdad22fc8d6209e57","lane":"linux-quick","parents":["3cac77ae396d5e0a2c1318bb64f8c92c34810875"],"secs":1588,"stamp":"ffe62cedc00ae036437f565fd9b2ffc6","tree":"7b356dd50cf73861ab0c404acac5bb7ed15cbdc7","v":1,"via":"run"} Ci-Attestation: {"at":1792998816,"gate":"python/linux-x64/test","host":"linux-x86_64","key":"47f5904201d8160305f2a1e7d2a7759d4424043f02fae6bbdad22fc8d6209e57","lane":"linux-quick","parents":["3cac77ae396d5e0a2c1318bb64f8c92c34810875"],"secs":1588,"stamp":"c9ce4635edd1e63e5cb2cd9ca3535769","tree":"7b356dd50cf73861ab0c404acac5bb7ed15cbdc7","v":1,"via":"run"} Ci-Attestation: {"at":1792998816,"gate":"general/linux-x64/perf","host":"linux-x86_64","key":"47f5904201d8160305f2a1e7d2a7759d4424043f02fae6bbdad22fc8d6209e57","lane":"linux-quick","parents":["3cac77ae396d5e0a2c1318bb64f8c92c34810875"],"secs":1588,"stamp":"e3534f055b436cd11713e2dc0e4709aa","tree":"7b356dd50cf73861ab0c404acac5bb7ed15cbdc7","v":1,"via":"run"} --- CHANGELOG.md | 19 ++++++++++++++++ Cargo.lock | 22 +++++++++---------- Cargo.toml | 2 +- .../Cargo.toml | 2 +- .../running-process-probe-daemon/Cargo.toml | 6 ++--- crates/running-process-probe/Cargo.toml | 2 +- crates/running-process-py/Cargo.toml | 6 ++--- crates/running-process/Cargo.toml | 8 +++---- pyproject.toml | 2 +- src/running_process/__init__.py | 2 +- uv.lock | 4 ++-- 11 files changed, 47 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e105307..961f879d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## 4.10.17 — Supervised services with a non-blocking client + +- New light top-level Python package `running_process_service` + (`ServiceSpec`, `ServiceServer`, `serve`, `ServiceClient`) and Rust + `broker::backend_sdk::{ServiceServer, PollingFrameClient}`: a small + service bound once per user (`ServiceAlreadyRunning` for a second + instance), health-probed through its identity file, and respawned by its + clients under a lock file within a spawn budget (3 per 30 s), with no + broker. See `docs/SERVICE.md`. +- The client never blocks: `send` fails fast with `ServiceUnavailable` or + `QueueFull`, `try_recv` polls, and replies are matched by request id + (out of order). Built for callers that may only poll from a timer, such + as code on a terminal emulator's UI thread. +- `import running_process_service` loads only the native extension, not the + `running_process` package. +- `ipc::Stream::set_interruptible_reads` / `bytes_available` (platform + facade): reads that a closing server can interrupt on every platform; + Windows pipes poll `PeekNamedPipe` because they ignore receive timeouts. + ## 4.10.16 — Actually Portable Executable launches - Runs Cosmopolitan Actually Portable Executables (APE) on hosts with no diff --git a/Cargo.lock b/Cargo.lock index 63ff4bf4..9f2308b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2060,7 +2060,7 @@ dependencies = [ [[package]] name = "running-process" -version = "4.10.16" +version = "4.10.17" dependencies = [ "anyhow", "blake3", @@ -2098,7 +2098,7 @@ dependencies = [ [[package]] name = "running-process-platform-internal" -version = "4.10.16" +version = "4.10.17" dependencies = [ "blake3", "dirs", @@ -2128,7 +2128,7 @@ dependencies = [ [[package]] name = "running-process-probe" -version = "4.10.16" +version = "4.10.17" dependencies = [ "blake3", "crash-handler", @@ -2152,7 +2152,7 @@ dependencies = [ [[package]] name = "running-process-probe-daemon" -version = "4.10.16" +version = "4.10.17" dependencies = [ "axum", "blake3", @@ -2187,21 +2187,21 @@ dependencies = [ [[package]] name = "running-process-probe-interposer-linux" -version = "4.10.16" +version = "4.10.17" dependencies = [ "libc", ] [[package]] name = "running-process-probe-interposer-macos" -version = "4.10.16" +version = "4.10.17" dependencies = [ "libc", ] [[package]] name = "running-process-probe-interposer-windows" -version = "4.10.16" +version = "4.10.17" dependencies = [ "retour", "windows-sys 0.61.2", @@ -2209,7 +2209,7 @@ dependencies = [ [[package]] name = "running-process-probe-worker" -version = "4.10.16" +version = "4.10.17" dependencies = [ "addr2line", "lzma-rs", @@ -2228,7 +2228,7 @@ dependencies = [ [[package]] name = "running-process-protocol" -version = "4.10.16" +version = "4.10.17" dependencies = [ "prost", "prost-build", @@ -2238,7 +2238,7 @@ dependencies = [ [[package]] name = "running-process-py" -version = "4.10.16" +version = "4.10.17" dependencies = [ "libc", "prost", @@ -2254,7 +2254,7 @@ dependencies = [ [[package]] name = "running-process-win-gnu-bridge" -version = "4.10.16" +version = "4.10.17" dependencies = [ "windows-sys 0.61.2", ] diff --git a/Cargo.toml b/Cargo.toml index 924bf90c..8da07b3f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ members = [ exclude = ["testbins-tokio"] [workspace.package] -version = "4.10.16" +version = "4.10.17" edition = "2021" rust-version = "1.95" license = "MIT" diff --git a/crates/running-process-platform-internal/Cargo.toml b/crates/running-process-platform-internal/Cargo.toml index deb83b35..a73e34ea 100644 --- a/crates/running-process-platform-internal/Cargo.toml +++ b/crates/running-process-platform-internal/Cargo.toml @@ -51,7 +51,7 @@ conpty-sidecar = [ [dependencies] miniz_oxide = { version = "0.8", optional = true } prost = { version = "0.14", optional = true } -running-process-protocol = { version = "=4.10.16", path = "../running-process-protocol", optional = true } +running-process-protocol = { version = "=4.10.17", path = "../running-process-protocol", optional = true } tokio = { version = "1", default-features = false, features = ["io-util", "macros", "process", "rt"], optional = true } sysinfo = { version = "0.30", optional = true } interprocess = { version = "2", optional = true } diff --git a/crates/running-process-probe-daemon/Cargo.toml b/crates/running-process-probe-daemon/Cargo.toml index e3f3c467..b20c4e10 100644 --- a/crates/running-process-probe-daemon/Cargo.toml +++ b/crates/running-process-probe-daemon/Cargo.toml @@ -24,15 +24,15 @@ path = "src/bin/rpprobe.rs" # Broker primitives reused as libraries: framing codec, peer-cred/owner-only # ACL, privilege refusal, SID hashing, private-dir hardening. The probe daemon # is NOT a broker backend — it borrows the plumbing, not the wire. -running-process = { path = "../running-process", version = "4.10.16", default-features = false, features = [ +running-process = { path = "../running-process", version = "4.10.17", default-features = false, features = [ "client", ] } # probe_diag.v1 schema (S1 / #630). -running-process-probe = { path = "../running-process-probe", version = "4.10.16" } +running-process-probe = { path = "../running-process-probe", version = "4.10.17" } # Host endpoint naming, runtime directory, private/no-follow file opens and # fault-code names (#974). `running-process` already depends on this crate, so # this adds no new package to the graph; only `ipc` and `fs` are enabled. -running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", default-features = false, features = ["ipc", "fs"] } +running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", default-features = false, features = ["ipc", "fs"] } interprocess = "2" prost = "0.14" diff --git a/crates/running-process-probe/Cargo.toml b/crates/running-process-probe/Cargo.toml index 446be1d9..9f827e2e 100644 --- a/crates/running-process-probe/Cargo.toml +++ b/crates/running-process-probe/Cargo.toml @@ -74,7 +74,7 @@ object = { version = "0.36", default-features = false, features = ["read", "std" # #974: which images are loaded is host mechanics and comes from the platform # facade. Only the dependency-free core is enabled; the object parsers above # stay here, never in the facade. -running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", default-features = false } +running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", default-features = false } [target.'cfg(any(target_os = "linux", target_os = "macos"))'.dependencies] # #635 cooperative capture uses realtime signals/ucontext on Linux and Mach diff --git a/crates/running-process-py/Cargo.toml b/crates/running-process-py/Cargo.toml index 3ca2821f..544a7804 100644 --- a/crates/running-process-py/Cargo.toml +++ b/crates/running-process-py/Cargo.toml @@ -20,7 +20,7 @@ crate-type = ["cdylib", "lib"] libc = "0.2" pyo3 = { workspace = true } regex = "1" -running-process = { path = "../running-process", version = "4.10.16", features = ["async-process", "client", "originator-scan", "probe", "pty"] } +running-process = { path = "../running-process", version = "4.10.17", features = ["async-process", "client", "originator-scan", "probe", "pty"] } pyo3-async-runtimes = { version = "0.29", features = ["tokio-runtime"] } tokio = { version = "1", default-features = false, features = ["sync"] } sysinfo = "0.30" @@ -28,7 +28,7 @@ prost = "0.14" # Supplies the probe_diag.v1 prost enums and the all-thread snapshot API. # default-features = false keeps the crate's injection vehicles (gated on its # embed-helper feature) out of the extension module entirely. -running-process-probe = { path = "../running-process-probe", version = "4.10.16", default-features = false } +running-process-probe = { path = "../running-process-probe", version = "4.10.17", default-features = false } # #975: the tracked-pid registry asks the platform facade for the state base # directory instead of selecting the host itself. -running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", features = ["fs"] } +running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", features = ["fs"] } diff --git a/crates/running-process/Cargo.toml b/crates/running-process/Cargo.toml index 7ffd2941..66dd65cf 100644 --- a/crates/running-process/Cargo.toml +++ b/crates/running-process/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "running-process" -version = "4.10.16" +version = "4.10.17" edition = "2021" rust-version = "1.95" license = "MIT" @@ -275,14 +275,14 @@ sha2 = { version = "0.10", optional = true } getrandom = { version = "0.4", optional = true } # #633: schema-only dependency for the probe client facade. default-features # off keeps the interposer/injection machinery out — see the `probe` feature. -running-process-probe = { path = "../running-process-probe", version = "4.10.16", default-features = false, optional = true } -running-process-protocol = { path = "../running-process-protocol", version = "4.10.16", optional = true } +running-process-probe = { path = "../running-process-probe", version = "4.10.17", default-features = false, optional = true } +running-process-protocol = { path = "../running-process-protocol", version = "4.10.17", optional = true } # Preserve the long-standing `process_tree::kill_tree` path for 4.x # `default-features = false` consumers. The current Phase 0.5 containment # primitive is sysinfo-backed, so the root selects this narrow private # platform capability unconditionally while keeping public inspection APIs # behind `process-inspection`. Other platform capabilities stay opt-in. -running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.16", default-features = false, features = ["process-inspection"] } +running-process-platform-internal = { path = "../running-process-platform-internal", version = "4.10.17", default-features = false, features = ["process-inspection"] } # Wave 5 of #165: daemon-feature deps. All optional except tokio. # tokio (#850): unconditional since NativeProcess's lifecycle observer runs # on the process-global actor runtime. The base set is deliberately minimal diff --git a/pyproject.toml b/pyproject.toml index 52f202fa..efeb4e50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "soldr" [project] name = "running_process" -version = "4.10.16" +version = "4.10.17" description = "A Rust-backed subprocess wrapper with split stdout/stderr streaming" readme = "README.md" requires-python = ">=3.10" diff --git a/src/running_process/__init__.py b/src/running_process/__init__.py index a6a05367..d4581088 100644 --- a/src/running_process/__init__.py +++ b/src/running_process/__init__.py @@ -1,6 +1,6 @@ from __future__ import annotations -__version__ = "4.10.16" +__version__ = "4.10.17" # Imported first: turns a free-threaded interpreter loading the GIL-runtime # extension into an ImportError instead of a segfault (#1142). diff --git a/uv.lock b/uv.lock index 7715f0a8..9a99e2f9 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.10" [[package]] @@ -272,7 +272,7 @@ wheels = [ [[package]] name = "running-process" -version = "4.10.16" +version = "4.10.17" source = { editable = "." } [package.dev-dependencies]