From 74f12a13fcf4b2864a8e613f929823ba225a998b Mon Sep 17 00:00:00 2001 From: Mikkel Georgsen Date: Wed, 4 Feb 2026 23:28:40 +0000 Subject: [PATCH] feat(03-01): extend session metadata and PID tracking - Add idle_timeout field (default 600s) to session metadata - Add get_session_timeout() helper to SessionManager - Add pid property to ClaudeSubprocess for PID tracking - Enables lifecycle management to query timeout values and track process PIDs --- telegram/claude_subprocess.py | 10 ++++++++++ telegram/session_manager.py | 19 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/telegram/claude_subprocess.py b/telegram/claude_subprocess.py index 3e7d757..a50a646 100644 --- a/telegram/claude_subprocess.py +++ b/telegram/claude_subprocess.py @@ -113,6 +113,16 @@ class ClaudeSubprocess: """Return whether subprocess process is running.""" return self._process is not None and self._process.returncode is None + @property + def pid(self) -> Optional[int]: + """ + Return process ID of running subprocess. + + Returns: + PID if process is running, None otherwise + """ + return self._process.pid if self._process and self._process.returncode is None else None + async def start(self) -> None: """ Start the persistent Claude Code subprocess. diff --git a/telegram/session_manager.py b/telegram/session_manager.py index 57457c0..ca0ef19 100644 --- a/telegram/session_manager.py +++ b/telegram/session_manager.py @@ -162,7 +162,8 @@ class SessionManager: "last_active": now, "persona": persona, "pid": None, - "status": "idle" + "status": "idle", + "idle_timeout": 600 } self._write_metadata(name, metadata) @@ -293,6 +294,22 @@ class SessionManager: self._write_metadata(name, metadata) logger.debug(f"Updated session '{name}': {kwargs}") + def get_session_timeout(self, name: str) -> int: + """ + Get session idle timeout in seconds. + + Args: + name: Session name + + Returns: + Idle timeout in seconds (defaults to 600s if not set) + + Raises: + ValueError: If session does not exist + """ + metadata = self._read_metadata(name) + return metadata.get('idle_timeout', 600) + def session_exists(self, name: str) -> bool: """ Check if session exists.