Files
XCClaw/app/services/persistent_session.py

75 lines
2.6 KiB
Python

from datetime import datetime
from app.models.session import PersistentSession
from app.services.opencode_client import opencode_client
from app.services.storage import storage
from app.core.logging import logger
PERSISTENT_KEY = "persistent_sessions"
class PersistentSessionManager:
def __init__(self):
self._sessions: dict[str, PersistentSession] = {}
def load(self):
data = storage.load(PERSISTENT_KEY, {})
if isinstance(data, dict):
for k, v in data.items():
self._sessions[k] = PersistentSession(**v)
logger.info(f"Loaded {len(self._sessions)} persistent sessions")
def save(self):
data = {k: v.model_dump() for k, v in self._sessions.items()}
storage.save(PERSISTENT_KEY, data)
async def create_session(self, name: str | None = None) -> PersistentSession:
session = await opencode_client.create_session(
title=name or "Persistent Session"
)
ps = PersistentSession(
id=session["id"],
session_id=session["id"],
name=name or f"Session {session['id'][:8]}",
created_at=datetime.now(),
last_used_at=datetime.now(),
)
self._sessions[ps.id] = ps
self.save()
logger.info(f"Created persistent session: {ps.id}")
return ps
async def delete_session(self, session_id: str) -> bool:
ps = self._sessions.get(session_id)
if not ps:
return False
await opencode_client.delete_session(ps.session_id)
del self._sessions[session_id]
self.save()
logger.info(f"Deleted persistent session: {session_id}")
return True
async def send_message(self, session_id: str, text: str) -> dict:
ps = self._sessions.get(session_id)
if not ps:
raise ValueError(f"Persistent session {session_id} not found")
ps.last_used_at = datetime.now()
self.save()
return await opencode_client.send_message(ps.session_id, text)
async def send_message_async(self, session_id: str, text: str):
ps = self._sessions.get(session_id)
if not ps:
raise ValueError(f"Persistent session {session_id} not found")
ps.last_used_at = datetime.now()
self.save()
await opencode_client.send_message_async(ps.session_id, text)
def get_session(self, session_id: str) -> PersistentSession | None:
return self._sessions.get(session_id)
def list_sessions(self) -> list[PersistentSession]:
return list(self._sessions.values())
persistent_session_manager = PersistentSessionManager()