Commit Graph

19 Commits

Author SHA1 Message Date
hermes 39df85b51c fix: архивация/вложения больше не помечают письма прочитанными (Seen)
Причина: himalaya message read и attachment download используют IMAP BODY[],
который по RFC 3501 выставляет \Seen на сервере (Microsoft Exchange).
Пользователь: письма в ящике после скачивания становятся прочитанными.

Фикс:
- чтение тела: himalaya message read --preview (не ставит Seen)
- вложения: fetch_attachments_imaplib() — сырой IMAP stdlib (socket+ssl),
  UID FETCH (BODY.PEEK[]), папки в modified UTF-7, литералы до 1.5МБ,
  MIME-encoded words, фолбэк himalaya + flag remove seen

Проверено живьём: UID 14200 (INBOX, docx 1.1МБ) флаги ()->() — Seen не выставлен.
Openspec: change no-mark-seen-on-archive заархивирован (2026-09-14-no-mark-seen-on-archive), 7/7 validate OK
2026-09-14 08:08:48 +00:00
hermes 8bff6f9aa4 Задача 8: классификация и обработчики — живой прогон, cron, archive change 2026-09-14 04:50:50 +00:00
hermes 7550aff102 feat: классификация писем Qwen3:8b + обработчики (urgent→TG, task→VTODO, meeting→VEVENT)
- 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, формат дат)
2026-09-13 20:35:58 +00:00
hermes 8ea022f5c0 CardDAV: двусторонний синк контактов с Radicale (push+pull) + docs DAVx5/Caddy
- scripts/contacts_caldav_sync.py: push 81 контакт → vCard (Radicale :5232),
  pull правок/создания/удаления с телефона → contacts.json (ETag сверка,
  soft-delete, конфликты 412 → приоритет телефону, лог caldav-sync.log)
- fix(contacts_extractor): перестройка by_email-индексов после sort()
- STATUS.md: раздел DAVx5 + Caddy (Authorization/handle_path/X-Script-Name),
  Задача 3 (синхронизация с телефоном) = следующая сессия
- tasks.md: отмечены 1.x-3.x/V (реализовано и протестировано), добавлен
  раздел 5 (Caddy + DAVx5 + jtx board) для следующей сессии
2026-09-13 17:21:51 +00:00
hermes 17252ebfa9 openspec: contacts-caldav-server — двусторонний синк (правки с телефона → в базу) 2026-09-13 16:07:27 +00:00
hermes de07fae246 openspec: change contacts-caldav-server (CardDAV sync для контактов из почты) 2026-09-13 15:59:49 +00:00
hermes 2a597f7325 chore: Radicale/Vikunja подняты в docker (2026-09-13), STATUS обновлён 2026-09-13 15:48:28 +00:00
hermes 02e2b87072 fix: Vikunja volumes — локальные папки ./db и ./files в корне сервиса (без named volumes) 2026-09-12 17:59:03 +00:00
hermes 868f85b686 docs: пути Radicale/Vikunja обновлены на /opt/hermes/email-assistant/, отмечены выполненные задачи (R1-R3, V1, O1) 2026-09-12 16:18:45 +00:00
hermes 9603f3b1c5 docs: пути Radicale/Vikunja обновлены на /opt/hermes/email-assistant/ 2026-09-12 16:18:02 +00:00
hermes 89e9e3441d feat: Radicale (CalDAV) и Vikunja (задачи) перенесены в каталог проекта
- radicale/: compose, config, .env (данные в radicale/data/ — gitignored)
- vikunja/: compose (postgres + vikunja :3456), .env (gitignored)
- .gitignore: radicale/data/ (пароли/коллекции не в репо)
- Блокер: docker на bigbox не может создавать контейнеры (systemd1 D-Bus timeout) — нужен внешний рестарт
2026-09-12 16:17:53 +00:00
hermes 4252b596f3 docs: блок «Ресурсы проекта» — расположение и доступ к Caddy/Radicale/Vikunja/WG/SSH 2026-09-12 10:16:29 +00:00
hermes f44bc27ce1 OpenSpec: разнести openspec по проектам 2026-09-11 17:30:17 +00:00
hermes 757f3413e9 docs: итоги сессии 2026-09-11 — STATUS обновлён, TODO/WALKTHROUGH созданы
- STATUS: дата 2026-09-11, реальные метрики (4884 письма, 81 контакт),
  cron id реальные (5f2305b2bbf8/ea0fd1ab4f93), блок портфеля веб-UI
- TODO.md: журнал задач (2026-07 → 2026-09-11)
- WALKTHROUGH.md: капитанский журнал (Фаза 1.7, Nylas, ФС vs Maildir,
  Radicale развёрнут, блокер с коллекциями)
- PLAN_WEBUI.md: план портфеля (был untracked)
2026-09-11 14:31:06 +00:00
hermes e31b5f2552 docs: анализ формата хранения ФС vs Maildir (задача 4)
- STORAGE_ANALYSIS.md: сравнение email.md / Maildir / MBOX / notmuch
  по 7 критериям; рекомендация — остаться на email.md + добавить tags в
  frontmatter + опциональный экспорт в Maildir
- README.md: ссылка на анализ в разделе «Оценка альтернатив»
- Данные не изменены (4884 email.md до и после)
2026-09-11 13:13:21 +00:00
hermes d4bf3ed1ad docs: анализ Nylas CLI — не подходит (отклонено)
Nylas — облачный SaaS, а не локальный CLI для произвольного IMAP.
Проблемы: утечка корпоративной почты третьей стороне, платность,
гибель IMAP-гранта при ротации пароля, платный Contacts API.
Вывод: продолжаем с Himalaya; для отправки — SMTP в himalaya/msmtp.
2026-09-11 12:54:11 +00:00
hermes c7430d1b8a feat: динамическое обнаружение подпапок INBOX (Фаза 1.7)
- get_inbox_subfolders(): парсит 'himalaya folder list', находит 136
  подпапок INBOX (вместо хардкода 18), fallback на INBOX_SUBFOLDERS
- --all использует FOLDERS + get_inbox_subfolders()
- EXCLUDED_FOLDERS: Trash/Drafts/RSS/Junk/Spam/Archive не архивируются
- ENVELOPE_TIMEOUT=180: INBOX (14k писем) перечисляется >60с
- run_cmd() ловит FileNotFoundError (himalaya вне PATH)
- mail-archive.sh: HOME=/home/estorozhenko, цикл переписан на --all --drain
- STATUS.md: Фаза 1.7 ✅
2026-09-11 11:58:27 +00:00
hermes 7aa0d191db Add README, .gitignore, gitea config, push mirror task 2026-07-19 16:20:22 +00:00
hermes 004977b1f8 Initial commit: Email Assistant project 2026-07-19 16:19:14 +00:00