* feat: add idle timeout to daemon to prevent orphaned Chrome processes
The daemon persists indefinitely after browser sessions are used,
leaving orphaned Chromium processes consuming memory and CPU.
Add a configurable idle timeout (default 15 minutes) that shuts down
the daemon when no commands arrive. Resets on every incoming command,
so active sessions are unaffected.
Set AGENT_BROWSER_IDLE_TIMEOUT_MS=0 to disable (preserves old behavior).
Fixes#721
* fix: save session state before shutdown to prevent silent data loss
The shutdown() function (used by idle timeout, SIGINT, SIGTERM, SIGHUP)
previously closed the browser without saving state, unlike the explicit
`close` command which calls saveStateToFile(). This meant idle timeouts
silently destroyed cookies, localStorage, and login sessions.
Now shutdown() mirrors the close command's auto-save behavior: it calls
saveStateToFile() before manager.close(), preserving session state to
disk. This makes idle timeout functionally equivalent to an explicit
close — users returning after an idle shutdown get their state restored.
Addresses review feedback on #722 by @ctate.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Max Stoel <maxalerator@hotmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>