Skip to content

Latest commit

 

History

History
261 lines (192 loc) · 31.8 KB

File metadata and controls

261 lines (192 loc) · 31.8 KB

Жизненный цикл сессий

Этот документ задаёт продуктовую модель сессий Bria. Описание требований само по себе не подтверждает готовность реализации; актуальные проверки и ограничения зафиксированы в STATUS_AND_NEXT.md.

Основные понятия

  • Сессия - исходная сессия Codex или Claude вместе с привязкой к компьютеру, очередью входящих сообщений и данными, нужными для точного продолжения.
  • Активная сессия - выбранная сейчас в личном чате Telegram. Только её карточка является текущей.
  • Фоновая сессия - открытая, но не выбранная сейчас сессия. Она может продолжать работу.
  • Архивная сессия - закрытая сессия, которую можно попытаться точно продолжить позднее.
  • Текущая работа - один выполняющийся ответ Codex или Claude. Остановка текущей работы не равна закрытию сессии.
  • Точное продолжение - запуск именно исходной сессии средствами Codex или Claude с сохранением её собственного контекста. Создание новой сессии по пересказу истории точным продолжением не считается.
  • Время жизни - общий для всех сессий срок от открытия до автоматического закрытия: никогда, 6, 12, 24 или 48 часов.

В интерфейсе нет отдельных категорий «сессия CCBot», «сессия прежней Bria» или «сессия новой Bria». Есть только сессии Codex и сессии Claude. Способ первоначального запуска может храниться как техническое сведение, но не разделяет рабочий список или архив.

Неизменяемая принадлежность

При создании или точном продолжении сессия получает два постоянных свойства:

  1. исполнитель - Codex либо Claude;
  2. компьютер, на котором находится исходная сессия и работает её процесс.

Исполнителя нельзя заменить в течение жизни сессии. Переход с Codex на Claude или обратно означает создание другой сессии. Bria также не переносит открытую сессию на другой компьютер: после сбоя восстанавливается та же сессия на том же компьютере.

Создание новой сессии

После подтверждения компьютера, исполнителя и рабочей папки Bria сразу запускает процесс Codex или Claude. Первое сообщение для запуска не требуется.

Пока процесс запускается:

  • карточка показывает состояние запуска;
  • входящие сообщения надёжно сохраняются и остаются привязанными к этой сессии;
  • после готовности процесса сообщения передаются по порядку получения;
  • создание второй независимой сессии взамен задержавшейся не допускается.

Если на выбранном компьютере включён только один исполнитель, он выбирается автоматически. Если включены оба, пользователь выбирает исполнителя вручную. Отключённый в настройках исполнитель не предлагается, но уже созданные с ним сессии не меняют принадлежность.

Списки ноды и продолжение

Bria показывает список и архив найденных сессий Codex и Claude только для выбранной ноды независимо от того, запускались ли они через Bria, CCBot или напрямую. На первом запуске Bria находит исходные сессии на каждом подключённом компьютере без копирования внутренних данных прежних приложений и относит каждую запись к её ноде.

Рекомендации продолжить прежнюю сессию являются общей сохраняемой настройкой и по умолчанию выключены. Когда они включены, пользователь выбирает исходную сессию среди совпадений текущей ноды, исполнителя и рабочей папки. Когда выключены, создание новой сессии не показывает этот шаг.

Продолжение разрешено только как точное продолжение исходной сессии. Bria не поддерживает:

  • копии и ответвления сессии;
  • автоматическое создание новой сессии с сокращённой или полной перепиской;
  • выдачу приблизительно перенесённого контекста за восстановленную сессию;
  • функцию Очистить, которая сбрасывает контекст внутри текущей карточки.

Активная и фоновые сессии

Для каждой ноды отдельно запоминается последняя активная сессия. В текущем интерфейсе видны только открытые сессии выбранной ноды; переключение карточки или ноды не останавливает фоновую работу.

Когда фоновая сессия завершается, Bria присылает короткое уведомление и кнопку перехода. Нажатие на кнопку делает завершившуюся сессию активной и открывает её карточку с финальным ответом; ранее активная сессия становится фоновой и продолжает работу.

Активность в интерфейсе является отдельным признаком, а не состоянием процесса. Например, и активная, и фоновая сессия могут одновременно находиться в состоянии «работает».

Остановить и Закрыть

Кнопка жизненного цикла в карточке зависит от состояния:

  • Остановить доступна, пока Codex или Claude выполняет текущую работу. Она прерывает только эту работу. Сессия, её контекст, очередь и возможность отправить следующий запрос сохраняются.
  • Закрыть доступна, когда текущая работа не выполняется. Bria проверенно завершает процесс исполнителя, сохраняет историю и сведения для продолжения, затем переносит сессию в общий архив.

Сессия считается закрытой только после проверки остановки процесса и фиксации архивного состояния. Нажатие кнопки или успешный внутренний вызов сами по себе не доказывают закрытие.

Аварийное восстановление

Native-терминал живёт независимо от наблюдающего процесса Bria. Остановка бота, закрытие его stdin и временная ошибка чтения отсоединяют наблюдателя, но не посылают CLI прерывание или закрытие. Явные действия пользователя Остановить и Закрыть сохраняют отдельную семантику. Для закрытия требуется подтверждение адаптера после физического закрытия терминала, а не только EOF наблюдателя.

awaiting_recovery означает неподтверждённую привязку наблюдателя. Bria сама повторяет точное подключение: тот же компьютер, рабочая папка, logical/provider session ID, tmux socket/pane и идентичность процессов. Меняется поколение наблюдателя, не CLI. Конкурирующий владелец, несовпадение идентичности и реально закрытый терминал не дают разрешения создать замену или переотправить запрос.

Сессия и её история остаются доступны. Новые сообщения можно сохранить в очереди, но до восстановления они не отправляются CLI. Устаревшие терминальные кнопки не исполняются. При наличии автоматического восстановления ручная кнопка Восстановить не нужна; временный разрыв не добавляет сообщения об ошибке в ответ модели. Реальная причина остаётся в безопасных логах.

Принятый запрос наблюдается через observe_accepted, который несёт только его идентификатор, без текста, команды или вложений для отправки. Для Codex acceptance receipt атомарно сохраняет связь Bria message ID с native turn ID до подтверждения принятия. Только полный ограниченный scan точного журнала с явными final + complete позволяет восстановить потерянный финал. Его сохраняют у исходного запроса до перевода durable input в completed; повторная проверка после reopen не создаёт второй экземпляр. Финал начинается с новой страницы.

Если доказательства нет, оно неполно, противоречиво или не читается, unknown остаётся неизвестным. Старые receipts без turn ID не сопоставляются по тексту. Позднее доказательство можно проверить снова, в том числе после первого unknown. У Claude сохраняется прежняя проверка receipts; восстановление текста финала из native-журнала этим Codex-specific механизмом не заявляется.

Смена lifecycle инициирует обновление карточки через существующую durable доставку. Обновление фоновой сессии не выбирает её вместо той, которую уже открыл пользователь. Локальные тесты не доказывают видимый результат в установленном Telegram-сервисе.

Принятие запроса не является его завершением: main и уточняющие сообщения сохраняют accepted до настоящего terminal-события. completed фиксируется после сохранения финала; потеря наблюдения сохраняет accepted, а подтверждённые failed / interrupted не подменяются неизвестным исходом. Остановка ждёт bounded drain исполнителя и сохраняет полученное terminal-доказательство для всех сообщений.

Отдельная аварийная граница - отказ записи самого финала (например, нехватка места или исчерпание сохраняемой истории). В этом случае нет ложного completed, Ready или Archived: main и принятые уточнения остаются accepted, сессия сохраняет Running/ClosingAfterWork, следующий запрос ждёт. Bria автоматически повторяет только запись уже полученного финала через 1, 2, 4, 8, 16, 30 секунд, затем каждые 30 секунд. Запрос модели не пересылается, история не удаляется и не сокращается. Проверка точной сессии и запись выполняются атомарно; старый финал не попадёт в новый запуск. Неопределённый результат предыдущей записи не создаёт дубль.

Первая ошибка даёт одно безопасное уведомление о причине и ожидании; каждый отказ фиксируется как session.final_save / persist_failed без текста финала и путей. После успешной записи появляется одно уведомление о восстановлении, затем выполняется обычное завершение и фиксация исходов main/уточнений до открытия очереди. Постоянная ошибка требует устранения причины, автоповтор её не скрывает. При остановке Bria дальнейшие попытки записи отменяются, незавершённый принятый запрос сохраняет accepted; при следующем запуске действует автоматическое подключение и штатная проверка точного recovery без повторной отправки. Первичная запись сохраняет прежний uncancelled drain; зависший файловый ввод-вывод сам по себе не становится отменяемым. Смена привязки прекращает старый retry.

В A25 revision 6 согласовано разделение исходов очереди:

  • completed - успешный ответ сохранён, можно выполнять следующие сообщения.
  • terminal_failed - исполнитель достоверно закончил запрос с ошибкой или подтвердил остановку. Старый запрос не повторяется; очередь продолжает работу.
  • failed - прежняя или недоказанная ошибка передачи/обработки, которую нельзя автоматически считать подтверждённым завершением исполнителя.
  • unknown - исход неизвестен; автоматическая повторная отправка запрещена.

Пока остановка не подтверждена, следующие сообщения сохраняются и ожидают. После подтверждения main и его уточнения получают общий окончательный исход; очередь пробуждается после сохранения этого исхода, не только после нового ввода. Новый запрос ждёт успешной записи исходов основного запроса и всех принятых уточнений, включая уточнение с ещё незавершённым подтверждением приёма. Отказ хотя бы одной записи блокирует новый запрос; уведомление о завершении исполнителя само по себе не открывает очередь. Ошибки сохранения истории/lifecycle/вложений не превращаются в terminal_failed. Само состояние сессии Ready не доказывает, что очередь разблокирована. Если следующее сообщение уже ждало сохранения предыдущего результата, отказ сохранения не делает его отправленным: оно остаётся pending, его временная аренда освобождается. Повторно принятые или неточно сопоставленные сообщения таким способом в очередь не возвращаются.

Старые failed не переводятся массово в новую фазу. Для их восстановления, как и для unknown, нужна точная новая связь message ID/turn ID и проверенное доказательство исхода. Отсутствие данных или противоречивый журнал блокировку не снимают. Этот раздел описывает согласованное поведение; готовность revision 6 проверяется отдельно в текущем todo.

Время жизни

Время жизни задаётся одной общей сохраняемой настройкой для всех сессий. Допустимы только значения:

  • никогда не закрывать автоматически;
  • 6 часов;
  • 12 часов;
  • 24 часа;
  • 48 часов.

По умолчанию автоматическое закрытие происходит через 12 часов. Изменённое значение сохраняется и применяется ко всем новым и восстановленным сессиям.

Отсчёт начинается:

  • для новой сессии - в момент её создания;
  • для архивной сессии - заново в момент её успешного продолжения из архива.

Последующая активность, новые сообщения, переключение карточек и завершение отдельных ответов не продлевают срок.

Если время жизни закончилось в состоянии покоя, Bria закрывает сессию и переносит её в архив. Если срок закончился во время работы:

  1. текущая работа не прерывается;
  2. новые входящие сообщения для этой сессии отклоняются с понятным уведомлением;
  3. уже принятые до истечения срока сообщения не теряются;
  4. после окончания всей принятой работы Bria закрывает сессию и переносит её в архив.

Сбой процесса и восстановление

Состояние «сессия потеряна» недопустимо. До выполнения каждого действия Bria сохраняет идентификатор сессии, компьютер, исполнителя и очередь сообщений. За процессом следит локальный управляющий компонент.

Если процесс неожиданно исчез:

  • сессия переходит в состояние ожидания восстановления;
  • Bria восстанавливает ту же исходную сессию на том же компьютере;
  • новые входящие сообщения надёжно сохраняются, но не передаются неготовому процессу;
  • новая независимая сессия вместо исходной автоматически не создаётся;
  • пока сам компьютер недоступен, сессия остаётся в ожидании восстановления, а не переносится в архив и не объявляется потерянной.

Число попыток и задержки между ними являются ограниченными внутренними параметрами реализации, а не отдельным продуктовым режимом. Их следует подобрать и проверить на реальных сбоях так, чтобы сохранялись обязательные свойства: восстановление именно исходной сессии, отсутствие дублирования процесса и сообщений, сохранность очереди и понятное состояние ожидания, пока компьютер недоступен.

Ошибка продолжения из архива

Если точное продолжение завершилось ошибкой:

  • архивная сессия остаётся в архиве без изменений;
  • карточка восстановленной сессии не создаётся;
  • Bria показывает одно уведомление с причиной ошибки;
  • уведомление поясняет, что пользователь может открыть любую новую сессию и самостоятельно попросить агента восстановить контекст нужной архивной сессии.

Bria не создаёт новую сессию автоматически, не готовит перенос контекста и не отправляет историю другому агенту без явного запроса пользователя.

Таблица состояний

Состояние Что оно означает Принимает новые сообщения Допустимое следующее состояние
Запускается Процесс новой сессии создаётся на выбранном компьютере Да, в сохранённую очередь Готова, Ожидает восстановления
Продолжается Codex или Claude пытается точно открыть архивную сессию Да, в сохранённую очередь Готова, Ошибка продолжения, Ожидает восстановления
Готова Процесс работает и текущего ответа нет Да Работает, Закрывается, Ожидает восстановления
Работает Исполнитель обрабатывает один или несколько уже принятых запросов Да, пока не истёк срок Готова, Останавливается, Закрытие после работы, Ожидает восстановления
Останавливается Запрошено прерывание только текущей работы Да, в очередь Готова, Ожидает восстановления
Закрытие после работы Срок истёк, принятая работа должна закончиться перед закрытием Нет Закрывается, Ожидает восстановления
Ожидает восстановления Процесс или компьютер недоступен; сохраняется та же исходная сессия Да, в сохранённую очередь, кроме истёкшего срока Предыдущее рабочее состояние на том же компьютере
Закрывается Процесс завершается, сведения для продолжения фиксируются Нет В архиве
В архиве Сессия закрыта и доступна для попытки точного продолжения Нет Продолжается
Ошибка продолжения Последняя попытка точного продолжения не удалась; исходная запись остаётся архивной Нет В архиве

Активная и фоновая не входят в эту таблицу: это взаимно исключающие способы показа любой открытой сессии. Ошибка, после которой исходную сессию нельзя точно продолжить, также не переименовывает её в «потерянную».

Переходы и обязательные проверки

Сценарий Требуемый результат Проверка готовности
Создание После подтверждения параметров появляется одна сессия с закреплёнными компьютером и исполнителем Процесс исполнителя существует на выбранном компьютере, а сохранённая запись указывает на тот же исходный идентификатор
Сообщение во время запуска Сообщение не попадает в старую или соседнюю сессию После готовности оно ровно один раз появляется у выбранного исполнителя в правильном порядке
Остановка работы Прерывается текущий ответ, сессия остаётся открытой Процесс подтверждает прерывание; следующий запрос продолжает ту же исходную сессию
Ручное закрытие Сессия исчезает из рабочего списка и появляется в архиве своей ноды Процесс фактически завершён, архивная запись читается, история и данные точного продолжения доступны
Продолжение Открывается исходная сессия без копии и без смены исполнителя Codex или Claude подтверждает исходный идентификатор и прежний контекст; новый срок считается от успешного открытия
Ошибка продолжения Архив не изменяется и автоматического переноса нет Повторное чтение показывает прежнюю архивную запись; Telegram содержит одно понятное уведомление
Сбой процесса Восстанавливается та же сессия на том же компьютере Идентификатор и исполнитель совпадают, принятая очередь не потеряна и доставляется без нарушения порядка
Недоступность компьютера Сессия остаётся ожидающей восстановления После возврата компьютера она продолжает исходную сессию; другой компьютер не создаёт замену
Истечение срока в покое Сессия автоматически закрывается В рабочем списке её нет, процесс завершён, в архиве ровно одна запись
Истечение срока во время работы Принятая работа завершается, новые сообщения не принимаются, затем сессия закрывается Финал принятой работы сохранён; отклонённый ввод не попал в очередь; процесс завершён после работы
Переключение на завершившийся фон Фоновая сессия становится активной, прежняя активная - фоновой Открыта карточка выбранной сессии с её финалом; процессы обеих сессий не перезапущены

Для каждого перехода проверяется не только внутренний статус, но и физический результат на компьютере исполнителя и повторно прочитанное состояние Bria. Ни статус команды, ни созданный файл, ни одно уведомление в Telegram сами по себе не являются достаточной приёмкой.

Источники и границы

Решения выше приняты Артёмом в опросе по новой Bria 2 сентября 2026 года по часовому поясу Europe/Moscow. Текущие CCBot и bria-legacy используются только как источники вариантов поведения; их старые категории, автоматический выбор координатора, функция Clear и приблизительное восстановление не становятся требованиями новой Bria.

Не проверено и не заявлено как готовое:

  • фактическая поддержка точного продолжения конкретными версиями Codex и Claude;
  • механизм обнаружения внешне созданных сессий на каждой платформе;
  • ограничения и форматы внутренних хранилищ исполнителей;
  • работоспособность описанных переходов в macOS, Linux, WSL и Docker.

Эти границы требуют проверки на реальных исполнителях во время будущей реализации.