running-process 4.6.2__tar.gz → 4.6.4__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.
Files changed (437) hide show
  1. {running_process-4.6.2 → running_process-4.6.4}/Cargo.lock +7 -7
  2. {running_process-4.6.2 → running_process-4.6.4}/Cargo.toml +1 -1
  3. {running_process-4.6.2 → running_process-4.6.4}/PKG-INFO +31 -1
  4. {running_process-4.6.2 → running_process-4.6.4}/README.md +30 -0
  5. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/build.rs +3 -0
  6. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/README.md +1 -1
  7. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/bin/running-process-broker-v2.rs +198 -30
  8. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/manifest.rs +4 -1
  9. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/containment.rs +100 -5
  10. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/lib.rs +8 -4
  11. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/originator.rs +73 -0
  12. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/mod.rs +6 -2
  13. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/spawn.rs +112 -6
  14. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/spawn_imp_unix.rs +39 -18
  15. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/spawn_imp_windows.rs +142 -29
  16. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/windows.rs +7 -2
  17. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker_v2_scaffold_accepts_connection.rs +169 -31
  18. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/containment_test.rs +143 -6
  19. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_tui_repaint_test.rs +65 -7
  20. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/Cargo.toml +1 -1
  21. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/daemon_client.rs +2 -1
  22. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/registry.rs +3 -1
  23. {running_process-4.6.2 → running_process-4.6.4}/pyproject.toml +1 -1
  24. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/__init__.py +1 -1
  25. {running_process-4.6.2 → running_process-4.6.4}/LICENSE +0 -0
  26. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/Cargo.toml +0 -0
  27. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/README.md +0 -0
  28. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/examples/handoff_rollout_evidence.rs +0 -0
  29. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v1/broker_v1_admin.proto +0 -0
  30. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v1/broker_v1_envelope.proto +0 -0
  31. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v1/broker_v1_manifest.proto +0 -0
  32. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v1/broker_v1_service_def.proto +0 -0
  33. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v1/buf.yaml +0 -0
  34. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v2/broker_v2_control.proto +0 -0
  35. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v2/broker_v2_manifest.proto +0 -0
  36. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/broker_v2/broker_v2_service_def.proto +0 -0
  37. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/proto/daemon.proto +0 -0
  38. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/bin/README.md +0 -0
  39. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/bin/daemon.rs +0 -0
  40. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/bin/running-process-broker-v1.rs +0 -0
  41. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/bin/running-process-cleanup.rs +0 -0
  42. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/bin/runpm.rs +0 -0
  43. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/bin/trampoline.rs +0 -0
  44. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/boot_autostart/linux.rs +0 -0
  45. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/boot_autostart/macos.rs +0 -0
  46. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/boot_autostart/mod.rs +0 -0
  47. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/boot_autostart/windows.rs +0 -0
  48. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/README.md +0 -0
  49. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/adopt.rs +0 -0
  50. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_handle.rs +0 -0
  51. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lib/accept_handed_off.rs +0 -0
  52. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lib/mod.rs +0 -0
  53. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lib/wire.rs +0 -0
  54. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lifecycle/identity.rs +0 -0
  55. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lifecycle/mod.rs +0 -0
  56. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lifecycle/probe.rs +0 -0
  57. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lifecycle/probe_async.rs +0 -0
  58. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_lifecycle/verify_pid.rs +0 -0
  59. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_sdk/frame_client.rs +0 -0
  60. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_sdk/frame_client_async.rs +0 -0
  61. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_sdk/identity_file.rs +0 -0
  62. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_sdk/mod.rs +0 -0
  63. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/backend_sdk/mux.rs +0 -0
  64. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/broker_http_port.rs +0 -0
  65. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/broker_http_server.rs +0 -0
  66. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/brokered_backend.rs +0 -0
  67. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/builders.rs +0 -0
  68. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/capabilities.rs +0 -0
  69. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/client.rs +0 -0
  70. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/client_v2.rs +0 -0
  71. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/doctor.rs +0 -0
  72. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/fs_health.rs +0 -0
  73. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/get_http_endpoint_dispatch.rs +0 -0
  74. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/host_identity.rs +0 -0
  75. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/http_endpoint_registry.rs +0 -0
  76. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/lifecycle/crash_dump.rs +0 -0
  77. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/lifecycle/mod.rs +0 -0
  78. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/lifecycle/names.rs +0 -0
  79. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/lifecycle/names_v2.rs +0 -0
  80. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/lifecycle/privilege.rs +0 -0
  81. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/lifecycle/process_tree.rs +0 -0
  82. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/lifecycle/sid.rs +0 -0
  83. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/mod.rs +0 -0
  84. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol/frame_ext.rs +0 -0
  85. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol/framing.rs +0 -0
  86. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol/mod.rs +0 -0
  87. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol/registry.rs +0 -0
  88. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol/validate.rs +0 -0
  89. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol_v2/README.md +0 -0
  90. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol_v2/backend_handle.rs +0 -0
  91. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol_v2/client_compat.rs +0 -0
  92. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol_v2/io.rs +0 -0
  93. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol_v2/loader.rs +0 -0
  94. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol_v2/manifest_io.rs +0 -0
  95. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/protocol_v2/mod.rs +0 -0
  96. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/secure_dir.rs +0 -0
  97. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/admin.rs +0 -0
  98. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/backend_endpoint_allocator.rs +0 -0
  99. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/backend_launcher.rs +0 -0
  100. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/backend_registry.rs +0 -0
  101. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/broadcast.rs +0 -0
  102. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/connection.rs +0 -0
  103. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/control_socket.rs +0 -0
  104. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/deadline_stream.rs +0 -0
  105. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/fd_pressure.rs +0 -0
  106. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/ack.rs +0 -0
  107. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/fallback.rs +0 -0
  108. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/handoff_token.rs +0 -0
  109. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/latency.rs +0 -0
  110. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/mod.rs +0 -0
  111. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/orchestrate.rs +0 -0
  112. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/orchestrate_unix.rs +0 -0
  113. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/pending.rs +0 -0
  114. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/unix.rs +0 -0
  115. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/windows.rs +0 -0
  116. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff/wire.rs +0 -0
  117. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/handoff_serve.rs +0 -0
  118. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/hello_handler.rs +0 -0
  119. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/hello_router.rs +0 -0
  120. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/idle_coord.rs +0 -0
  121. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/instance.rs +0 -0
  122. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/metrics.rs +0 -0
  123. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/mod.rs +0 -0
  124. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/perf_guard.rs +0 -0
  125. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/recovery.rs +0 -0
  126. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/serve.rs +0 -0
  127. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/service_def_loader.rs +0 -0
  128. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/spawn_coordinator.rs +0 -0
  129. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/spawn_wait.rs +0 -0
  130. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/trace_context.rs +0 -0
  131. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/broker/server/version_allow_list.rs +0 -0
  132. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/cleanup/instances.rs +0 -0
  133. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/cleanup/list.rs +0 -0
  134. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/cleanup/mod.rs +0 -0
  135. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/cleanup/prune.rs +0 -0
  136. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/cleanup/uninstall.rs +0 -0
  137. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/cleanup/verify_artifacts.rs +0 -0
  138. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/cleanup/verify_basic.rs +0 -0
  139. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/client.rs +0 -0
  140. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/deadline_io.rs +0 -0
  141. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/mod.rs +0 -0
  142. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/observer.rs +0 -0
  143. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/paths.rs +0 -0
  144. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/pipe_session.rs +0 -0
  145. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/pty_session.rs +0 -0
  146. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/client/telemetry.rs +0 -0
  147. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/console_detect.rs +0 -0
  148. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/attach_stream.rs +0 -0
  149. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/config.rs +0 -0
  150. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/emergency_reserve.rs +0 -0
  151. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/core.rs +0 -0
  152. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/kill.rs +0 -0
  153. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/maintenance.rs +0 -0
  154. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/mod.rs +0 -0
  155. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/observer.rs +0 -0
  156. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/pipe_sessions_handlers.rs +0 -0
  157. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/process_tree.rs +0 -0
  158. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/pty_sessions_handlers.rs +0 -0
  159. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/registry_handlers.rs +0 -0
  160. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/services.rs +0 -0
  161. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/spawn.rs +0 -0
  162. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/telemetry.rs +0 -0
  163. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers/util.rs +0 -0
  164. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/handlers_tests.rs +0 -0
  165. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/idle.rs +0 -0
  166. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/mod.rs +0 -0
  167. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/observer_registry.rs +0 -0
  168. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/pipe_attach_stream.rs +0 -0
  169. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/pipe_sessions.rs +0 -0
  170. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/platform/mod.rs +0 -0
  171. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/platform/unix.rs +0 -0
  172. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/platform/windows.rs +0 -0
  173. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/pty_sessions.rs +0 -0
  174. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/reaper.rs +0 -0
  175. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/registry.rs +0 -0
  176. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/runtime_gc.rs +0 -0
  177. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/server.rs +0 -0
  178. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/services.rs +0 -0
  179. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/services_snapshot.rs +0 -0
  180. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/shadow.rs +0 -0
  181. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/daemon/telemetry.rs +0 -0
  182. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/environment.rs +0 -0
  183. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/helpers.rs +0 -0
  184. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/maintenance/mod.rs +0 -0
  185. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/maintenance/release_handles.rs +0 -0
  186. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/observer/cmdline.rs +0 -0
  187. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/observer/descendants_linux.rs +0 -0
  188. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/observer/descendants_macos.rs +0 -0
  189. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/observer/file_handles.rs +0 -0
  190. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/observer/mod.rs +0 -0
  191. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/observer/pid_identity.rs +0 -0
  192. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/observer/tests.rs +0 -0
  193. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/process_tree.rs +0 -0
  194. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/backend.rs +0 -0
  195. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/child.rs +0 -0
  196. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/conpty_acquire.rs +0 -0
  197. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/conpty_api.rs +0 -0
  198. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/conpty_sidecar_hashes.rs +0 -0
  199. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/mod.rs +0 -0
  200. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/pipes.rs +0 -0
  201. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/proc_thread_attr.rs +0 -0
  202. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/pseudoconsole.rs +0 -0
  203. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/conpty_passthrough/win_version.rs +0 -0
  204. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/native_pty_process.rs +0 -0
  205. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/pty_posix.rs +0 -0
  206. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/pty_windows.rs +0 -0
  207. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/pty/terminal_input.rs +0 -0
  208. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/public_symbols.rs +0 -0
  209. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/runpm_config.rs +0 -0
  210. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/rust_debug.rs +0 -0
  211. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/systemd_killmode.rs +0 -0
  212. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/terminal_graphics.rs +0 -0
  213. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/test_support/conformance.rs +0 -0
  214. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/test_support/mod.rs +0 -0
  215. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/tests.rs +0 -0
  216. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/types.rs +0 -0
  217. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/src/unix.rs +0 -0
  218. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/README.md +0 -0
  219. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/admin.rs +0 -0
  220. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_endpoint_allocator.rs +0 -0
  221. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_handle_boot_id.rs +0 -0
  222. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_handle_common.rs +0 -0
  223. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_handle_dead.rs +0 -0
  224. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_handle_probe.rs +0 -0
  225. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_handle_recycled.rs +0 -0
  226. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_registry.rs +0 -0
  227. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_sdk.rs +0 -0
  228. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/backend_sdk_async.rs +0 -0
  229. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/broadcast_release_handles.rs +0 -0
  230. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/builders.rs +0 -0
  231. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/client.rs +0 -0
  232. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/conformance_kit.rs +0 -0
  233. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/connection.rs +0 -0
  234. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/contrib_templates.rs +0 -0
  235. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/docs_escape_hatch.rs +0 -0
  236. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/docs_index.rs +0 -0
  237. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/doctor.rs +0 -0
  238. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/fd_pressure.rs +0 -0
  239. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/framing.rs +0 -0
  240. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/golden_bytes.rs +0 -0
  241. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_ack_deadline.rs +0 -0
  242. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_adopted_backend.rs +0 -0
  243. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_adoption.rs +0 -0
  244. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_backend_lib.rs +0 -0
  245. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_capability.rs +0 -0
  246. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_cross_os_acceptance.rs +0 -0
  247. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_end_to_end_acceptance.rs +0 -0
  248. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_fallback_perm_denied.rs +0 -0
  249. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_latency.rs +0 -0
  250. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_latency_e2e.rs +0 -0
  251. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_orchestrate.rs +0 -0
  252. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_serve_e2e.rs +0 -0
  253. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_serve_latency.rs +0 -0
  254. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_token_mismatch.rs +0 -0
  255. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_transport.rs +0 -0
  256. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_under_load.rs +0 -0
  257. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_unix_e2e_orchestrate.rs +0 -0
  258. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_unix_orchestrate.rs +0 -0
  259. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_windows_duplicate_handle.rs +0 -0
  260. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_windows_orchestrate.rs +0 -0
  261. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/handoff_wire.rs +0 -0
  262. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/hello_concurrent.rs +0 -0
  263. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/hello_handler.rs +0 -0
  264. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/hello_rate_limit.rs +0 -0
  265. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/hello_router.rs +0 -0
  266. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/hello_service_unknown.rs +0 -0
  267. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/hello_skip.rs +0 -0
  268. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/hello_version_blocked.rs +0 -0
  269. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/idle_coord.rs +0 -0
  270. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/instance.rs +0 -0
  271. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/instance_isolation.rs +0 -0
  272. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/into_backend_io.rs +0 -0
  273. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/lifecycle_event_size.rs +0 -0
  274. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/main.rs +0 -0
  275. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/manifest_atomic.rs +0 -0
  276. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/manifest_boot_id.rs +0 -0
  277. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/manifest_corruption.rs +0 -0
  278. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/manifest_roundtrip.rs +0 -0
  279. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/metrics_names_frozen.rs +0 -0
  280. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/names.rs +0 -0
  281. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/peer_creds_drop.rs +0 -0
  282. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/perf_guard.rs +0 -0
  283. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/process_tree_lifecycle.rs +0 -0
  284. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/proto_field_numbers.rs +0 -0
  285. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/proto_roundtrip.rs +0 -0
  286. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/recovery_one_retry.rs +0 -0
  287. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/serve.rs +0 -0
  288. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/service_def_loader.rs +0 -0
  289. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/servicedef_cli.rs +0 -0
  290. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/socket_common.rs +0 -0
  291. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/spawn_coordinator.rs +0 -0
  292. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/spawn_wait.rs +0 -0
  293. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/toy_three_party.rs +0 -0
  294. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/trace_propagation.rs +0 -0
  295. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/verify_pid/linux.rs +0 -0
  296. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/verify_pid/macos.rs +0 -0
  297. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/verify_pid/mod.rs +0 -0
  298. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/broker/verify_pid/windows.rs +0 -0
  299. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/brokered_backend_ui.rs +0 -0
  300. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/cleanup/cleanup_list.rs +0 -0
  301. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/cleanup/cleanup_prune_confirm.rs +0 -0
  302. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/cleanup/cleanup_prune_dryrun.rs +0 -0
  303. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/cleanup/cleanup_uninstall.rs +0 -0
  304. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/cleanup/cleanup_verify_artifacts.rs +0 -0
  305. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/cleanup/common.rs +0 -0
  306. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/cleanup/main.rs +0 -0
  307. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/common/mitm_stdin.rs +0 -0
  308. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/common/mod.rs +0 -0
  309. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_autostart_test.rs +0 -0
  310. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_backlog_accumulation_test.rs +0 -0
  311. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_cross_process_pty_attach_test.rs +0 -0
  312. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_fast_ctrl_c_handoff_test.rs +0 -0
  313. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_integration/compiler_wrap_seam_test.rs +0 -0
  314. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_integration/env_replace_test.rs +0 -0
  315. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_integration/main.rs +0 -0
  316. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_integration/more_tests.rs +0 -0
  317. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_integration/stdout_seam_test.rs +0 -0
  318. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_non_tty_attach_test.rs +0 -0
  319. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_pipe_session_attach_test.rs +0 -0
  320. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_pty_session_attach_test.rs +0 -0
  321. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_resize_rpc_test.rs +0 -0
  322. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_runpm_save_resurrect.rs +0 -0
  323. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_runpm_service_stubs.rs +0 -0
  324. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_sessions_bulk_ops_test.rs +0 -0
  325. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_sessions_log_test.rs +0 -0
  326. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_tee_ring_test.rs +0 -0
  327. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_termination_outcome_test.rs +0 -0
  328. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/daemon_tree_kill_test.rs +0 -0
  329. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/fs_adversarial_test.rs +0 -0
  330. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/interactive_pty_session_test.rs +0 -0
  331. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/maintenance/main.rs +0 -0
  332. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/maintenance/release_handles_unix.rs +0 -0
  333. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/maintenance/release_handles_windows.rs +0 -0
  334. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/originator_test.rs +0 -0
  335. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/process_core_test.rs +0 -0
  336. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/pty_conhost_job_test.rs +0 -0
  337. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/pty_master_public_api_test.rs +0 -0
  338. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/pty_mitm_paste_test.rs +0 -0
  339. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/pty_mitm_stdin_test.rs +0 -0
  340. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/pty_unix_teardown_test.rs +0 -0
  341. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/runpm_boot_autostart_fixtures.rs +0 -0
  342. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/runpm_toml_config.rs +0 -0
  343. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/cross_user_release_handles.rs +0 -0
  344. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/cve_dbus_2014_3639.rs +0 -0
  345. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/cve_dbus_2023_34969.rs +0 -0
  346. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/cve_sccache_2023_1521.rs +0 -0
  347. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/deferred_runtime_surfaces.rs +0 -0
  348. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/dependency_surface.rs +0 -0
  349. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/fuzz_campaign_signoff.rs +0 -0
  350. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/main.rs +0 -0
  351. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/manifest_tamper_detection.rs +0 -0
  352. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/no_network_dependencies.rs +0 -0
  353. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/pipe_name_validation.rs +0 -0
  354. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/pipe_squatting.rs +0 -0
  355. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/security_audit_workflow.rs +0 -0
  356. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/security_fuzz_workflow.rs +0 -0
  357. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/service_name_validation.rs +0 -0
  358. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/unsafe_inventory.rs +0 -0
  359. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/wanted_version_shell_injection.rs +0 -0
  360. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/security/wanted_version_traversal.rs +0 -0
  361. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/spawn_test.rs +0 -0
  362. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/terminal_graphics_capabilities_test.rs +0 -0
  363. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/ui/brokered_backend_state_in_bind.rs +0 -0
  364. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process/tests/ui/brokered_backend_state_in_bind.stderr +0 -0
  365. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/containment.rs +0 -0
  366. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/debug_traces.rs +0 -0
  367. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/helpers.rs +0 -0
  368. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/idle_detector.rs +0 -0
  369. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/lib.rs +0 -0
  370. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/metrics.rs +0 -0
  371. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/originator.rs +0 -0
  372. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/pid_tracking.rs +0 -0
  373. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/priority.rs +0 -0
  374. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/process.rs +0 -0
  375. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/process_tree.rs +0 -0
  376. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/pty_buffer.rs +0 -0
  377. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/pty_process.rs +0 -0
  378. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/public_symbols.rs +0 -0
  379. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/py_native_process.rs +0 -0
  380. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/signal_bool.rs +0 -0
  381. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/terminal_input.rs +0 -0
  382. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/control_churn.rs +0 -0
  383. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/expect_match.rs +0 -0
  384. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/idle_detector.rs +0 -0
  385. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/mod.rs +0 -0
  386. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/parse_command.rs +0 -0
  387. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/process_tree.rs +0 -0
  388. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/pty_buffer.rs +0 -0
  389. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/pty_process.rs +0 -0
  390. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/registry.rs +0 -0
  391. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/signal_bool.rs +0 -0
  392. {running_process-4.6.2 → running_process-4.6.4}/crates/running-process-py/src/tests/terminal_input.rs +0 -0
  393. {running_process-4.6.2 → running_process-4.6.4}/crates/test-watchdog/Cargo.toml +0 -0
  394. {running_process-4.6.2 → running_process-4.6.4}/crates/test-watchdog/src/lib.rs +0 -0
  395. {running_process-4.6.2 → running_process-4.6.4}/crates/test-watchdog/tests/hang_dump.rs +0 -0
  396. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/assets/example.txt +0 -0
  397. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/cli.py +0 -0
  398. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/command_render.py +0 -0
  399. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/compat.py +0 -0
  400. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/console_encoding.py +0 -0
  401. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/daemon.py +0 -0
  402. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/dashboard.py +0 -0
  403. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/exit_status.py +0 -0
  404. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/expect.py +0 -0
  405. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/interrupt_handler.py +0 -0
  406. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/launch.py +0 -0
  407. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/line_iterator.py +0 -0
  408. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/output_formatter.py +0 -0
  409. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/priority.py +0 -0
  410. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/process_utils.py +0 -0
  411. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/processor_cli.py +0 -0
  412. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/__init__.py +0 -0
  413. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_command.py +0 -0
  414. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_console_io.py +0 -0
  415. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_errors.py +0 -0
  416. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_idle_helpers.py +0 -0
  417. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_idle_state.py +0 -0
  418. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_interactive.py +0 -0
  419. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_process_helpers.py +0 -0
  420. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_pseudo_terminal.py +0 -0
  421. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_pty_expect.py +0 -0
  422. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_pty_idle_waiter.py +0 -0
  423. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_pty_input_relay.py +0 -0
  424. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_pty_reader.py +0 -0
  425. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_pty_wait_for.py +0 -0
  426. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_terminal_strip.py +0 -0
  427. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_types.py +0 -0
  428. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/pty/_wait_input.py +0 -0
  429. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/__init__.py +0 -0
  430. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/_classmethod_api.py +0 -0
  431. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/_core.py +0 -0
  432. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/_helpers.py +0 -0
  433. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/_iter.py +0 -0
  434. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/_subprocess.py +0 -0
  435. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/_types.py +0 -0
  436. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process/_wait_methods.py +0 -0
  437. {running_process-4.6.2 → running_process-4.6.4}/src/running_process/running_process_manager.py +0 -0
@@ -1351,7 +1351,7 @@ dependencies = [
1351
1351
 
1352
1352
  [[package]]
1353
1353
  name = "running-process"
1354
- version = "4.6.2"
1354
+ version = "4.6.4"
1355
1355
  dependencies = [
1356
1356
  "anyhow",
1357
1357
  "blake3",
@@ -1390,7 +1390,7 @@ dependencies = [
1390
1390
 
1391
1391
  [[package]]
1392
1392
  name = "running-process-observer"
1393
- version = "4.6.2"
1393
+ version = "4.6.4"
1394
1394
  dependencies = [
1395
1395
  "blake3",
1396
1396
  "dirs",
@@ -1401,21 +1401,21 @@ dependencies = [
1401
1401
 
1402
1402
  [[package]]
1403
1403
  name = "running-process-observer-interposer-linux"
1404
- version = "4.6.2"
1404
+ version = "4.6.4"
1405
1405
  dependencies = [
1406
1406
  "libc",
1407
1407
  ]
1408
1408
 
1409
1409
  [[package]]
1410
1410
  name = "running-process-observer-interposer-macos"
1411
- version = "4.6.2"
1411
+ version = "4.6.4"
1412
1412
  dependencies = [
1413
1413
  "libc",
1414
1414
  ]
1415
1415
 
1416
1416
  [[package]]
1417
1417
  name = "running-process-observer-interposer-windows"
1418
- version = "4.6.2"
1418
+ version = "4.6.4"
1419
1419
  dependencies = [
1420
1420
  "retour",
1421
1421
  "windows-sys 0.59.0",
@@ -1423,7 +1423,7 @@ dependencies = [
1423
1423
 
1424
1424
  [[package]]
1425
1425
  name = "running-process-py"
1426
- version = "4.6.2"
1426
+ version = "4.6.4"
1427
1427
  dependencies = [
1428
1428
  "interprocess",
1429
1429
  "libc",
@@ -1437,7 +1437,7 @@ dependencies = [
1437
1437
 
1438
1438
  [[package]]
1439
1439
  name = "running-process-win-gnu-bridge"
1440
- version = "4.6.2"
1440
+ version = "4.6.4"
1441
1441
  dependencies = [
1442
1442
  "windows-sys 0.59.0",
1443
1443
  ]
@@ -3,7 +3,7 @@ resolver = "2"
3
3
  members = ["crates/running-process", "crates/running-process-py", "crates/test-watchdog"]
4
4
 
5
5
  [workspace.package]
6
- version = "4.6.2"
6
+ version = "4.6.4"
7
7
  edition = "2021"
8
8
  rust-version = "1.85"
9
9
  license = "BSD-3-Clause"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: running_process
3
- Version: 4.6.2
3
+ Version: 4.6.4
4
4
  License-File: LICENSE
5
5
  Summary: A Rust-backed subprocess wrapper with split stdout/stderr streaming
6
6
  Home-Page: https://github.com/zackees/running-process
@@ -430,6 +430,36 @@ PTY mode is intentionally more conservative:
430
430
 
431
431
  `./test` runs the Rust tests, rebuilds the native extension with the unoptimized `dev` profile, runs the non-live Python tests, and then runs the `@pytest.mark.live` coverage that exercises real OS process and signal behavior.
432
432
 
433
+ ### Repository Dylint
434
+
435
+ The native Linux x86 consolidated preflight runs the repository-owned
436
+ `running_process_env_literal` lint. It rejects direct string literals for
437
+ `RUNNING_PROCESS_*` environment controls in `std::env` calls, keeping broker
438
+ escape hatches and test seams tied to their canonical constants. The lint
439
+ library, `cargo-dylint`, and `dylint-link` are pinned to Dylint `6.0.1`; the
440
+ library and CI both use `nightly-2026-04-16`.
441
+
442
+ To run the same gate locally:
443
+
444
+ ```bash
445
+ soldr rustup toolchain install nightly-2026-04-16 --profile minimal \
446
+ --component rustc-dev --component llvm-tools-preview
447
+ uvx soldr cargo install cargo-dylint@6.0.1 dylint-link@6.0.1 --locked
448
+ (
449
+ cd lints/running-process-env-literal
450
+ CARGO_TARGET_DIR=../../target/dylint RUSTUP_TOOLCHAIN=nightly-2026-04-16 \
451
+ uvx soldr cargo test --locked
452
+ )
453
+ CARGO_TARGET_DIR=target/dylint RUSTUP_TOOLCHAIN=nightly-2026-04-16 \
454
+ uvx soldr cargo dylint --all --workspace
455
+ ```
456
+
457
+ The first check exercises the negative UI fixture and proves the lint rejects
458
+ a literal control name. The second checks the workspace. CI gives the exact
459
+ tool binaries and nightly target directory dedicated persistent caches and
460
+ runs the gate once, rather than adding a cold Dylint build to every platform
461
+ job.
462
+
433
463
  On local developer machines, `./test` also runs the Linux Docker preflight so Windows and macOS development catches Linux wheel, lint, and non-live pytest regressions before push. GitHub-hosted Actions skip that Docker-only preflight and run the native platform suite directly.
434
464
 
435
465
  For a live-only test run with the timeout crash watchdog and automatic thread
@@ -416,6 +416,36 @@ PTY mode is intentionally more conservative:
416
416
 
417
417
  `./test` runs the Rust tests, rebuilds the native extension with the unoptimized `dev` profile, runs the non-live Python tests, and then runs the `@pytest.mark.live` coverage that exercises real OS process and signal behavior.
418
418
 
419
+ ### Repository Dylint
420
+
421
+ The native Linux x86 consolidated preflight runs the repository-owned
422
+ `running_process_env_literal` lint. It rejects direct string literals for
423
+ `RUNNING_PROCESS_*` environment controls in `std::env` calls, keeping broker
424
+ escape hatches and test seams tied to their canonical constants. The lint
425
+ library, `cargo-dylint`, and `dylint-link` are pinned to Dylint `6.0.1`; the
426
+ library and CI both use `nightly-2026-04-16`.
427
+
428
+ To run the same gate locally:
429
+
430
+ ```bash
431
+ soldr rustup toolchain install nightly-2026-04-16 --profile minimal \
432
+ --component rustc-dev --component llvm-tools-preview
433
+ uvx soldr cargo install cargo-dylint@6.0.1 dylint-link@6.0.1 --locked
434
+ (
435
+ cd lints/running-process-env-literal
436
+ CARGO_TARGET_DIR=../../target/dylint RUSTUP_TOOLCHAIN=nightly-2026-04-16 \
437
+ uvx soldr cargo test --locked
438
+ )
439
+ CARGO_TARGET_DIR=target/dylint RUSTUP_TOOLCHAIN=nightly-2026-04-16 \
440
+ uvx soldr cargo dylint --all --workspace
441
+ ```
442
+
443
+ The first check exercises the negative UI fixture and proves the lint rejects
444
+ a literal control name. The second checks the workspace. CI gives the exact
445
+ tool binaries and nightly target directory dedicated persistent caches and
446
+ runs the gate once, rather than adding a cold Dylint build to every platform
447
+ job.
448
+
419
449
  On local developer machines, `./test` also runs the Linux Docker preflight so Windows and macOS development catches Linux wheel, lint, and non-live pytest regressions before push. GitHub-hosted Actions skip that Docker-only preflight and run the native platform suite directly.
420
450
 
421
451
  For a live-only test run with the timeout crash watchdog and automatic thread
@@ -1,6 +1,9 @@
1
1
  use std::path::Path;
2
2
 
3
3
  fn main() -> Result<(), Box<dyn std::error::Error>> {
4
+ // cargo-llvm-cov sets this cfg while linking LLVM's profiling runtime.
5
+ println!("cargo:rustc-check-cfg=cfg(coverage)");
6
+
4
7
  // Without these, edits to the .proto don't reliably retrigger
5
8
  // codegen on incremental builds.
6
9
  println!("cargo:rerun-if-changed=proto/daemon.proto");
@@ -4,7 +4,7 @@ Top-level modules of the published `running-process` crate. Feature gating is
4
4
  described in the repo-root `CLAUDE.md` ("Rust workspace" section).
5
5
 
6
6
  - `lib.rs` / `public_symbols.rs` — crate surface and re-exports
7
- - `environment.rs` — user baseline environment (Windows `CreateEnvironmentBlock`, Unix snapshot)
7
+ - `environment.rs` — user baseline environment (Windows `CreateEnvironmentBlock`, Unix login reconstruction)
8
8
  - `spawn.rs`, `spawn_imp_unix.rs`, `spawn_imp_windows.rs` — process spawn implementations
9
9
  - `process_tree.rs` — process-tree enumeration and tree kill
10
10
  - `containment.rs` — Job Objects / process-group containment
@@ -10,8 +10,8 @@
10
10
  //! earlier integration tests.
11
11
  //! 2. **Persistent accept loop** — each accepted connection spawns
12
12
  //! a thread that handles the Hello round-trip. The accept loop
13
- //! is bounded only by the OS's pending-connection backlog;
14
- //! in-flight handlers are bounded by the OS thread cap.
13
+ //! polls with bounded latency so Unix SIGTERM/SIGINT can request a
14
+ //! normal shutdown; in-flight handlers are drained with a deadline.
15
15
  //! 3. **ServiceDefinitionLoader integration** — on each Hello, look
16
16
  //! up `hello.service_name` via the default v2 service-definition
17
17
  //! directory ([`ServiceDefinitionLoader::default_root`]). Reject
@@ -33,7 +33,7 @@
33
33
  //! `broker-v2-scaffold`.
34
34
  //!
35
35
  //! Future slices:
36
- //! - SIGTERM / Ctrl+C graceful shutdown (drain in-flight handlers).
36
+ //! - Windows console-event graceful shutdown.
37
37
  //! - Backend-pipe resolution + adopt forwarding.
38
38
  //! - Single-instance lock (refuse start if another broker is bound).
39
39
  //! - Refuse-privileged-run guard (port from v1).
@@ -41,12 +41,13 @@
41
41
  use std::env;
42
42
  use std::io::Write;
43
43
  use std::process::ExitCode;
44
+ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
44
45
  use std::sync::Arc;
45
- use std::sync::atomic::{AtomicUsize, Ordering};
46
46
  use std::thread;
47
+ use std::time::{Duration, Instant};
47
48
 
48
49
  use interprocess::local_socket::traits::{Listener as _, Stream as _};
49
- use interprocess::local_socket::ListenerOptions;
50
+ use interprocess::local_socket::{ListenerNonblockingMode, ListenerOptions};
50
51
  use prost::Message;
51
52
  use running_process::broker::lifecycle::names_v2::v2_program_pipe;
52
53
  use running_process::broker::lifecycle::privilege::refuse_privileged_run;
@@ -56,8 +57,8 @@ use running_process::broker::protocol::{
56
57
  ENVELOPE_VERSION,
57
58
  };
58
59
  use running_process::broker::protocol_v2::ServiceDefinitionLoader;
59
- use running_process::broker::server::service_def_loader::ServiceDefinitionError;
60
60
  use running_process::broker::server::deadline_stream::{hello_read_deadline, DeadlineStream};
61
+ use running_process::broker::server::service_def_loader::ServiceDefinitionError;
61
62
 
62
63
  /// Default program name when `--program` is not passed. Matches the
63
64
  /// slice-3c scaffold so existing integration tests keep working.
@@ -68,6 +69,59 @@ const SCAFFOLD_PIPE_IDX: u32 = 0;
68
69
  /// cap is the hard upper bound but we want backpressure before that.
69
70
  const MAX_INFLIGHT_HANDLERS: usize = 256;
70
71
  const MAX_INFLIGHT_HANDLERS_ENV: &str = "RUNNING_PROCESS_BROKER_MAX_INFLIGHT_HANDLERS";
72
+ const ACCEPT_POLL_INTERVAL: Duration = Duration::from_millis(20);
73
+ const HANDLER_DRAIN_TIMEOUT: Duration = Duration::from_secs(5);
74
+
75
+ #[cfg(unix)]
76
+ static SIGNAL_SHUTDOWN_REQUESTED: AtomicBool = AtomicBool::new(false);
77
+
78
+ #[cfg(unix)]
79
+ extern "C" fn record_shutdown_signal(_signal: libc::c_int) {
80
+ // Async-signal-safe by construction: do not allocate, log, join threads,
81
+ // or call the LLVM profile runtime from this handler.
82
+ SIGNAL_SHUTDOWN_REQUESTED.store(true, Ordering::Relaxed);
83
+ }
84
+
85
+ #[cfg(unix)]
86
+ fn install_shutdown_signal_handlers() -> std::io::Result<()> {
87
+ SIGNAL_SHUTDOWN_REQUESTED.store(false, Ordering::Relaxed);
88
+ for signal in [libc::SIGTERM, libc::SIGINT] {
89
+ // SAFETY: `record_shutdown_signal` has C ABI, lives for the process
90
+ // lifetime, and performs only an atomic store.
91
+ let previous = unsafe {
92
+ libc::signal(
93
+ signal,
94
+ record_shutdown_signal as *const () as libc::sighandler_t,
95
+ )
96
+ };
97
+ if previous == libc::SIG_ERR {
98
+ return Err(std::io::Error::last_os_error());
99
+ }
100
+ }
101
+ Ok(())
102
+ }
103
+
104
+ #[cfg(coverage)]
105
+ unsafe extern "C" {
106
+ fn __llvm_profile_write_file() -> libc::c_int;
107
+ }
108
+
109
+ fn flush_coverage_profile() -> Result<(), String> {
110
+ #[cfg(coverage)]
111
+ {
112
+ // SAFETY: cargo-llvm-cov links this process with LLVM's profiling
113
+ // runtime. This call occurs after the signal handler has returned and
114
+ // after handler threads have been drained, in ordinary Rust control
115
+ // flow.
116
+ let result = unsafe { __llvm_profile_write_file() };
117
+ if result != 0 {
118
+ return Err(format!(
119
+ "__llvm_profile_write_file returned nonzero status {result}"
120
+ ));
121
+ }
122
+ }
123
+ Ok(())
124
+ }
71
125
 
72
126
  fn max_inflight_handlers() -> usize {
73
127
  std::env::var(MAX_INFLIGHT_HANDLERS_ENV)
@@ -151,14 +205,14 @@ fn main() -> ExitCode {
151
205
  // would bind the v2 pipe in a namespace other users can't reach
152
206
  // AND would create privileged sockets that downstream daemons
153
207
  // get adopted into. Mirrors v1's `running-process-broker-v1`
154
- // startup check exactly. The `RUNNING_PROCESS_ALLOW_PRIVILEGED`
208
+ // startup check exactly. The `RUNNING_PROCESS_BROKER_ALLOW_PRIVILEGED`
155
209
  // env var is honored for isolated test environments that
156
210
  // intentionally exercise privileged startup behavior.
157
211
  if let Err(err) = refuse_privileged_run() {
158
212
  eprintln!(
159
213
  "running-process-broker-v2: refusing privileged startup: {err}. \
160
214
  Run as an unprivileged user, or set \
161
- RUNNING_PROCESS_ALLOW_PRIVILEGED=1 for isolated test environments only."
215
+ RUNNING_PROCESS_BROKER_ALLOW_PRIVILEGED=1 for isolated test environments only."
162
216
  );
163
217
  return ExitCode::from(77); // EX_NOPERM
164
218
  }
@@ -252,7 +306,23 @@ fn main() -> ExitCode {
252
306
  let exit_code = if opts.once {
253
307
  accept_one(&listener, Arc::clone(&loader))
254
308
  } else {
255
- accept_loop(&listener, Arc::clone(&loader), Arc::clone(&inflight))
309
+ #[cfg(unix)]
310
+ if let Err(err) = install_shutdown_signal_handlers() {
311
+ eprintln!("running-process-broker-v2: install shutdown signal handlers failed: {err}");
312
+ return ExitCode::from(1);
313
+ }
314
+
315
+ #[cfg(unix)]
316
+ let shutdown = &SIGNAL_SHUTDOWN_REQUESTED;
317
+ #[cfg(not(unix))]
318
+ let shutdown = &AtomicBool::new(false);
319
+
320
+ accept_loop(
321
+ &listener,
322
+ Arc::clone(&loader),
323
+ Arc::clone(&inflight),
324
+ shutdown,
325
+ )
256
326
  };
257
327
 
258
328
  #[cfg(unix)]
@@ -260,22 +330,34 @@ fn main() -> ExitCode {
260
330
  let _ = std::fs::remove_file(&socket_path);
261
331
  }
262
332
 
333
+ if let Err(err) = flush_coverage_profile() {
334
+ eprintln!("running-process-broker-v2: coverage profile flush failed: {err}");
335
+ return ExitCode::from(1);
336
+ }
337
+
263
338
  exit_code
264
339
  }
265
340
 
266
341
  /// Persistent accept loop. Spawns one handler thread per accepted
267
- /// connection, bounded by `MAX_INFLIGHT_HANDLERS`. Returns `ExitCode`
268
- /// only on terminal accept failure (the loop itself never returns
269
- /// success — production exit is via SIGTERM, a follow-up slice).
342
+ /// connection, bounded by `MAX_INFLIGHT_HANDLERS`. A nonblocking listener
343
+ /// makes the shutdown flag observable within [`ACCEPT_POLL_INTERVAL`].
270
344
  fn accept_loop(
271
345
  listener: &interprocess::local_socket::Listener,
272
346
  loader: Arc<ServiceDefinitionLoader>,
273
347
  inflight: Arc<AtomicUsize>,
348
+ shutdown: &AtomicBool,
274
349
  ) -> ExitCode {
350
+ if let Err(err) = listener.set_nonblocking(ListenerNonblockingMode::Accept) {
351
+ eprintln!("running-process-broker-v2: set listener nonblocking failed: {err}");
352
+ return ExitCode::from(1);
353
+ }
354
+
275
355
  let max_inflight = max_inflight_handlers();
356
+ let mut handlers = Vec::new();
276
357
  loop {
277
- match listener.accept() {
278
- Ok(stream) => {
358
+ reap_finished_handlers(&mut handlers);
359
+ match poll_accept_until_shutdown(shutdown, || listener.accept()) {
360
+ Ok(Some(stream)) => {
279
361
  // Backpressure: refuse to spawn if we're already at the cap.
280
362
  // The peer's blocking read on the Hello-reply socket will
281
363
  // see EOF when this branch closes the stream.
@@ -300,20 +382,28 @@ fn accept_loop(
300
382
  Ok(svc) => println!(
301
383
  "running-process-broker-v2 Hello service={svc:?} negotiated",
302
384
  ),
303
- Err(err) => eprintln!(
304
- "running-process-broker-v2 Hello handler failed: {err}"
305
- ),
385
+ Err(err) => {
386
+ eprintln!("running-process-broker-v2 Hello handler failed: {err}")
387
+ }
306
388
  }
307
389
  });
308
- if let Err(err) = spawn_result {
309
- eprintln!(
310
- "running-process-broker-v2: thread spawn failed: {err}; \
311
- dropping connection"
312
- );
313
- // Decrement here since the spawned thread never ran.
314
- inflight.fetch_sub(1, Ordering::SeqCst);
390
+ match spawn_result {
391
+ Ok(handler) => handlers.push(handler),
392
+ Err(err) => {
393
+ eprintln!(
394
+ "running-process-broker-v2: thread spawn failed: {err}; \
395
+ dropping connection"
396
+ );
397
+ // Decrement here since the spawned thread never ran.
398
+ inflight.fetch_sub(1, Ordering::SeqCst);
399
+ }
315
400
  }
316
401
  }
402
+ Ok(None) => {
403
+ println!("running-process-broker-v2: shutdown requested; draining handlers");
404
+ drain_handlers(&mut handlers, HANDLER_DRAIN_TIMEOUT);
405
+ return ExitCode::SUCCESS;
406
+ }
317
407
  Err(err) => {
318
408
  // accept() errors are typically fatal (listener died);
319
409
  // exit so a supervisor can restart us.
@@ -324,6 +414,55 @@ fn accept_loop(
324
414
  }
325
415
  }
326
416
 
417
+ fn poll_accept_until_shutdown<T>(
418
+ shutdown: &AtomicBool,
419
+ mut accept: impl FnMut() -> std::io::Result<T>,
420
+ ) -> std::io::Result<Option<T>> {
421
+ while !shutdown.load(Ordering::Relaxed) {
422
+ match accept() {
423
+ Ok(value) => return Ok(Some(value)),
424
+ Err(err) if err.kind() == std::io::ErrorKind::WouldBlock => {
425
+ thread::sleep(ACCEPT_POLL_INTERVAL);
426
+ }
427
+ Err(err) if err.kind() == std::io::ErrorKind::Interrupted => {}
428
+ Err(err) => return Err(err),
429
+ }
430
+ }
431
+ Ok(None)
432
+ }
433
+
434
+ fn reap_finished_handlers(handlers: &mut Vec<thread::JoinHandle<()>>) {
435
+ let mut index = 0;
436
+ while index < handlers.len() {
437
+ if handlers[index].is_finished() {
438
+ let handler = handlers.swap_remove(index);
439
+ if handler.join().is_err() {
440
+ eprintln!("running-process-broker-v2: handler thread panicked");
441
+ }
442
+ } else {
443
+ index += 1;
444
+ }
445
+ }
446
+ }
447
+
448
+ fn drain_handlers(handlers: &mut Vec<thread::JoinHandle<()>>, timeout: Duration) {
449
+ let deadline = Instant::now() + timeout;
450
+ while !handlers.is_empty() && Instant::now() < deadline {
451
+ reap_finished_handlers(handlers);
452
+ if !handlers.is_empty() {
453
+ thread::sleep(ACCEPT_POLL_INTERVAL);
454
+ }
455
+ }
456
+ reap_finished_handlers(handlers);
457
+ if !handlers.is_empty() {
458
+ eprintln!(
459
+ "running-process-broker-v2: handler drain timed out after {timeout:?}; \
460
+ detaching {} handler(s)",
461
+ handlers.len()
462
+ );
463
+ }
464
+ }
465
+
327
466
  /// One-shot accept (replaces the prior scaffold behavior; used by
328
467
  /// `--once` for tests + by the slice-3c integration test).
329
468
  fn accept_one(
@@ -643,6 +782,35 @@ mod tests {
643
782
  }
644
783
  }
645
784
 
785
+ #[test]
786
+ fn accept_poll_exits_without_accepting_after_shutdown_request() {
787
+ let shutdown = AtomicBool::new(true);
788
+ let result = poll_accept_until_shutdown(&shutdown, || -> std::io::Result<()> {
789
+ panic!("accept must not run after shutdown")
790
+ })
791
+ .unwrap();
792
+ assert!(result.is_none());
793
+ }
794
+
795
+ #[test]
796
+ fn accept_poll_observes_shutdown_while_listener_would_block() {
797
+ let shutdown = Arc::new(AtomicBool::new(false));
798
+ let setter = Arc::clone(&shutdown);
799
+ let signaler = thread::spawn(move || {
800
+ thread::sleep(ACCEPT_POLL_INTERVAL);
801
+ setter.store(true, Ordering::Relaxed);
802
+ });
803
+ let start = Instant::now();
804
+ let result = poll_accept_until_shutdown(&shutdown, || -> std::io::Result<()> {
805
+ Err(std::io::ErrorKind::WouldBlock.into())
806
+ })
807
+ .unwrap();
808
+
809
+ signaler.join().unwrap();
810
+ assert!(result.is_none());
811
+ assert!(start.elapsed() < Duration::from_secs(1));
812
+ }
813
+
646
814
  #[test]
647
815
  fn parse_cli_defaults() {
648
816
  let args = vec!["bin".to_owned()];
@@ -654,7 +822,11 @@ mod tests {
654
822
 
655
823
  #[test]
656
824
  fn parse_cli_program_arg() {
657
- let args = vec!["bin".to_owned(), "--program".to_owned(), "zccache".to_owned()];
825
+ let args = vec![
826
+ "bin".to_owned(),
827
+ "--program".to_owned(),
828
+ "zccache".to_owned(),
829
+ ];
658
830
  let opts = parse_cli(&args).unwrap();
659
831
  assert_eq!(opts.program, "zccache");
660
832
  }
@@ -742,11 +914,7 @@ mod tests {
742
914
  match reply.result {
743
915
  Some(hello_reply::Result::Refused(r)) => {
744
916
  assert_eq!(r.code, ErrorCode::ErrorVersionBlocked as i32);
745
- assert!(
746
- r.reason.contains("allow_list"),
747
- "got: {}",
748
- r.reason
749
- );
917
+ assert!(r.reason.contains("allow_list"), "got: {}", r.reason);
750
918
  }
751
919
  other => panic!("expected Refused, got {other:?}"),
752
920
  }
@@ -30,6 +30,9 @@ pub const CACHE_MANIFEST_MEDIA_TYPE: &str = "application/vnd.running-process.cac
30
30
  /// Highest manifest schema this crate understands.
31
31
  pub const SUPPORTED_MANIFEST_SCHEMA_VERSION: u32 = 1;
32
32
 
33
+ /// Test/development override for the central manifest registry directory.
34
+ pub const RUNNING_PROCESS_MANIFEST_DIR_ENV: &str = "RUNNING_PROCESS_MANIFEST_DIR";
35
+
33
36
  /// Errors returned by manifest persistence and validation.
34
37
  #[derive(Debug, thiserror::Error)]
35
38
  pub enum ManifestError {
@@ -178,7 +181,7 @@ pub fn scan_central(registry_dir: &Path) -> Vec<ManifestScanEntry> {
178
181
  /// `RUNNING_PROCESS_MANIFEST_DIR` is honored as a test/development
179
182
  /// override. Production callers should leave it unset.
180
183
  pub fn central_registry_dir() -> PathBuf {
181
- if let Some(path) = std::env::var_os("RUNNING_PROCESS_MANIFEST_DIR") {
184
+ if let Some(path) = std::env::var_os(RUNNING_PROCESS_MANIFEST_DIR_ENV) {
182
185
  return PathBuf::from(path);
183
186
  }
184
187
 
@@ -7,7 +7,10 @@
7
7
  //! responsibility is now scoped to:
8
8
  //!
9
9
  //! - holding an optional `originator` label,
10
- //! - injecting [`ORIGINATOR_ENV_VAR`] into every child the group spawns,
10
+ //! - injecting [`ORIGINATOR_ENV_VAR`] into every *contained* child the group
11
+ //! spawns, and stripping it from every *daemon* child (a daemon outlives its
12
+ //! spawner, so it must not be attributable to it — see
13
+ //! [`ContainedProcessGroup::spawn_daemon`]),
11
14
  //! - dispatching to either [`crate::spawn()`] or [`crate::spawn_daemon`].
12
15
  //!
13
16
  //! # `RUNNING_PROCESS_ORIGINATOR` environment variable
@@ -107,19 +110,111 @@ impl ContainedProcessGroup {
107
110
  /// handle list, and survives the returned [`DaemonChild`] being
108
111
  /// dropped. To terminate, call [`DaemonChild::kill`].
109
112
  ///
110
- /// The parent-child association (this group's originator env var)
111
- /// is injected into the child before the spawn so cross-process
112
- /// tracking can resolve the spawned daemon back to its parent.
113
+ /// The originator env var is deliberately **stripped**, never injected.
114
+ ///
115
+ /// A daemon outlives the process that happened to start it — that is the
116
+ /// entire point of spawning one. Tagging it `TOOL:<spawner pid>` makes it
117
+ /// indistinguishable from an abandoned descendant, so as soon as the
118
+ /// spawner exits, any originator-based reaper sees a live process whose
119
+ /// originator is dead and kills it. Build-cache daemons (zccache, sccache)
120
+ /// are the common casualty: they are started lazily by whichever compiler
121
+ /// invocation happens to run first, inherit that session's tag, and get
122
+ /// reaped when it ends — taking the warm cache down with them.
123
+ ///
124
+ /// This also restores the intent of the daemon environment policy.
125
+ /// [`crate::EnvironmentPolicy::Auto`] resolves to `UserBaseline` for
126
+ /// daemons, which rebuilds the environment from the user's login identity
127
+ /// and drops process-local variables. Explicit `command.env(...)` entries
128
+ /// are applied *last*, so injecting here silently defeated that policy for
129
+ /// this one variable.
113
130
  pub fn spawn_daemon(&self, command: &mut Command) -> Result<DaemonChild, std::io::Error> {
114
- self.inject_originator_env(command);
131
+ Self::strip_originator_env(command);
115
132
  free_spawn_daemon(command)
116
133
  }
134
+
135
+ /// Remove the originator tag from `command`. Split out from
136
+ /// [`Self::spawn_daemon`] so the policy is unit-testable without
137
+ /// spawning a real detached process.
138
+ fn strip_originator_env(command: &mut Command) {
139
+ command.env_remove(ORIGINATOR_ENV_VAR);
140
+ }
117
141
  }
118
142
 
119
143
  #[cfg(test)]
120
144
  mod tests {
121
145
  use super::*;
122
146
 
147
+ fn originator_entry(command: &Command) -> Option<Option<&std::ffi::OsStr>> {
148
+ let key = std::ffi::OsStr::new(ORIGINATOR_ENV_VAR);
149
+ command.get_envs().find(|(k, _)| *k == key).map(|(_, v)| v)
150
+ }
151
+
152
+ /// The two halves must compose: a daemon drops the originator tag *and*
153
+ /// carries the positive marker. Absence alone is ambiguous — it also
154
+ /// describes a process whose environment was clobbered — so a reaper
155
+ /// needs the declaration, not just the missing tag (clud#522).
156
+ #[test]
157
+ fn daemon_declares_itself_and_drops_the_originator_tag() {
158
+ let mut cmd = Command::new("echo");
159
+ cmd.env(ORIGINATOR_ENV_VAR, "CLUD:12345");
160
+ ContainedProcessGroup::strip_originator_env(&mut cmd);
161
+ crate::spawn::mark_as_daemon(&mut cmd);
162
+
163
+ assert_eq!(
164
+ originator_entry(&cmd),
165
+ Some(None),
166
+ "the originator tag must still be removed"
167
+ );
168
+ let marker = std::ffi::OsStr::new(crate::DAEMON_MARKER_ENV_VAR);
169
+ assert_eq!(
170
+ cmd.get_envs()
171
+ .find(|(k, _)| *k == marker)
172
+ .and_then(|(_, v)| v),
173
+ Some(std::ffi::OsStr::new("1")),
174
+ "a daemon must positively declare itself"
175
+ );
176
+ }
177
+
178
+ /// A daemon must not carry its spawner's originator tag: it outlives the
179
+ /// spawner, so the tag turns it into reaper bait the moment the spawner
180
+ /// exits. `env_remove` must win even when the caller explicitly set it.
181
+ #[test]
182
+ fn spawn_daemon_strips_originator_env() {
183
+ let mut cmd = Command::new("echo");
184
+ cmd.env(ORIGINATOR_ENV_VAR, "CLUD:12345");
185
+ ContainedProcessGroup::strip_originator_env(&mut cmd);
186
+ assert_eq!(
187
+ originator_entry(&cmd),
188
+ Some(None),
189
+ "daemon command must carry an explicit removal of {ORIGINATOR_ENV_VAR}"
190
+ );
191
+ }
192
+
193
+ /// The stripping must be unconditional — a group *with* an originator is
194
+ /// exactly the case that used to inject the tag into daemons.
195
+ #[test]
196
+ fn spawn_daemon_strips_originator_even_for_tagged_group() {
197
+ let group = ContainedProcessGroup::with_originator("CLUD").unwrap();
198
+ assert!(group.originator().is_some());
199
+ let mut cmd = Command::new("echo");
200
+ ContainedProcessGroup::strip_originator_env(&mut cmd);
201
+ assert_eq!(originator_entry(&cmd), Some(None));
202
+ }
203
+
204
+ /// Contrast: *contained* children keep the tag. That is what makes the
205
+ /// on-exit reaper able to find genuinely abandoned descendants.
206
+ #[test]
207
+ fn contained_spawn_still_injects_originator_env() {
208
+ let group = ContainedProcessGroup::with_originator("CLUD").unwrap();
209
+ let mut cmd = Command::new("echo");
210
+ group.inject_originator_env(&mut cmd);
211
+ let expected = format!("CLUD:{}", std::process::id());
212
+ assert_eq!(
213
+ originator_entry(&cmd),
214
+ Some(Some(std::ffi::OsStr::new(expected.as_str())))
215
+ );
216
+ }
217
+
123
218
  #[test]
124
219
  fn contained_process_group_creates_successfully() {
125
220
  let group = ContainedProcessGroup::new();