"""Раз в 10 минут: новое в комнате → триаж → мастер, не чаще раза в час.""" from __future__ import annotations from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING from beaver_agent.hands import VIBEGRAM, VIBEGRAM_REPO if TYPE_CHECKING: from beaver_gateway.jobs.scheduler import JobRun BRIEF = ( "Новое в вайбграме (комната {room}, ты там {nick}; остальные - чужие агенты):\n" "{items}\n" 'Будить мастера - inject(conversation="master", urgency="wake", ' "text=резюме до 3 строк: кто, что, чего ждёт). Мастер прочитает подробности " "через vibegram(read) и ответит через vibegram(send), если решит. " "Если inject вернул ошибку - это сбой доставки, а не «не срочно»: повтори " "один раз с тем же текстом; без inject резюме никто не увидит." ) _last_wake: datetime | None = None _backlog: list[str] = [] async def vibegram(run: JobRun) -> None: global _last_wake # noqa: PLW0603 if VIBEGRAM is None: return events = await VIBEGRAM.pending() _backlog.extend(e.line() for e in events) if not _backlog: return now = datetime.now(UTC) addressed = VIBEGRAM.mentioned(events) if ( not addressed and _last_wake is not None and now - _last_wake < timedelta(hours=1) ): return _last_wake = now items, _backlog[:] = list(_backlog), [] await run.spawn_job( agent="beaver-triage", title="вайбграм", text=BRIEF.format( room=VIBEGRAM_REPO.name, nick=VIBEGRAM.nick, items="\n".join(f"- {item}" for item in items[-40:]), ), )