Skip to main content

Почта в Nerve

Раздел «Почта» показывает ящик, настроенный в channels.email. Почтовый сервер остаётся источником писем, папок и отметок. Nerve хранит восстанавливаемые заголовки и связи с разговорами, а Велес сохраняет рабочие сводки в технической папке рабочей области. Интерактивная почта включается переключателем modules.mail.enabled и требует перезапуска шлюза после изменения. Если модуль выключен, Nerve скрывает раздел, его локальные почтовые маршруты не обращаются к кэшу, а периодическая синхронизация раз в 30 секунд только перепроверяет состояние модуля и не выполняет запросы к IMAP, модели или базе анализа. Переключатель channels.email.enabled независим и управляет почтовым каналом агента. Выключение модуля не удаляет настройки и накопленный анализ.

Расположение и папки

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

Возможности

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

Настройка

Используются адреса серверов, имя пользователя и локальные зашифрованные секреты из channels.email. Для доступа необходимо установить consentGranted=true. Поле enabled управляет отдельным агентским почтовым каналом. Оно не требуется почтовому клиенту Nerve. Для обычного почтового клиента рекомендуется:
При consentGranted=true и clientAutoAnalyze=true Nerve передаёт ограниченный текст новых писем настроенной модели для фоновой классификации и подготовки черновика ответа. Автоматическое чтение выполняется в режиме просмотра: ни фоновый анализ, ни отдельный агентский почтовый канал не устанавливают на сервере отметку прочтения. Устаревшее поле markSeen игнорируется. Если поле clientAutoAnalyze отсутствует, фоновая обработка включена. Значение false отключает только фоновую обработку: кнопка «Проанализировать с ИИ» продолжает работать. Черновик не отправляется автоматически — пользователь открывает его в редакторе, проверяет и отдельно подтверждает отправку. Пароли, полные тела писем и файлы в производный кэш или базу сводок не записываются. Поле clientAnalysisModel позволяет выбрать для этой обработки отдельную модель. Пустое значение использует agents.defaults.model. Пробелы по краям удаляются, а полный идентификатор длиной не более 500 символов с префиксом поставщика, например openrouter/google/gemini-2.5-flash, openai-codex/gpt-5.1-codex или custom/minimax-m2.7, сохраняется без изменения и при автоматическом выборе поставщика направляет запрос по этому префиксу. Для выбранного поставщика нужен собственный ключ или выполненный вход. Выбранные в обычном разговоре модель и уровень рассуждения на почтовый анализ не влияют; для отдельной почтовой модели используется её собственное поведение рассуждения по умолчанию. Смена настройки применяется к новым запускам анализа, но не пересчитывает уже сохранённые сводки. pollIntervalSeconds задаёт общий период проверки IMAP для раздела «Почта» и отдельного агентского почтового канала. Значение по умолчанию — 1800, то есть 30 минут; допустимы значения от 30 секунд до суток.

Изображения в письмах

Встроенные растровые изображения, на которые письмо ссылается через служебный идентификатор содержимого или расположение части, загружаются через защищённый адрес Велеса. Безопасные растровые данные, включённые прямо в HTML, показываются без сетевого запроса. Такие изображения не считаются обычными вложениями и не создают лишний значок скрепки; часть с именем файла, на которую HTML не ссылается, остаётся доступным для скачивания вложением. Внешние изображения могут использоваться для подтверждения открытия письма. Поле clientRemoteImagePolicy принимает три значения:
  • block — не загружать внешние изображения;
  • ask — по умолчанию показать предупреждение и загрузить изображения только после нажатия кнопки;
  • allow — загружать их сразу при открытии письма.
Если поле отсутствует, используется режим ask. Даже после разрешения браузер не обращается к внешнему адресу напрямую. Велес проверяет адрес и все перенаправления, запрещает частные и служебные сети, ограничивает размер и принимает только безопасные растровые форматы. Удалённый сервер всё равно может узнать о загрузке по уникальному адресу изображения, поэтому рекомендуется значение ask.

Поручение Велесу

Кнопка «Поручить Велесу» создаёт не отдельный запрос к модели, а новый обычный разговор выбранной личности.
  1. Откройте письмо и нажмите «Поручить Велесу».
  2. Выберите личность в том же окне, которое используется для нового разговора.
  3. Обязательно опишите задачу своими словами.
  4. Проверьте список вложений. Опасные исполняемые типы передать агенту нельзя.
  5. Подтвердите создание разговора.
Велес сохраняет ограниченную ветку в mail-thread.md, добавляет выбранные файлы и переключает Nerve в новый разговор. Личность получает обычные инструменты, навыки, память и доступ к рабочей области. Письмо и вложения всегда помечаются как внешние недоверенные данные. Инструкции внутри них не дают агенту полномочий. Отправка почты и другие подтверждаемые действия продолжают требовать обычного подтверждения.

Задачи и календарь

Из найденного поручения можно создать задачу после подтверждения. Для события календаря требуется подключённый источник Exchange. Источники ICS остаются только для чтения. Кнопки создания задачи и события показываются только при включённых модулях задач и календаря. Подтверждение пользователя остаётся обязательным.

Хранение сводок и локальный кэш

Успешные результаты анализа сохраняются в отдельной базе SQLite workspace/.veles/mail/analysis.db. В ней находятся только хэш-отпечаток конфигурации почтовой учётной записи, служебный идентификатор письма, версия запроса, структурированная сводка, название модели и время обработки; пароль в отпечаток не входит. Сначала письмо связывается по Message-ID; если его нет, нужен действительный UIDVALIDITY папки вместе с исходным именем папки и UID. При неизвестном или недействительном UIDVALIDITY такая сводка не сохраняется, чтобы после смены поколения папки не связать её с другим письмом. Тела писем, HTML, изображения, вложения и пароли туда не записываются. База не шифруется отдельно и защищается правами доступа к рабочей области. Сводки не удаляются по возрасту и остаются частью рабочей области, пока пользователь вручную не удалит базу при остановленном Велесе. При первом запуске после обновления Nerve переносит доступные успешные результаты из прежнего локального кэша в базу Велеса. Перенос повторяемый и не удаляет исходные записи. Производный кэш Nerve хранится в ${NERVE_DATA_DIR:-~/.nerve}/mail/mail.db. Он содержит восстанавливаемые заголовки, связи с разговорами и временные копии сводок для надёжной доставки в базу Велеса и исключения повторной обработки. Служебный ключ каждой записи восстанавливается из исходного имени папки, UIDVALIDITY и UID, поэтому перенос сводок не зависит от особенностей чтения SQLite в Windows. При смене почтовой учётной записи кэш очищается по её хэш-отпечатку; при смене поколения UID папки удаляются старые локаторы, чтобы не связать сводку с другим письмом. Записи старше 90 дней удаляются автоматически. Удаление файла кэша не удаляет письма с сервера и не удаляет сводки из рабочей области. Для встроенного хранилища требуется Node.js 22.13 или новее. Фоновая синхронизация использует pollIntervalSeconds, но не чаще одного раза в 30 секунд. Значение по умолчанию — 30 минут. Она читает сообщения без установки отметки «прочитано».