package session // Observer получает переходы состояния сессии. Дополняет Snapshot: снимок нужен // для метрик на тик UI, наблюдатель - чтобы хост не опрашивал стадию ради // событий, которые случаются несколько раз за сессию. // // Контракт: // - OnPhase вызывается только при изменении (стадия, число стримов или текст // ошибки), не на каждый тик; // - вызовы сериализованы: последовательность приходит из одной горутины, локи // на стороне хоста не нужны; // - реализация не должна блокировать - она стоит на пути status-тикера. // // Логи идут не сюда, а через logx.Logger из Deps: уровень задаёт вызванный // метод, второго канала для того же потока заводить незачем. type Observer interface { OnPhase(phase Phase, streams, total int, errMsg string) }