Add session persistence: auto-save, load on startup, graceful shutdown

This commit is contained in:
Alexander Whitestone
2026-04-12 20:58:10 -04:00
parent 00ebe92bd3
commit 960c2248be

View File

@@ -23,6 +23,7 @@ Evennia commands call the bridge to get Timmy's responses.
import json
import time
import threading
import signal
import hashlib
import os
import sys
@@ -55,6 +56,7 @@ BRIDGE_PORT = int(os.environ.get('TIMMY_BRIDGE_PORT', 4004))
BRIDGE_HOST = os.environ.get('TIMMY_BRIDGE_HOST', '127.0.0.1')
HERMES_PATH = os.path.expanduser('~/.hermes/hermes-agent')
WORLD_DIR = Path(os.path.expanduser('~/.timmy/evennia/timmy_world'))
SESSIONS_FILE = WORLD_DIR / 'bridge_sessions.json'
# ── Crisis Protocol ────────────────────────────────────────────────────
@@ -506,6 +508,58 @@ class SessionManager:
with self._lock:
return len(self.sessions)
def save_sessions(self) -> int:
"""Save all active sessions to JSON file. Returns count saved."""
with self._lock:
data = {
"saved_at": datetime.now().isoformat(),
"sessions": {}
}
for uid, session in self.sessions.items():
data["sessions"][uid] = {
"user_id": session.user_id,
"username": session.username,
"room": session.room,
"messages": session.messages,
"created_at": session.created_at,
"last_active": session.last_active,
}
SESSIONS_FILE.parent.mkdir(parents=True, exist_ok=True)
SESSIONS_FILE.write_text(json.dumps(data, indent=2))
count = len(data["sessions"])
if count > 0:
print(f"[SessionManager] Saved {count} sessions to {SESSIONS_FILE}")
return count
def load_sessions(self) -> int:
"""Load sessions from JSON file. Returns count loaded."""
if not SESSIONS_FILE.exists():
return 0
try:
data = json.loads(SESSIONS_FILE.read_text())
sessions_data = data.get("sessions", {})
loaded = 0
with self._lock:
for uid, sdata in sessions_data.items():
if len(self.sessions) >= self.max_sessions:
break
session = UserSession(
sdata["user_id"],
sdata["username"],
sdata.get("room", "The Threshold"),
)
session.messages = sdata.get("messages", [])
session.created_at = sdata.get("created_at", session.created_at)
session.last_active = sdata.get("last_active", time.time())
self.sessions[uid] = session
loaded += 1
if loaded > 0:
print(f"[SessionManager] Loaded {loaded} sessions from {SESSIONS_FILE}")
return loaded
except Exception as e:
print(f"[SessionManager] Failed to load sessions: {e}")
return 0
# ── HTTP API ───────────────────────────────────────────────────────────