Repository navigation
Concurrent callers now share a reference-counted sleep inhibitor. A short-lived caller can release its request without cancelling another caller's active work.
API migration
Each successful prevent_sleep() now requires one matching allow_sleep(). Repeated acquisitions are no longer idempotent at the public API level. Nested and overlapping KeepAwakeGuard scopes manage their own successful references automatically.
Changes
- Add native Windows ARM64 wheels for CPython 3.11–3.14 and free-threaded 3.13/3.14.
- Preserve CPython 3.8+ support and verify free-threaded extension imports without enabling the GIL.
- Centralize interpreter-exit cleanup across all platforms, releasing all outstanding references and rejecting acquisitions after cleanup starts.
- Serialize native calls through the public Python lock and remove redundant C mutexes. Direct private extension calls are unsupported.
- Use pure Python Jeepney for Linux, with a private lazy D-Bus connection, GNOME SessionManager support, freedesktop fallback, and failure cleanup. Install the
linuxextra on Linux desktops. - Improve Windows worker startup, shutdown and handle management.
- Add a 42-configuration compatibility workflow and PyPI Trusted Publishing on GitHub Releases.
- Replace Claude-specific guidance with
AGENTS.md, reorganize documentation and remove the ad hoc build script.
Protocol tests use a private D-Bus service; real Linux desktop power-management behavior still depends on the desktop and its policy. Exit handlers do not run after forced termination or os._exit().