You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
app_running MCP tool. Agents now check for already-open windows before app_launch — no more duplicate Firefox / foot / mousepad instances stacked across a session.
Idle session watchdog. Server-side cleanup walks the Sway tree and gracefully closes client windows after GHOSTDESK_IDLE_TIMEOUT seconds (default 30 min) of inactivity, sparing Sway / mako / wayvnc / the MCP server itself.
Ubuntu 26.04 LTS + noVNC 1.7.0 in both runtime and devcontainer images, with wayvnc / neatvnc / aml switched from master SHAs to upstream release tags (the local wayvnc-async-auth.patch is gone).
Changes
Added
app_running — walks the Sway tree and returns one entry per open client window (app, title, pid, focused). Tool count goes from 13 to 14; instructions.py and the app_launch docstring both point at it.
Idle session watchdog — when no MCP tool call has been observed for GHOSTDESK_IDLE_TIMEOUT seconds (default 1800), the server asks every client window to close gracefully via swaymsg [con_id=N] kill. Set GHOSTDESK_IDLE_TIMEOUT=0 to disable; the clock is reset on every tool invocation by middleware (mark_activity()).
GHOSTDESK_IDLE_TIMEOUT env var — operator-side, not client-side; documented in the README env-var table.
ghostdesk._sway IPC helpers — resilient socket discovery that probes swaymsg -s <sock> -t get_version against every sway-ipc.*.sock whose embedded PID resolves to a live sway process. The cached socket is invalidated on any IPC failure and rediscovered once before giving up, so the server self-heals across compositor restarts.
Changed
Ubuntu base image bumped to 26.04 LTS (was 24.04) in both docker/base/Dockerfile and .devcontainer/Dockerfile. The wayvnc / neatvnc / aml source pins still build cleanly against the new toolchain.
noVNC pinned bump 1.6.0 → 1.7.0 (NOVNC_VERSION). Brings the upstream NPM bundle ES-module conversion, improved H.264 detection, more efficient memory usage (received image data dropped after rendering), and a tab-close warning when not in view-only mode. The wayvnc workaround for VeNCrypt remains — noVNC 1.7 still does not negotiate the X509Plain/262 sub-type.
wayvnc / neatvnc / aml switched from master SHAs to release tags (WAYVNC_REF=v0.10.0, NEATVNC_REF=v1.0.0, AML_REF=v1.0.0). neatvnc 1.0.0 ships the async-auth API rework that wayvnc 0.10.0 has migrated to, so the local wayvnc-async-auth.patch is no longer needed and has been deleted along with the now-empty docker/base/patches/. The sed that strips RFB_SECURITY_TYPE_APPLE_DH from neatvnc remains.
Python deps refresh via uv lock --upgrade: starlette 0.52.1 → 1.0.0, cryptography 46.0.5 → 47.0.0, rich 14.3.3 → 15.0.0, pydantic 2.12.5 → 2.13.3, uvicorn 0.42.0 → 0.46.0, pillow 12.1.1 → 12.2.0, plus minor bumps. All transitive — 218 tests still pass. Direct pin Pillow>=10.0 → Pillow>=12.0; dev pins tightened (pytest>=9.0, pytest-asyncio>=1.3, pytest-cov>=7.0).
app_list filters out Terminal=true.desktop entries (vim, htop, …) — TUIs need a tty and don't belong in a GUI catalogue.
app_launch docstring and server instructions now direct the agent to consult app_running() first rather than relying solely on a screenshot.