feat(task-5): scope matrix context state per room

This commit is contained in:
Mikhail Putilovskij 2026-04-19 17:41:04 +03:00
parent 03160a3b37
commit c11c8ecfbf
7 changed files with 189 additions and 72 deletions

View file

@ -32,8 +32,8 @@ class PrototypeStateStore:
self._users: dict[str, User] = {}
self._settings: dict[str, dict[str, Any]] = {}
self._saved_sessions: dict[str, list[dict[str, str]]] = {}
self._last_tokens_used: dict[str, int] = {}
self._current_session: dict[str, str] = {}
self._context_last_tokens_used: dict[str, int] = {}
self._context_current_session: dict[str, str] = {}
async def get_or_create_user(
self,
@ -82,24 +82,48 @@ class PrototypeStateStore:
safety = settings.setdefault("safety", DEFAULT_SAFETY.copy())
safety[action.payload["trigger"]] = action.payload.get("enabled", True)
async def add_saved_session(self, user_id: str, name: str) -> None:
async def add_saved_session(
self,
user_id: str,
name: str,
*,
source_context_id: str | None = None,
) -> None:
sessions = self._saved_sessions.setdefault(user_id, [])
sessions.append({"name": name, "created_at": datetime.now(UTC).isoformat()})
session = {"name": name, "created_at": datetime.now(UTC).isoformat()}
if source_context_id is not None:
session["source_context_id"] = source_context_id
sessions.append(session)
async def list_saved_sessions(self, user_id: str) -> list[dict[str, str]]:
return list(self._saved_sessions.get(user_id, []))
return [dict(session) for session in self._saved_sessions.get(user_id, [])]
async def get_last_tokens_used(self, user_id: str) -> int:
return self._last_tokens_used.get(user_id, 0)
async def get_last_tokens_used_for_context(self, context_id: str) -> int:
return self._context_last_tokens_used.get(context_id, 0)
async def set_last_tokens_used(self, user_id: str, tokens: int) -> None:
self._last_tokens_used[user_id] = tokens
async def set_last_tokens_used_for_context(self, context_id: str, tokens: int) -> None:
self._context_last_tokens_used[context_id] = tokens
async def get_current_session(self, user_id: str) -> str | None:
return self._current_session.get(user_id)
async def get_current_session_for_context(self, context_id: str) -> str | None:
return self._context_current_session.get(context_id)
async def set_current_session(self, user_id: str, name: str) -> None:
self._current_session[user_id] = name
async def set_current_session_for_context(self, context_id: str, name: str) -> None:
self._context_current_session[context_id] = name
async def clear_current_session(self, user_id: str) -> None:
self._current_session.pop(user_id, None)
async def clear_current_session_for_context(self, context_id: str) -> None:
self._context_current_session.pop(context_id, None)
async def get_last_tokens_used(self, context_id: str) -> int:
return await self.get_last_tokens_used_for_context(context_id)
async def set_last_tokens_used(self, context_id: str, tokens: int) -> None:
await self.set_last_tokens_used_for_context(context_id, tokens)
async def get_current_session(self, context_id: str) -> str | None:
return await self.get_current_session_for_context(context_id)
async def set_current_session(self, context_id: str, name: str) -> None:
await self.set_current_session_for_context(context_id, name)
async def clear_current_session(self, context_id: str) -> None:
await self.clear_current_session_for_context(context_id)

View file

@ -105,11 +105,13 @@ class RealPlatformClient(PlatformClient):
delta=event.text,
finished=False,
)
tokens_used = getattr(chat_api, "last_tokens_used", 0)
await self._prototype_state.set_last_tokens_used(str(chat_id), tokens_used)
yield MessageChunk(
message_id=user_id,
delta="",
finished=True,
tokens_used=getattr(chat_api, "last_tokens_used", 0),
tokens_used=tokens_used,
)
async def get_settings(self, user_id: str) -> UserSettings: