7550aff102
- mail_archive.py: фикс вложений himalaya --dir → --downloads-dir; attachments/ только при has_attachment; идемпотентно - email_classifier.py: Qwen3:8b (Ollama) → теги info/urgent/task/meeting в frontmatter email.md - email_handlers.py: urgent→Telegram (Bot API+SOCKS5), task→Radicale VTODO, meeting→Radicale VEVENT; handled_* идемпотентность; --dry-run - .gitignore: игнор *.env.bak* - openspec: чейндж email-classification-handlers (в работе) - STATUS/TODO/WALKTHROUGH: прогресс сессии, подводные камни Radicale (http.client, Depth:1, формат дат)
4.1 KiB
4.1 KiB
PRD — Email Assistant (локальный почтовый ассистент)
Обновлено: 2026-09-13
Цель
Инкрементальный локальный архив корпоративной почты с последующей обработкой локальной LLM: классификация писем, извлечение контактов, дайджесты, интеграция с локальным календарём/задачами (Radicale CalDAV). Всё — локально (bigbox), без облачных зависимостей.
Пользователи
Один пользователь — estorozhenko (личная корпоративная почта e.storozhenko@vinogorod.ru, IMAP mail.corpoffice.tech).
Функциональные требования
- Архивация: скачивать письма с IMAP, сохранять текст+метаданные в
email.md(YAML-frontmatter + текст), структура/opt/hermes/email/<folder>/YYYY/MM/<uid>/. - Вложения: сохранять вложения в каталог письма
attachments/(ФТ-2, в работе). - Поиск: SQLite FTS5 по письмам (веб-интерфейс, Задача 1).
- Классификация: локальная LLM (Qwen3:8b) классифицирует письмо → тег info/urgent/task/meeting + обоснование (ФТ-3, в работе).
- Обработчики: по тегам — urgent→Telegram, task→Radicale VTODO (календарь «Задачи»), meeting→Radicale VEVENT (календарь «Рабочий»), info→ничего (ФТ-4, в работе).
- Контакты: извлечение контактов из подписей через LLM + двухсторонний CardDAV sync с Radicale («Контакты»).
- Дайджест: еженедельная сводка писем.
- Календарь/задачи: Radicale CalDAV (Личный/Рабочий/Задачи), синхронизация с Android (DAVx5 → календари/контакты, jtx board → VTODO-задачи).
Нефункциональные требования
- Приватность: текст писем никогда не покидает bigbox (обработка только локальной LLM Qwen3:8b через Ollama localhost:11434).
- Идемпотентность: повторный запуск не дублирует (классификацию, обработчики, вложения).
- Отказоустойчивость: сбой обработчика не теряет письмо (лог + повторная попытка по тегу).
- Расположение: всё в
/opt/hermes/(единый каталог, бэкап = копия). - Порядок данных: секреты — только в
.env/.htpasswd, не в git и не в README/WALKTHROUGH.
Границы (что НЕ делаем)
- НЕ используем облачных ассистентов/API для содержимого писем (Nylas и т.п. отклонено).
- НЕ используем Vikunja — задачи через Radicale VTODO (решение 2026-09-13).
- НЕ отправка почты (архив read-only).
- НЕ удаляем/теряем письма — архив только пополняется.
Критерии готовности
- Вложения качаются в
attachments/(ФТ-2) - Классификатор проставляет теги на всю базу (ФТ-4)
- Обработчики срабатывают и видны в Telegram/Radicale (ФТ-5)
- Веб-интерфейс: поиск, тэги, «Создать задачу» (Задача 1)
- Календарь/задачи синхронизируются на Android по CalDAV
Стек
Himalaya CLI → Python (mail_archive.py) → SQLite FTS5 → Ollama Qwen3:8b → Radicale (CalDAV/CardDAV, docker :5232, cal.nixg.ru) → Telegram (уведомления).