Add session persistence: auto-save, load on startup, graceful shutdown
This commit is contained in:
@@ -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 ───────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user