A laptop that suspends freezes every agent session until it wakes. The new
opt-in setting (App Settings > System > Power, off by default, "Only on AC
power" on by default) makes the server hold an OS sleep lock for exactly as
long as it runs:
- Linux: a logind block lock on handle-lid-switch:sleep:idle through
systemd-inhibit. The lid needs the low-level handle-lid-switch lock
(LidSwitchIgnoreInhibited=yes ignores a plain sleep lock), and polkit grants
it only while someone is logged in to the desktop, so a refusal is reported
as "denied" and retried every minute.
- macOS: caffeinate -i -s -w <pid>. Lid close needs pmset disablesleep, which
an optional root helper (scripts/keep-awake-macos.sh, a LaunchDaemon run
from a root-owned copy) applies while the server keeps a fresh request
file, undoing only a disablesleep it set itself.
The lock dies with the server: systemd-inhibit runs cat on a stdin pipe, so
any exit (SIGKILL included, and under the unit's KillMode=process) releases
it; caffeinate exits with the pid it watches.
The installer asks on laptops (default no, never under --yes), and
`install.sh keep-awake` turns it on for an existing install. Status is at
GET /api/system/keep-awake; a non-admin's value is dropped in multi-user mode.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>