сеансов
VibeOS автоматически сохраняет каждый разговор как сеанс. Сеансы позволяют возобновлять разговоры, осуществлять поиск между сеансами и полностью управлять историей разговоров.
Как работают сеансы
Каждый разговор — будь то из CLI, Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Teams или любой другой платформы обмена сообщениями — сохраняется как сеанс с полной историей сообщений. Сессии отслеживаются в:
- База данных SQLite (
~/.vibeos/state.db) — структурированные метаданные сеанса с полнотекстовым поиском FTS5, а также полная история сообщений.
В базе данных SQLite хранятся:
- Идентификатор сеанса, исходная платформа, идентификатор пользователя.
- Название сеанса (уникальное, удобочитаемое имя)
- Название модели и конфигурация
- Снимок системного приглашения
- Полная история сообщений (роль, контент, вызовы инструментов, результаты инструментов)
- Подсчет токенов (ввод/вывод)
- Временные метки (начало_в, окончание_в)
- Идентификатор родительского сеанса (для явных веток и исторических сеансов-продолжений)
- Метаданные рабочего каталога (
cwd, ветка git/корень репо), если они известны. - Идентификатор зарегистрированного проекта, если сессия к нему подтверждённо привязана
Проекты и папки не являются изоляцией сеанса
Идентичностью сеанса является его идентификатор сеанса в SQLite (а на платформах обмена сообщениями — сеансовый ключ шлюза, указывающий на этот идентификатор). Папка или проект, связанный с чатом, представляет собой метаданные и контекст инструмента, а не пространство имён расшифровок. Подтверждённый зарегистрированный проект также задаёт границу по умолчанию для проактивного вызова памяти и session_search; он никогда не объединяет расшифровки и не меняет идентичность сессии:
- Рабочий стол / TUI — на боковой панели «Проекты» чаты группируются по сохраненному корню
cwd/ git, чтобы вы могли найти работу по репозиторию. Наведите указатель мыши на строку боковой панели, чтобы увидеть сохраненный путь. Два чата в одной папке остаются отдельными расшифровками. - CLI — инструменты обычно запускаются из рабочего каталога процесса; Возобновить можно
chdirк сохраненномуcwd. - Шлюз обмена сообщениями — обычно чаты используют
terminal.cwdиз конфигурации; закрепление сессии за проектом может вместо этого задать task-local каталог именно для этого разговора. У разных разговоров всегда остаются разные сеансовые ключи и расшифровки.
Если команда инструмента «выглядит так, как будто она взята из другого проекта», проверьте сохранённый cwd/проект сессии и не указан ли в результате поиска scope="all". Это никогда не означает, что две расшифровки были объединены.
Архивирование скрывает сессию или проект из обычного списка, но сохраняет расшифровку и историю проекта. Явный запрос к памяти всё ещё может найти эту работу. Удаление сессии убирает её сообщения из локальной базы, поэтому вспомнить их уже нельзя.
Приложение для ПК сохраняет кратковременный идентификатор сеанса время выполнения (для событий шлюза в реальном времени) и постоянный сохраняемый идентификатор сеанса (идентификатор SQLite/URL). Совершенно новый чат сразу получает идентификатор среды выполнения; сохраненный идентификатор появляется после сохранения первого хода. Такое разделение нормально — это не два отдельных разговора.
Что имеет значение для контекста
VibeOS сохраняет историю сеансов, поэтому может возобновить разговоры, но не продолжайте повторно отправлять каждый байт, который он когда-либо обрабатывал. На каждом ходу модель видит выбранное системное приглашение, текущее окно разговора и любой контент VibeOS явно внедряет этот ход.
Вложения мультимедиа обрабатываются как входные данные с пошаговой областью действия:
- Изображения могут быть изначально прикреплены к следующему вызову модели или предварительно проанализированы в текстовое описание, если активная модель не поддерживает собственное зрение.
- Аудио транскрибируется в текст, если настроено преобразование речи в текст.
- Текстовые документы могут включать извлеченный текст; другие типы документов обычно представлены сохраненным локальным путем и короткой заметкой.
- Пути вложений и извлеченный/производный текст могут отображаться в расшифровке, но байты необработанного изображения, аудио или двоичного файла не копируются повторно в будущие подсказки.
Например, если пользователь отправляет изображение и просит VibeOS сделать из него мем, VibeOS может один раз проверить это изображение с помощью зрения и запустить обработку изображения. сценарий. Будущие повороты не переносят автоматически исходный JPEG в контекст. Они несут только то, что было написано в разговоре, например, сообщения пользователя. запрос, краткое описание изображения, путь к локальному кешу или последний помощник ответ.
Наиболее распространенной причиной роста контекста является не сам медиафайл. Это подробный текст: вставленные расшифровки, полные журналы, большие выходные данные инструмента, длинные различия, повторяющиеся отчеты о состоянии и подробные дампы доказательств. Предпочитаю резюме, файл пути, целевые фрагменты и поиск с помощью инструментов при копировании больших артефактов. в чат.
Используйте /compress, когда сеанс становится длинным, /new для нового потока и
vibeos sessions prune только в том случае, если вы хотите удалить старые завершенные сеансы из
хранилище. Сжатие уменьшает активный контекст; это не удаление конфиденциальности.
Передайте имя /new (например, /new payments-refactor), чтобы установить имя нового сеанса.
первоначальное название заранее — полезно, чтобы найти его позже с помощью /resume <name>или в средстве выбора/sessions`.
Источники сеансов
Каждый сеанс помечен своей исходной платформой:
| Источник | Описание |
|---|---|
cli | Интерактивный CLI (vibeos или vibeos chat) |
telegram | Telegram |
discord | Discord (сервер / DM) |
slack | Slack workspace |
whatsapp | |
signal | Signal |
matrix | Matrix (комнаты и DM) |
mattermost | Mattermost |
email | Email (IMAP/SMTP) |
sms | SMS через Twilio |
dingtalk | DingTalk |
feishu | Feishu/Lark |
wecom | WeCom (WeChat Work) |
weixin | Weixin (личный WeChat) |
bluebubbles | Apple iMessage через BlueBubbles на macOS |
qqbot | QQ Bot (Tencent QQ) через официальный API v2 |
homeassistant | Home Assistant conversation |
webhook | Входящие вебхуки |
api-server | API-запросы к серверу |
acp | Интеграция редактора ACP |
cron | Запланированные задания cron |
batch | Пакетная обработка выполняется |
Возобновление сеанса CLI
Возобновите предыдущие разговоры из CLI, используя --continue или --resume:
Продолжить последний сеанс
# Resume the most recent CLI session
vibeos --continue
vibeos -c
# Or with the chat subcommand
vibeos chat --continue
vibeos chat -c
При этом выполняется поиск самого последнего сеанса cli в базе данных SQLite и загружается его полная история разговоров.
Резюме по имени
Если вы дали сеансу название (см. Именование сеанса ниже), вы можете возобновить его по имени:
# Resume a named session
vibeos -c "my project"
# If there are lineage variants (my project, my project #2, my project #3),
# this automatically resumes the most recent one
vibeos -c "my project" # → resumes "my project #3"
Возобновить конкретный сеанс
# Resume a specific session by ID
vibeos --resume 20250305_091523_a1b2c3d4
vibeos -r 20250305_091523_a1b2c3d4
# Resume by title
vibeos --resume "refactoring auth"
# Or with the chat subcommand
vibeos chat --resume 20250305_091523_a1b2c3d4
Идентификаторы сеансов отображаются при выходе из сеанса CLI и могут быть найдены с помощью vibeos sessions list.
Резюме разговора при возобновлении
При возобновлении сеанса VibeOS отображает компактное изложение предыдущего разговора на стилизованной панели перед приглашением ввода:
В режиме возобновления отображается компактная панель резюме с последними обращениями пользователя и помощника, прежде чем вернуться к интерактивной подсказке.
Резюме:
- Показывает сообщения пользователя (золотой
●) и ответы помощника (зеленый◆). - Обрезает длинные сообщения (300 символов для пользователя, 200 символов/3 строки для помощника).
- Сворачивает вызовы инструментов до количества с именами инструментов (например,
[3 tool calls: terminal, web_search]) - Скрывает системные сообщения, результаты работы инструментов и внутренние рассуждения.
- Капс при последних 10 обменах с индикатором "...N предыдущих сообщений..." – Использует тусклый стиль, чтобы отличить его от активного разговора.
Чтобы отключить повторение и сохранить минимальное однострочное поведение, установите в ~/.vibeos/config.yaml:
display:
resume_display: minimal # default: full
Идентификаторы сеансов имеют формат YYYYMMDD_HHMMSS_<hex> — в сеансах CLI/TUI используется шестнадцатеричный суффикс из 6 символов (например, 20250305_091523_a1b2c3), в сеансах шлюза используется 8-значный суффикс (например, 20250305_091523_a1b2c3d4). Вы можете возобновить работу по идентификатору (полный или уникальный префикс) или по названию — оба варианта работают с -cи-r`.
Межплатформенная передача управления
Используйте /handoff <platform>` из сеанса CLI, чтобы перенести живую беседу на домашний канал платформы обмена сообщениями. Агент начинает именно с того места, на котором остановился CLI — тот же идентификатор сеанса, полная расшифровка с учетом ролей, вызовы инструментов и все такое.
# Inside a CLI session
/handoff telegram
Что происходит:
- Интерфейс командной строки проверяет, включен ли
<platform> и установлен ли домашний канал (запустите/sethome` из чата назначения один раз, чтобы настроить его). - Интерфейс командной строки отмечает ожидающий сеанс и блокирует шлюз. Он отказывается, если агент находится в середине хода — дождитесь завершения текущего ответа первым.
- Наблюдатель шлюза заявляет о передаче обслуживания и запрашивает у адаптера назначения новый поток:
- Telegram — открывает новую тему форума (темы в DM, если в чате включен режим тем Bot API 9.4+, или тему супергруппы форума).
- Discord — создает 1440-минутную ветку автоматического архивирования под домашним текстовым каналом.
- Slack — публикует начальное сообщение и использует его
tsв качестве привязки потока. - WhatsApp/Signal/Matrix/SMS — нет собственных тредов, возвращается напрямую на домашний канал.
-
Шлюз повторно привязывает ключ назначения к существующему идентификатору сеанса CLI, а затем формирует синтетическую очередь пользователя с просьбой к агенту подтвердить и подвести итоги. Ответ попадает в новую тему.
-
Когда шлюз подтверждает успех, CLI печатает подсказку
/resumeи корректно завершает работу:↻ Handoff complete. The session is now active on telegram.
Resume it on this CLI later with: /resume my-session-title -
С этого момента разговор продолжается на платформе. Ответ в новом потоке — любой, кто авторизован в этом канале, использует один и тот же сеанс, и любое более позднее сообщение реального пользователя в потоке легко присоединяется, поскольку ключ сеанса потока без
user_id.
Возврат в CLI: если вы хотите вернуться на рабочий стол, просто запустите /resume <title> (или vibeos -r "<title>"` из оболочки) и продолжите с того места, где остановилась платформа.
Режимы отказа:
- Домашний канал не настроен → CLI отказывается с подсказкой
/sethome. - Платформа не включена / шлюз не работает → время ожидания CLI истекает через 60 секунд с четким сообщением, и ваш сеанс CLI остается нетронутым.
- Не удалось создать тему (разрешения, режим тем отключены) → происходит прямой возврат к домашнему каналу и все равно завершается; нет изоляции потоков, но сама передача обслуживания работает.
adapter.sendне удалось (ограничение скорости, временная ошибка API) → передача обслуживания отмечена как неудачная с указанием причины; строка очищается, и вы можете повторить попытку.
Ограничение, о котором стоит знать: для платформ без поддержки потоков с домашними каналами многопользовательских групп синтетические ключи под ключ в виде сеанса в стиле DM. Это работает для домашних каналов с самостоятельным DM (типичная настройка), но не идеально для групповых чатов с общим доступом. Поточность охватывает Telegram/Discord/Slack — безусловно, распространенный случай — поэтому большинство настроек никогда не достигают этого.
Именование сеанса
Дайте сеансам удобочитаемые названия, чтобы вы могли легко их найти и возобновить.
Автоматически созданные заголовки
VibeOS автоматически генерирует краткий описательный заголовок (3–7 слов) для каждого сеанса после первого обмена сообщениями. Это выполняется в фоновом потоке с использованием быстрой вспомогательной модели, поэтому задержка не увеличивается. Вы увидите автоматически сгенерированные заголовки при просмотре сеансов с vibeos sessions list или vibeos sessions browse.
Автоматическое присвоение титров срабатывает только один раз за сеанс и пропускается, если вы уже установили заголовок вручную.
Установка заголовка вручную
Используйте slash-команду /title внутри любого сеанса чата (CLI или шлюза):
/title my research project
Название применяется немедленно. Если сеанс еще не создан в базе данных (например, вы запустили /title перед отправкой первого сообщения), он ставится в очередь и применяется после запуска сеанса.
Вы также можете переименовать существующие сеансы из командной строки:
vibeos sessions rename 20250305_091523_a1b2c3d4 "refactoring auth module"
Правила титулов
- Уникальный — никакие две сессии не могут иметь одно и то же название.
- Макс. 100 символов – обеспечивает чистоту вывода списка.
- Санизировано — управляющие символы, символы нулевой ширины и переопределения RTL удаляются автоматически.
- Обычный Юникод подойдет — смайлы, CJK, символы с диакритическими знаками работают.
Сжатие и продолжения
Когда контекст сеанса сжимается (вручную с помощью /compress или автоматически), VibeOS уменьшает активный контекст внутри того же разговора: чат, заголовок, цель, маршрут Desktop и ветка сообщений остаются на месте.
Старые версии VibeOS и явные сценарии продолжения всё ещё могут создавать варианты одной линии. Например, при подготовленном handoff заголовки могут быть пронумерованы:
"my project" → "my project #2" → "my project #3"
Когда вы возобновляете сеанс по имени (vibeos -c "my project"), он понимает эти исторические варианты линии и выбирает последний подходящий сеанс.
/branch отличается от сжатия: он намеренно создаёт дочернюю сессию с копией расшифровки. Дочерняя сессия сохраняет рабочий каталог и подтверждённую проектную привязку родителя, поэтому обычный вызов памяти остаётся в том же проекте без догадок по тексту запроса.
/title на платформах обмена сообщениями
Команда /title работает на всех платформах шлюзов (Telegram, Discord, Slack, WhatsApp):
/title My Research— установить заголовок сессии/title— показать текущий заголовок
Команды управления сеансом
VibeOS предоставляет полный набор команд управления сеансом через vibeos sessions:
Получение списка сеансов
# List recent sessions (default: last 20)
vibeos sessions list
# Filter by platform
vibeos sessions list --source telegram
# Show more sessions
vibeos sessions list --limit 50
Если сеансы имеют заголовки, в выходных данных отображаются заголовки, предварительный просмотр и относительные метки времени:
Title Preview Last Active ID
────────────────────────────────────────────────────────────────────────────────────────────────
refactoring auth Help me refactor the auth module please 2h ago 20250305_091523_a
my project #3 Can you check the test failures? yesterday 20250304_143022_e
— What's the weather in Las Vegas? 3d ago 20250303_101500_f
Если ни у одного сеанса нет заголовков, используется более простой формат:
Preview Last Active Src ID
──────────────────────────────────────────────────────────────────────────────────────
Help me refactor the auth module please 2h ago cli 20250305_091523_a
What's the weather in Las Vegas? 3d ago tele 20250303_101500_f
Экспорт сеансов
# Export all sessions to a JSONL file
vibeos sessions export backup.jsonl
# Export sessions from a specific platform
vibeos sessions export telegram-history.jsonl --source telegram
# Export a single session
vibeos sessions export session.jsonl --session-id 20250305_091523_a1b2c3d4
Экспортированные файлы содержат по одному объекту JSON в строке с полными метаданными сеанса и всеми сообщениями.
Удалить сеанс
# Delete a specific session (with confirmation)
vibeos sessions delete 20250305_091523_a1b2c3d4
# Delete without confirmation
vibeos sessions delete 20250305_091523_a1b2c3d4 --yes
Переименование сеанса
# Set or change a session's title
vibeos sessions rename 20250305_091523_a1b2c3d4 "debugging auth flow"
# Multi-word titles don't need quotes in the CLI
vibeos sessions rename 20250305_091523_a1b2c3d4 debugging auth flow
Если заголовок уже используется другим сеансом, отображается ошибка.
Удаление старых сессий
# Delete ended sessions older than 90 days (default)
vibeos sessions prune
# Custom age threshold
vibeos sessions prune --older-than 30
# Only prune sessions from a specific platform
vibeos sessions prune --source telegram --older-than 60
# Skip confirmation
vibeos sessions prune --older-than 30 --yes
При сокращении удаляются только завершённые, неархивированные сеансы (сеансы, которые были явно завершены или были автоматически сброшены). Активные и архивированные сеансы никогда не удаляются; архивный сеанс удаляется только явной командой, когда он больше не нужен.
Статистика сеансов
vibeos sessions stats
Выход:
Total sessions: 142
Total messages: 3847
cli: 89 sessions
telegram: 38 sessions
discord: 15 sessions
Database size: 12.4 MB
Для более глубокого анализа — использования токенов, оценки затрат, разбивки инструментов и моделей активности — используйте vibeos insights.
Инструмент поиска сеансов
Агент имеет встроенный инструмент session_search, который выполняет полнотекстовый поиск по прошлым разговорам с использованием SQLite FTS5 и позволяет прокручивать любой найденный сеанс. Если у активной сессии есть подтверждённый проект, обнаружение и просмотр по умолчанию ограничены этим проектом; непривязанная сессия ищет по профилю. Когда вы явно называете другой проект, просите сравнить проекты или локальный результат не может содержать нужную историю, агент сам может использовать scope="all", не заставляя вас повторять область поиска. В шлюзе обмена сообщениями обе области дополнительно ограничены сессиями запросившего пользователя. Никаких вызовов LLM, никакого обобщения, никакого усечения. Каждая форма возвращает фактические сообщения из БД.
Три призывающие фигуры
Инструмент определяет, что вы хотите, исходя из заданных вами аргументов. Параметр mode отсутствует.
1. Открытие — пройти query:
session_search(query="auth refactor", limit=3)
Запускает FTS5, выполняет дедупликацию обращений по линии сеанса, возвращает N первых сеансов. Каждый результат несет в себе:
session_id,title,when,sourcesnippet— отрывок матча, выделенный FTS5bookend_start— первые 3 сообщения пользователя+помощника сеанса (цель/начальный удар)messages— ±5 сообщений вокруг совпадения FTS5 с помеченным якорным сообщением (попадание в контекст)bookend_end— последние 3 сообщения пользователя+помощника сеанса (резолюция/решения)match_message_id,messages_before,messages_after
Подставки для книг + окно вместе восстанавливают цель → совпадение → разрешение, не платя за всю стенограмму. Типичное время ожидания: 15–50 мс в реальной сеансовой базе данных.
2. Прокрутите — введите session_id + around_message_id:
session_search(session_id="20260510_174648_805cc2", around_message_id=590803, window=10)
Возвращает окно сообщений ±window, центрированное по якорю. Никаких FTS5, никаких подставок для книг — только кусочек. Используйте после вызова обнаружения, когда вам нужно больше контекста, чем окно по умолчанию ±5.
- Чтобы прокрутить вперед: передайте
messages[-1].idназад какaround_message_id. - Чтобы прокрутить назад: передайте
messages[0].idназад какaround_message_id. - Сообщение о границе появляется в обоих окнах как маркер ориентации.
- Когда
messages_beforeилиmessages_afterменьшеwindow, вы находитесь в начале или конце сеанса.
Типичное время ожидания: 1–2 мс на вызов прокрутки.
3. Просмотр — без аргументов:
session_search()
Возвращает последние сеансы в хронологическом порядке (заголовки, превью, временные метки). Полезно, когда пользователь спрашивает «над чем я работал», не называя тему.
Чтобы искать по всему профилю, а не только по активному проекту:
session_search(query="auth refactor", scope="all")
Синтаксис запроса FTS5
Режим ключевых слов поддерживает стандартный синтаксис запросов FTS5:
- Простые ключевые слова:
docker deployment(по умолчанию в FTS5 установлено AND) - Фразы:
"exact phrase" - Логическое значение:
docker OR kubernetes,python NOT java. - Префикс:
deploy*
Необязательные параметры
sort—newestилиoldest, на вершине рейтинга FTS5. Опустите для упорядочивания только по релевантности (по умолчанию; подходит для исследовательского отзыва). Используйтеnewestдля вопросов «где мы оставили X»,oldestдля вопросов «как началось X».role_filter— включаемые роли, разделенные запятыми. По умолчанию для обнаружения установлено значениеuser,assistant(выходные данные инструмента обычно представляют собой шум). Передайтеuser,assistant,tool, чтобы включить выходные данные инструмента (поведение инструмента отладки) илиtool, чтобы включить только выходные данные инструмента.scope—project(по умолчанию) ищет в активном подтверждённом проекте;allнамеренно ищет по всему профилю. В шлюзе «весь профиль» всё равно означает только сессии запросившего пользователя. Результат содержит фактическийscopeи запрошенныйscope_requested, поэтому непривязанная сессия явно обозначается как поиск по профилю.
Когда он используется
Агенту будет предложено автоматически использовать поиск сеансов:
"Когда пользователь ссылается на что-то из прошлого разговора или вы подозреваете, что соответствующий предшествующий контекст существует, используйте session_search, чтобы вспомнить это, прежде чем просить его повториться."
Типичные триггеры: «мы делали это раньше», «помнить, когда», «в последний раз», «как я уже говорил» или любая ссылка на проект/человека/концепцию, которой нет в текущем окне.
Отслеживание сеансов на каждой платформе
Сеансы шлюза
На платформах обмена сообщениями сеансы фиксируются детерминированным ключом сеанса, созданным на основе источника сообщения:
| Тип чата | Формат ключа по умолчанию | Поведение |
|---|---|---|
| Telegram в Директ | agent:main:telegram:dm:<chat_id>` | Одна сессия на чат в DM |
| Discord ДМ | agent:main:discord:dm:<chat_id>` | Одна сессия на чат в DM |
| WhatsApp в Директ | agent:main:whatsapp:dm:<canonical_identifier>` | Один сеанс на каждого пользователя DM (при наличии сопоставления псевдонимы LID/телефона сворачиваются до одного идентификатора) |
| Групповой чат | agent:main:<platform>:group:<chat_id>:<user_id>` | Для каждого пользователя внутри группы, когда платформа предоставляет идентификатор пользователя |
| Групповая тема/тема | `agent:main:<platform>:group:<chat_id>:<thread_id> | Общий сеанс для всех участников потока (по умолчанию). Для каждого пользователя с thread_sessions_per_user: true. |
| Канал | agent:main:<platform>:channel:<chat_id>:<user_id>` | Для каждого пользователя внутри канала, когда платформа предоставляет идентификатор пользователя |
Если VibeOS не может получить идентификатор участника общего чата, она возвращается к одному общему сеансу для этой комнаты.
Общие и изолированные групповые сеансы
По умолчанию VibeOS использует group_sessions_per_user: true в config.yaml. Это означает:
- Алиса и Боб могут общаться с VibeOS на одном и том же канале Discord, не делясь историей стенограммы.
- длительная и трудоемкая задача одного пользователя не загрязняет контекстное окно другого пользователя
- обработка прерываний также остается индивидуальной для каждого пользователя, поскольку ключ работающего агента соответствует изолированному ключу сеанса.
Если вместо этого вам нужен один общий «комнатный мозг», установите:
group_sessions_per_user: false
Это возвращает группы/каналы к одному общему сеансу в каждой комнате, что сохраняет общий контекст разговора, но также распределяет затраты токенов, состояние прерывания и рост контекста.
Сеансы общего и изолированного потока
Темы форума, темы Discord и темы Slack по умолчанию представляют собой общий сеанс для каждого участника (thread_sessions_per_user: false). Это сделано намеренно: тред обычно представляет собой совместную беседу.
Если каждому из нескольких человек в одном потоке требуется отдельная линия агента (отдельная история, прерывания и бюджет токенов), включите:
thread_sessions_per_user: true
Сравните с group_sessions_per_user (выше), который управляет изоляцией групп/каналов без потоков и по умолчанию равен true (для каждого пользователя). Ни одна из настроек не меняется terminal.cwd — рабочий каталог по-прежнему является общепроцессным для шлюза.
Политики сброса сеанса
Сеансы шлюза автоматически сбрасываются на основе настраиваемых политик:
- idle — сброс после N минут бездействия
- ежедневно — сбрасывается каждый день в определенный час.
- both — сброс в зависимости от того, что наступит раньше (в режиме ожидания или ежедневно).
- none — автоматический сброс не выполняется.
Прежде чем сеанс будет автоматически сброшен, агенту предоставляется возможность сохранить любые важные воспоминания или навыки из разговора.
Сеансы с активными фоновыми процессами никогда не сбрасываются автоматически, независимо от политики.
Места хранения
| Что | Путь | Описание |
|---|---|---|
| База данных SQLite | ~/.vibeos/state.db | Все метаданные сеанса + сообщения с FTS5 |
| Сообщения шлюза | ~/.vibeos/state.db | SQLite — каноническое хранилище для всех сообщений сеанса |
| Индекс маршрутизации шлюза | ~/.vibeos/sessions/sessions.json | Сопоставляет ключи сеанса с идентификаторами активных сеансов (метаданные происхождения, флаги истечения срока действия) |
База данных SQLite использует режим WAL для одновременного чтения и одну запись, что хорошо соответствует многоплатформенной архитектуре шлюза.
sessions.json не является списком сеансов~/.vibeos/sessions/sessions.json — это индекс маршрутизации шлюза. Он отображает
сеансовые ключи обмена сообщениями (agent:main:<platform>:...) с идентификаторами активных сеансов.
Он всегда содержит только записи шлюза/обмена сообщениями, поэтому, если вы запустите обмен сообщениями
платформе вы увидите только их (например, agent:main:whatsapp:dm:...).
Это ожидается и не означает, что ваши сеансы CLI отсутствуют.
vibeos sessions list, /sessions и на приборной панели — state.db,
который поддерживает каждый сеанс (CLI, TUI и шлюз). Снимки /save
в ~/.vibeos/sessions/saved/*.json — это удобный экспорт, а не индекс.
Если сеансы CLI действительно не отображаются в vibeos sessions list, причина в
state.db не получает их — запустите vibeos sessions repair и дождитесь
Предупреждение ⚠ Session store unavailable при запуске CLI, что означает SQLite
сохранение не удалось для этого запуска.
Сеансы, созданные до того, как state.db стал каноническим, могли иметь остатки
Файлы *.jsonl в ~/.vibeos/sessions/. Они больше не пишутся или
читается VibeOS. Безопасно удалить после проверки соответствующего сеанса.
существует в state.db.
Схема базы данных
Ключевые таблицы в state.db:
- sessions — метаданные сеанса (идентификатор, источник, user_id, модель, заголовок, временные метки, количество токенов). Заголовки имеют уникальный индекс (разрешены заголовки NULL, уникальными должны быть только заголовки, отличные от NULL).
- messages — полная история сообщений (роль, контент, вызовы_инструмента, имя_инструмента, количество_токенов)
- messages_fts — виртуальная таблица FTS5 для полнотекстового поиска по содержимому сообщений.
Срок действия сеанса и очистка
Автоматическая очистка
- Сеансы шлюза автоматически сбрасываются на основе настроенной политики сброса.
- Перед сбросом агент сохраняет воспоминания и навыки из истекающей сессии.
- Включенное автоматическое сокращение: если
sessions.auto_pruneимеет значениеtrue, завершённые неархивированные сеансы старшеsessions.retention_days(по умолчанию 90) отсекаются при запуске CLI/шлюза. - После сокращения, в ходе которого фактически были удалены строки,
state.dbудаляетсяVACUUMдля освобождения дискового пространства (SQLite не сжимает файл при простом УДАЛЕНИИ) - Удаление выполняется не чаще одного раза за
sessions.min_interval_hours(по умолчанию 24); временная метка последнего запуска отслеживается внутри самогоstate.db, поэтому она используется всеми процессами VibeOS в одном и том жеVIBEOS_HOME.
По умолчанию выключено — история сеансов полезна для повторного вызова session_search, и ее незаметное удаление может удивить пользователей. Включите в ~/.vibeos/config.yaml:
sessions:
auto_prune: true # opt in — default is false
retention_days: 90 # keep ended sessions this many days
vacuum_after_prune: true # reclaim disk space after a pruning sweep
min_interval_hours: 24 # don't re-run the sweep more often than this
Активные и архивированные сеансы никогда не удаляются автоматически, независимо от возраста.
Ручная очистка
# Prune sessions older than 90 days
vibeos sessions prune
# Delete a specific session
vibeos sessions delete <session_id>
# Export before pruning (backup)
vibeos sessions export backup.jsonl
vibeos sessions prune --older-than 30 --yes
База данных растет медленно (типично: 10–15 МБ для сотен сеансов), а история сеансов позволяет вызвать session_search из прошлых разговоров, поэтому автоматическое сокращение поставок отключено. Включите его, если вы выполняете тяжелую рабочую нагрузку шлюза/cron, где state.db существенно влияет на производительность (наблюдаемый режим сбоя: 384 МБ state.db с ~1000 сеансами, замедляющими вставки FTS5 и листинг /resume). Используйте vibeos sessions prune для однократной очистки без включения автоматической очистки.