75 lines
2.6 KiB
Python
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()
|