Deal — единая кодовая база
ci / build-test (push) Canceled after 0s

SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/
Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue,
контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер),
Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог).

Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
This commit is contained in:
Rustam Khalimov
2026-09-11 23:56:47 +03:00
commit 27c7831910
1383 changed files with 158436 additions and 0 deletions
@@ -0,0 +1,271 @@
# Дейл (Deal) — Инструкция пользователя
> Версия: 1.3 (этапы 0–12)
> Дата: 2026-09-10
> Назначение: как работать с продуктом — от регистрации до ежедневного использования.
> Описывает итоговое состояние; dev-особенности помечены отдельно.
---
## 1. Регистрация по приглашению
«Дейл» — сервис с доступом по приглашениям: рабочее пространство (тенант) и пользователей заводит
**оператор** (администратор сервиса); самостоятельной регистрации нет.
1. Оператор создаёт приглашение **на вашу почту** — в новое пространство или в уже существующее.
2. Откройте присланную **ссылку приглашения** — откроется страница «Активация приглашения». Введите
**email** (обязательно тот же, на который приглашение), имя пространства (необязательно) и
**пароль** (минимум 8 символов).
3. Нажмите «Активировать аккаунт». Приглашение «на новое пространство» при активации создаёт ваше
рабочее пространство — данные изолированы от других клиентов. Приглашение «в существующее» добавляет
вас пользователем в него.
4. После активации вход — **email + пароль** (система сразу не входит — это отдельный шаг).
Особенности:
- приглашение действует **72 часа**; истекло — оператор пришлёт новое;
- email должен быть свободен: «Этот email уже зарегистрирован» → обратитесь к оператору;
- пароль — **минимум 8 символов**; код в ссылке можно открыть только целиком (без кода страница
сообщит, что ссылка неполная);
- **забыли пароль** — самостоятельного восстановления нет, обратитесь к оператору;
- вход приостановленного пространства невозможен («Учётная запись приостановлена») — вопросы к оператору.
> **Dev-окружение** (разработка/показ): регистрация не нужна — bootstrap-пространство `Default` с входом
> `admin`/`admin`. Демо-ручки/кнопки (`POST /api/demo/*`, флаг `DEAL_DEMO`) удалены — новые карточки
> создаются вручную; в обычной (прод) сборке — штатный контур оператор → инвайт.
---
## 2. Вход в систему
1. Вход — **email + пароль**, созданные при активации приглашения (раздел 1).
2. В dev-окружении — `admin`/`admin` (без приглашения).
3. Выход/смена пароля завершают текущую сессию.
> Все данные (каналы, карточки, настройки) принадлежат только вашему пространству и не видны другим
> клиентам. Оператор видит только служебное: список пространств и их статусы, аудит входов/выходов и
> действий (включая действия пользователей), расход ИИ-бюджета; к содержимому ваших данных и настроек
> доступа у оператора нет.
---
## 3. Первый запуск: подключение Telegram
Приложение Telegram работает через **api_id и api_hash**. Их задаёт **оператор сервиса** глобально
(раздел «Telegram» в оператор-консоли) — тенант ключи не вводит. Запущенные сервисы (полный стек)
поднимает оператор. В dev-окружении без стека раздел показывает неподключённый статус.
1. Убедитесь, что оператор задал ключи приложения (без них подключение недоступно).
2. Перейдите в раздел **«Настройки → Telegram»** и нажмите **«Добавить аккаунт»**.
3. Отсканируйте **QR-код** (или введите телефон + код подтверждения).
4. Дождитесь статуса «Telegram подключён». Сессия сохраняется — повторный вход не нужен.
После подключения система загрузит список ваших каналов и групп. Ключи приложения хранятся зашифрованно
на стороне сервиса.
---
## 4. Каналы и источники
Раздел **«Каналы»** — список диалогов вашего аккаунта и управление мониторингом.
- **Включить мониторинг** у нужного канала/группы — система начнёт читать новые сообщения.
- **«Перечитать»** — догнать последние ~10 сообщений всех включённых источников (например, после подключения).
- **Включить все** — включить мониторинг всех каналов разом.
- Новые чаты, которые вы добавили в Telegram, появятся в списке автоматически.
Если включена настройка «новый чат → мониторинг», они начнут читаться сами.
- Удалённые/покинутые чаты исчезают из списка.
- Прочитанные системой сообщения помечаются прочитанными и в вашем Telegram.
### Поиск новых каналов (Discovery)
Во вкладке **«Каналы → Поиск»** можно найти новые источники по вашей теме:
1. Нажмите **«Новая задача»**, опишите, что ищете (например: «каналы с вакансиями для C#-разработчика»).
2. Нажмите **«Сгенерировать ключи»** — ИИ предложит поисковые слова (можно отредактировать).
3. Задайте параметры: минимум подписчиков, язык, план вступлений, авто-вступление.
4. Запустите задачу. Система найдёт каналы/группы, в которых вы **не состоите**, и оценит их
(участники, язык, содержание — «подходит X из N»).
5. В списке кандидатов выберите действие:
- **«Вступить и мониторить»** — система вступит и начнёт читать;
- **«Отклонить»** — источник уйдёт в чёрный список и больше не будет предлагаться.
6. Закрытые группы/каналы помечаются — в них система вступить не может, решение за вами.
7. **Авто-вступление**: если включено, система вступает сама с паузами и в рамках
суточного лимита (настройки квот — в этом же разделе). Общий лимит делится между задачами.
---
## 5. Дашборд (карточки)
**«Дашборд»** — канбан с колонками. Карточка здесь и на экране «Выбранные» — **одна и та же
сущность**: сняв её с дашборда «В работу», вы не создаёте копию, а переносите карточку в стадии.
- **Неразобранное** — сообщения, которые не подошли ни под одну колонку.
- **Ваши колонки** — например, «WPF», «Фриланс», «Резюме» — куда система складывает подходящие карточки.
- **Архив** и **Корзина** — служебные.
### Карточка
На карточке: тип заявки (вакансия/заказ), время, заголовок, структурированная суть
(компания → формат → о задаче → требования → условия), стек, бюджет (в валюте и в пересчёте),
контакт и быстрые действия. Свежие карточки — сверху.
Действия с карточкой:
- **«Взять в работу»** — перенести карточку на экран «Выбранные» (в стадию «Запланировано»);
это тот же объект, а не копия;
- **клик по карточке** — подробный просмотр (справа);
- **комментарий** — иконка сообщения;
- **в корзину** — иконка корзины;
- **перетащить** в другую колонку — система запомнит (ML обучится) и в следующий раз
похожие заявки положит туда же;
- **контакт** — скопировать или открыть диалог;
- **«Открыть исходник»** — перейти к оригинальному сообщению в Telegram.
В подробном просмотре доступны: полная структура заявки, исходное сообщение (под спойлером),
комментарии, история, действия.
### Колонки
- **Создать колонку** — задайте имя, описание и фильтры (ключевые слова, стек, уровень,
бюджет, локация и т.д.). Все фильтры опциональны и могут сочетаться.
- **Отрицательные фильтры** — что НЕ должно попадать в колонку (например, без английского языка).
- ИИ может **предлагать колонки** по вашим карточкам — вы решаете: принять, переименовать или удалить.
- В карточке видно, **по каким критериям** она попала в колонку.
- Колонки можно сворачивать в виджет-счётчик, двигать, менять ширину, разворачивать на весь экран.
### Архив и корзина
- В **архив** карточки уходят автоматически, если лежат дольше установленного срока
(настройка 1–30 дней). Архив очищается через 90 дней.
- В **корзину** попадают удалённые карточки; очищается раз в 7 дней.
- Из архива/корзины карточку можно **вернуть** на канбан, пока её не очистили.
- Полная ручная очистка архива/корзины — кнопка в шапке колонки (безвозвратно).
---
## 6. «Выбранные» (работа с заявками)
Экран **«Выбранные»** — канбан для **тех же карточек**, которые вы взяли в работу (не копии):
1. Возьмите карточку с дашборда кнопкой **«Взять в работу»** — система перенесёт её в стадию
«Запланировано» (или создайте вручную — будет пометка «создано локально»).
2. Ведите её по стадиям: *Запланировано → Отклик → Согласование → В работе → Проверка → Готово* (или «Отложено»).
3. Перетаскивайте карточки между стадиями; наполняйте модули карточки (сумма, стек, контакты, ссылки,
ТЗ, файлы, комментарии).
В карточке «Выбранных» доступно:
- комментарии и **история движения** (статус, дата, время — под спойлером);
- изменение суммы, стека, контактов;
- прикрепление **ссылок** и **текста ТЗ**;
- прикрепление **файлов** (изображения, документы и др. — тип определяется автоматически);
на карточке видны значки количества файлов и ссылок.
Особенности:
- карточки «Выбранных» **не попадают** в архив/корзину дашборда; свои состояния — «Отклонено» и «Выполнено»;
- **«Отложено»**: при переносе система спросит, через какой срок напомнить и в какое время
(можно выбрать дату в календаре). Если напоминания выключены в настройках — окно не появится.
---
## 7. Обработка (очередь и отсев)
Раздел **«Обработка»** — что происходит с сообщениями до карточек.
- **Очередь** — сырые сообщения, ждущие обработки. Обычно быстро пустеет.
- **Отсев** — что система отклонила и **почему**:
- «правила» — стоп-фраза (указана), резюме, тип заявки, нет суммы;
- «ML» / «ИИ» — модель или ИИ посчитали сообщение спамом/не вашим;
- «система» — устарело или повтор (карточка уже есть).
- У записи: кнопка **«Открыть исходник»** (в Telegram) и исходное сообщение с форматированием.
- **Поиск** по отсеву — полный текст.
- **«Вернуть в обработку»**: если система ошиблась — верните сообщение, и оно создаст карточку.
Причины отсева для него будут проигнорированы, а система обучится на вашем решении.
- Отсев очищается автоматически раз в 3 дня (можно очистить вручную).
---
## 8. Настройки
**Настройки → Telegram:** подключение аккаунта, авто-мониторинг новых чатов.
**Настройки → ИИ:**
- провайдер и модель (можно выбрать один, включая локальные OpenAI-совместимые);
- ключ API (хранится зашифрованно);
- **промпты**: базовый (не меняется) + свой промпт; библиотека готовых промптов по сферам
с поиском и категориями; сохранённые свои промпты («Мои промпты»);
- вкл/выкл ИИ и ИИ-фильтр. Если ML уже уверенно обрабатывает поток — система подскажет,
что ИИ можно отключить.
**Настройки → ML:** включение, обучение на ваших действиях, проверка модели на сообщении/канале,
сброс обучения, показатели самооценки.
**Настройки → Обработка:** стоп-фразы, минимальная длина, блокировка резюме, тип заявок,
ключевые слова вашей сферы. **Глобальные исключения** — ключевые слова/технологии, локации, тип
(вакансия/фриланс/объявление) и диапазон бюджета: такие сообщения отсекаются сразу, ещě до ML и ИИ
(токены не расходуются). Отдельно — «не создавать карточку без суммы» (для вакансий и заказов отдельно).
**Настройки → Валюта и курсы:** валюта отображения, конвертация при получении,
пересчёт старых карточек при смене валюты.
**Настройки → Хранение:** срок до архива (1–30 дней), очистка архива и корзины.
**Настройки → Уведомления:** общие напоминания и уведомления (в т.ч. об отложенных).
**Настройки → Внешний вид:** тема оформления — «Тёмная» (по умолчанию), «Светлая» или «Системная».
Переключается мгновенно и запоминается.
---
## 9. ИИ-бюджет и уведомления
Обработка сообщений использует ИИ (классификация, ИИ-фильтр, генерация ключевых слов). У каждого
пространства — **ИИ-бюджет** (обычно месячный, в токенах), который устанавливает оператор.
- При расходе **80% бюджета** приходит уведомление «ИИ-бюджет израсходован на 80%».
- При **исчерпании** — уведомление «ИИ-бюджет исчерпан — обработка в локальном режиме»: система
автоматически переходит на локальную обработку (правила/ML без ИИ); приём и разбор сообщений
**не останавливается**, но глубина разбора снижается.
- Увеличить бюджет/сменить период может только оператор; после смены предупреждения сбрасываются.
- При **приостановке пространства** вход и ИИ-обработка недоступны — обратитесь к оператору.
- Системные уведомления (архив/очистки, подключение Telegram, бюджет) приходят значком-колокольчиком
в интерфейсе.
## 10. Советы
- Начните с подключения аккаунта → включите 2–3 канала → нажмите «Перечитать».
- Создайте колонки под ваши типичные заказы и задайте им фильтры.
- Переносите карточки руками — система учится и скоро начнёт раскладывать сама.
- Заглядывайте в «Отсев»: если там ваши реальные заказы — верните их, система исправится.
- Проверяйте вкладку «ИИ»: когда ML станет уверенной, можно отключить ИИ и сэкономить токены.
---
## 11. Для оператора сервиса (консоль)
> Этот раздел — для администратора сервиса «Дейл». Обычным пользователям он не нужен.
Оператор управляет сервисом из отдельной консоли: она открывается по адресу основного приложения
с добавлением **`#/operator`** (например, `https://<адрес-сервиса>/#/operator`). Консоль — отдельный
вход со своими учётными данными (логин/пароль выдаёт владелец сервиса).
Разделы консоли:
- **Тенанты** — список рабочих пространств с числом пользователей и статусом. Здесь можно создать
пространство (при необходимости сразу с владельцем — ему выдаётся одноразовый пароль),
**приостановить** и **возобновить** доступ, а также **войти от имени пользователя** пространства
(impersonation) — удобно для поддержки; завершается обычным выходом.
- **Приглашения** — создание приглашения на email (в новое или существующее пространство), отзыв
и копирование **ссылки активации**, которую вы передаёте клиенту.
- **Лимиты ИИ** — сводка расхода ИИ-бюджета по пространствам; можно изменить месячный/дневной бюджет
и период. После смены предупреждения о расходе сбрасываются.
- **Аудит** — лента действий (входы, выходы, приглашения, действия пользователей, изменения по
пространствам и лимитам) с фильтрами по типу события, актору, пространству и периоду; есть пагинация.
- **Аналитика** — обзор за период (число пространств, расход токенов, входы/выходы/неудачные входы),
расход токенов с группировкой по дням/пространствам/провайдерам/моделям и лента действий.
- **Состояние системы** — доступность ядра, базы данных и сервисов (Telegram, ИИ, ML).
> **Dev-окружение:** вход в консоль — `operator`/`operator`. В обычной (прод) сборке учётные
> данные оператора задаются владельцем сервиса при развёртывании.
---
## 12. Язык интерфейса
Интерфейс «Дейла» — на русском. Все тексты (кнопки, подписи, подсказки, пустые состояния, уведомления,
экраны оператора и страница активации) хранятся в словарях-ресурсах, а не в самих экранах.
Переключателя языка нет — интерфейс всегда на русском.