PR #8399 replaced preexec_fn=os.setsid with start_new_session=<bool> in
tools/environments/local.py to use CPython's thread-safe POSIX fastpath
instead of a between-fork-and-exec callback. Apply the same swap to the
other three files covered by tests/tools/test_windows_compat.py so all
Popen call sites use a consistent idiom.
Also:
- Strip a trailing-whitespace line introduced by the original PR.
- Update CONTRIBUTING.md + website/docs/developer-guide/contributing.md
to recommend start_new_session in the cross-platform process management
section.
- Fix a stale docstring reference in tools/environments/base.py (_popen_bash).
- Extend test_windows_compat.py with a parallel regression guard that
rejects bare start_new_session=True (must be gated on _IS_WINDOWS).
Scope note: this is code hygiene, not a fix for #8340 — the two forms
invoke the same setsid() syscall, so this swap alone does not change
behavior for the 'setsid ... & disown' hang scenario in that issue.
#8340 remains open.
os.setsid, os.killpg, and os.getpgid do not exist on Windows and raise
AttributeError on import or first call. This breaks the terminal tool,
code execution sandbox, process registry, and WhatsApp bridge on Windows.
Added _IS_WINDOWS platform guard in all four affected files, following
the pattern documented in CONTRIBUTING.md. On Windows, preexec_fn is
set to None and process termination falls back to proc.terminate() /
proc.kill() instead of process group signals.
Files changed:
- tools/environments/local.py (3 call sites)
- tools/process_registry.py (2 call sites)
- tools/code_execution_tool.py (3 call sites)
- gateway/platforms/whatsapp.py (3 call sites)