Serialize Matrix chat sends
This commit is contained in:
parent
4533118b68
commit
17d580096b
4 changed files with 281 additions and 79 deletions
|
|
@ -21,17 +21,12 @@ from adapter.matrix.converter import from_room_event
|
|||
from adapter.matrix.handlers import register_matrix_handlers
|
||||
from adapter.matrix.handlers.context_commands import (
|
||||
LOAD_PROMPT,
|
||||
SAVE_PROMPT,
|
||||
_call_reset_endpoint,
|
||||
_sanitize_session_name,
|
||||
)
|
||||
from adapter.matrix.handlers.auth import handle_invite
|
||||
from adapter.matrix.handlers.auth import handle_invite, provision_workspace_chat
|
||||
from adapter.matrix.room_router import resolve_chat_id
|
||||
from adapter.matrix.store import (
|
||||
clear_load_pending,
|
||||
clear_reset_pending,
|
||||
get_load_pending,
|
||||
get_reset_pending,
|
||||
get_room_meta,
|
||||
set_pending_confirm,
|
||||
)
|
||||
|
|
@ -153,11 +148,12 @@ class MatrixBot:
|
|||
await self._send_all(room.room_id, outgoing)
|
||||
return
|
||||
|
||||
reset_pending = await get_reset_pending(self.runtime.store, sender, room.room_id)
|
||||
if reset_pending is not None and (body in {"!yes", "!no"} or body.startswith("!save ")):
|
||||
outgoing = await self._handle_reset_selection(sender, room.room_id, body)
|
||||
await self._send_all(room.room_id, outgoing)
|
||||
return
|
||||
room_meta = await get_room_meta(self.runtime.store, room.room_id)
|
||||
if room_meta is None:
|
||||
outgoing = await self._bootstrap_unregistered_room(room, sender)
|
||||
if outgoing:
|
||||
await self._send_all(room.room_id, outgoing)
|
||||
return
|
||||
|
||||
chat_id = await resolve_chat_id(self.runtime.store, room.room_id, sender)
|
||||
incoming = from_room_event(event, room_id=room.room_id, chat_id=chat_id)
|
||||
|
|
@ -181,6 +177,57 @@ class MatrixBot:
|
|||
]
|
||||
await self._send_all(room.room_id, outgoing)
|
||||
|
||||
async def _bootstrap_unregistered_room(
|
||||
self,
|
||||
room: MatrixRoom,
|
||||
sender: str,
|
||||
) -> list[OutgoingEvent] | None:
|
||||
if not hasattr(self.client, "room_create") or not hasattr(self.client, "room_put_state"):
|
||||
return None
|
||||
display_name = getattr(room, "display_name", None) or sender
|
||||
try:
|
||||
created = await provision_workspace_chat(
|
||||
self.client,
|
||||
sender,
|
||||
display_name,
|
||||
self.runtime.platform,
|
||||
self.runtime.store,
|
||||
self.runtime.auth_mgr,
|
||||
self.runtime.chat_mgr,
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.warning(
|
||||
"matrix_unregistered_room_bootstrap_failed",
|
||||
room_id=room.room_id,
|
||||
sender=sender,
|
||||
error=str(exc),
|
||||
)
|
||||
return [
|
||||
OutgoingMessage(
|
||||
chat_id=room.room_id,
|
||||
text="Не удалось подготовить рабочий чат. Попробуйте ещё раз позже.",
|
||||
)
|
||||
]
|
||||
|
||||
welcome = (
|
||||
f"Привет, {created['user'].display_name or sender}! Пиши — я здесь.\n\n"
|
||||
"Команды: !new · !chats · !rename · !archive · !context · !save · !load · !help"
|
||||
)
|
||||
await self.client.room_send(
|
||||
created["chat_room_id"],
|
||||
"m.room.message",
|
||||
{"msgtype": "m.text", "body": welcome},
|
||||
)
|
||||
return [
|
||||
OutgoingMessage(
|
||||
chat_id=room.room_id,
|
||||
text=(
|
||||
f"Создал рабочий чат {created['room_name']} ({created['chat_id']}) "
|
||||
"и добавил его в пространство Lambda. Открой приглашённую комнату для продолжения."
|
||||
),
|
||||
)
|
||||
]
|
||||
|
||||
async def _handle_load_selection(
|
||||
self,
|
||||
user_id: str,
|
||||
|
|
@ -217,45 +264,7 @@ class MatrixBot:
|
|||
except Exception as exc:
|
||||
logger.warning("load_agent_call_failed", error=str(exc))
|
||||
return [OutgoingMessage(chat_id=room_id, text=f"Ошибка при загрузке: {exc}")]
|
||||
return [OutgoingMessage(chat_id=room_id, text=f"Загрузка: {name}")]
|
||||
|
||||
async def _handle_reset_selection(
|
||||
self,
|
||||
user_id: str,
|
||||
room_id: str,
|
||||
text: str,
|
||||
) -> list[OutgoingEvent]:
|
||||
agent_base_url = os.environ.get("AGENT_BASE_URL", "http://127.0.0.1:8000")
|
||||
prototype_state = getattr(self.runtime.platform, "_prototype_state", None)
|
||||
await clear_reset_pending(self.runtime.store, user_id, room_id)
|
||||
|
||||
if text == "!no":
|
||||
return [OutgoingMessage(chat_id=room_id, text="Отменено.")]
|
||||
|
||||
if text.startswith("!save "):
|
||||
name = _sanitize_session_name(text[len("!save ") :].strip())
|
||||
if name is None:
|
||||
return [
|
||||
OutgoingMessage(
|
||||
chat_id=room_id,
|
||||
text="Имя сохранения может содержать только буквы, цифры, _ и -.",
|
||||
)
|
||||
]
|
||||
try:
|
||||
await self.runtime.platform.send_message(
|
||||
user_id,
|
||||
room_id,
|
||||
SAVE_PROMPT.format(name=name),
|
||||
)
|
||||
if prototype_state is not None:
|
||||
await prototype_state.add_saved_session(user_id, name)
|
||||
except Exception as exc:
|
||||
logger.warning("save_before_reset_failed", error=str(exc))
|
||||
return [OutgoingMessage(chat_id=room_id, text=f"Ошибка при сохранении: {exc}")]
|
||||
|
||||
if prototype_state is not None:
|
||||
await prototype_state.clear_current_session(user_id)
|
||||
return await _call_reset_endpoint(agent_base_url, room_id)
|
||||
return [OutgoingMessage(chat_id=room_id, text=f"Запрос на загрузку отправлен агенту: {name}")]
|
||||
|
||||
async def on_member(self, room: MatrixRoom, event: RoomMemberEvent) -> None:
|
||||
if getattr(event, "sender", None) == self.client.user_id:
|
||||
|
|
@ -373,12 +382,11 @@ async def main() -> None:
|
|||
request_timeout=client_config.request_timeout,
|
||||
)
|
||||
try:
|
||||
if isinstance(runtime.platform, RealPlatformClient):
|
||||
await runtime.platform.agent_api.connect()
|
||||
await client.sync_forever(timeout=30000, since=since_token)
|
||||
finally:
|
||||
if isinstance(runtime.platform, RealPlatformClient):
|
||||
await runtime.platform.agent_api.close()
|
||||
close = getattr(runtime.platform, "close", None)
|
||||
if callable(close):
|
||||
await close()
|
||||
await client.close()
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue