148 lines
16 KiB
Markdown
148 lines
16 KiB
Markdown
# План реализации (ROADMAP)
|
||
|
||
## 1. Очистка от регулярок и костылей (`tool_injector.py`) `[ЗАВЕРШЕНО]`
|
||
- [x] Полностью удалить принудительные перехваты текста регулярными выражениями для команд добавления, редактирования и удаления пунктов[cite: 3].
|
||
- [x] Оставить в модуле только базовую санитарную очистку сырых тегов (`<tool_call>`)[cite: 3].
|
||
|
||
---
|
||
|
||
## 2. Настройка контекста и инструкций сессии (`agent.py`) `[ЗАВЕРШЕНО]`
|
||
- [x] Передать управление диалогом языковой модели через системный блок `role: "system"`[cite: 3].
|
||
- [x] При активном состоянии `PROMPT_PREVIEW` передавать модели инструкцию:
|
||
- **Подтверждение / отмена / корректировка:** продолжать работу с превью и вызывать соответствующие инструменты[cite: 3].
|
||
- **Смена темы:** вежливо напомнить об открытом изменении и запросить решение[cite: 3].
|
||
- [x] Обеспечить видимость эфемерных сообщений (`is_ephemeral = 1`) для модели во время активной работы с превью[cite: 3].
|
||
- [x] Внедрить семантический Topic Drift Guard (`idle_turns` = 3) с вопросами и кнопками из `tool_action_registry`[cite: 3].
|
||
- [x] Реализовать детерминированный мгновенный сброс сессии и зачистку эфемерного контекста при вызове сторонних инструментов[cite: 3].
|
||
|
||
---
|
||
|
||
## 3. Очистка эфемерных сообщений при завершении (`fast_path.py` / `context_manager.py`) `[ЗАВЕРШЕНО]`
|
||
- [x] Настроить удаление временных сообщений превью (`db_purge_ephemeral_messages`) строго в момент нажатия кнопок **«Подтвердить»** или **«Отменить»**[cite: 3].
|
||
- [x] Сбрасывать состояние сессии в базе данных после фиксации решения[cite: 3].
|
||
- [x] Внедрить прямое точечное применение изменений через `db_apply_prompt_node_action`[cite: 3].
|
||
- [x] Добавить обработку фазы `PROMPT_FOLLOWUP` с кнопками завершения и очистки контекста[cite: 3].
|
||
- [x] Создать `context_manager.py` для строгого разграничения служебных tool-пар (`is_ephemeral=1`) и содержательного диалога (`is_ephemeral=0`), сохраняя беседы Topic Drift в истории[cite: 3].
|
||
|
||
---
|
||
|
||
## 4. Инлайн-редактор в окне диалога (`core.js`) `[ЗАВЕРШЕНО]`
|
||
- [x] Проверить работу блока ручного редактирования (`inline-prompt-editor-container`) с кнопками **«Сохранить правки»** и **«Свернуть»**[cite: 3].
|
||
- [x] Обеспечить сохранение черновика через API (`/api/v1/chat/draft`) и отображение обновленного текста перед подтверждением[cite: 3].
|
||
- [x] Реализовать двусторонний клиентский Diff-рендерер (одновременная подсветка добавленных строк и зачеркивание удаленных `[УДАЛЕНИЕ]`)[cite: 3].
|
||
- [x] Добавить авто-форматирование и отступы подпунктов (`X.Y.`) при ручном сохранении черновика[cite: 3].
|
||
|
||
---
|
||
|
||
## 5. Тестирование и валидация системного промпта `[ЗАВЕРШЕНО]`
|
||
- [x] **Нативные вызовы:** проверить добавление, редактирование и удаление пунктов через нативные вызовы модели (`db_prompt_node_edit`)[cite: 3].
|
||
- [x] **Контекстные сценарии:** проверить поведение модели при смене темы диалога оператором (Guardrail)[cite: 3].
|
||
- [x] **UI и очистка:** проверить ручное редактирование через кнопку в окне чата и последующую очистку контекста (`db_purge_ephemeral_messages`)[cite: 3].
|
||
|
||
---
|
||
|
||
## 6. Распространение архитектурного паттерна на модуль задач (`tasks`) `[ЗАВЕРШЕНО]`
|
||
- [x] **Масштабирование UI задач:**
|
||
- Увеличена ширина карточки до `max-w-4xl` и динамическая высота скролла до `70vh`[cite: 3].
|
||
- Реализованы переключатели фильтрации: «В работе» (по умолчанию), «В планах», «Готово», «Все»[cite: 3].
|
||
- Разделены кнопки действия: «В работу» (для плановых) и «Готово» (для текущих)[cite: 3].
|
||
- [x] **Инлайн-редактирование карточки задачи:**
|
||
- Плавная трансформация карточки в 3-строчную форму (текст, дата со встроенным пикером, выпадающий список важности)[cite: 3].
|
||
- Отображение даты создания задачи[cite: 3].
|
||
- Сохранение через REST API эндпоинт `PATCH /api/v1/tasks/{id}`[cite: 3].
|
||
- [x] **Детерминированный Fast-Path и двухфазное удаление:**
|
||
- Мгновенная смена статусов без задержек LLM[cite: 3].
|
||
- Карточка подтверждения удаления с автоочисткой контекста[cite: 3].
|
||
- [x] **Генерация отчетов задач в Markdown:**
|
||
- Добавлен инструмент `db_export_tasks_markdown` для формирования Markdown-файла с группировкой по модулям и чекбоксами `[x]` / `[ ]`[cite: 3].
|
||
- Реализован роутер безопасной отдачи файлов с сохранением имени (`/api/v1/files/download/...`)[cite: 3].
|
||
- [x] **Доменная консолидация задач:**
|
||
- Реализован консолидированный инструмент `db_tasks_edit(action: ["ADD", "UPDATE", "DELETE", "EXPORT"], ...)`[cite: 3].
|
||
|
||
---
|
||
|
||
## 7. Распространение на модуль снапшотов (`snapshots`) `[ЗАВЕРШЕНО]`
|
||
- [x] **Поддержка Y-снапшотов:** универсальный парсинг и поиск по `snapshot_id LIKE 'Y%'` и срезам за 22:00:00[cite: 3].
|
||
- [x] **Single Active Snapshot View:** сохранение активного среза в контексте для аналитики с автоматической ротацией и зачисткой при запросе новых дат[cite: 3].
|
||
- [x] **Интерактивный UI с чекбоксами и защитой срезов:**
|
||
- Чекбоксы в строках дневных срезов и кнопка «Выбрать все» в шапке[cite: 3].
|
||
- Защита итогового вечернего среза Y (иконка замочка `🔒`, блокировка выбора)[cite: 3].
|
||
- Динамическая кнопка «Удалить выбранные (N)» в подвале карточки[cite: 3].
|
||
- [x] **Детерминированный Fast-Path удаления срезов:**
|
||
- Двухфазное подтверждение удаления (одиночное и пакетное) с корректным счётчиком количества удаляемых элементов[cite: 3].
|
||
- Защита от сброса фильтра даты (`query_date`) при обновлении карточки после удаления[cite: 3].
|
||
|
||
---
|
||
|
||
## 8. Глубокий архитектурный рефакторинг ядра и сервисов `[ЗАВЕРШЕНО]`
|
||
- [x] **Выделение общего слоя ядра (`core/`):**
|
||
- Изолированный пул соединений SQLite (`core/connection.py`) с поддержкой WAL и таймаутов.
|
||
- DDL-схемы таблиц и индексов (`core/schema.py`).
|
||
- Репозитории СКУД и 1С (`core/repositories/scud_repo.py`, `core/repositories/zup_repo.py`).
|
||
- Фасад обратной совместимости (`core/database.py`).
|
||
- [x] **Декомпозиция предметных доменов (`services/`):**
|
||
- Сервис задач (`services/tasks/`), системного промпта (`services/prompts/`), срезов СКУД (`services/snapshots/`), базы знаний (`services/knowledge/`).
|
||
- [x] **Рефакторинг ETL-конвейера (`services/scud_etl/`):**
|
||
- Оркестратор `pipeline.py`, детектор аномалий `anomaly_detector.py`, слияние `merger.py`.
|
||
- [x] **Модульный ИИ-оркестратор (`modules/ai_engine/`):**
|
||
- Динамический строитель системного контекста (`context_builder.py`).
|
||
- Изолированные обработчики инструментов в `handlers/`.
|
||
|
||
---
|
||
|
||
## 9. Реляционный реестр исключений, схлопывание мульти-пропусков и автозакрытие 8.5ч `[ЗАВЕРШЕНО]`
|
||
- [x] **Реестр исключений в SQLite (`exceptions_registry`):**
|
||
- Хранение категорий `departments`, `positions`, `fio`, `position_keywords`, `include_fio` в БД.
|
||
- Доменный сервис `exceptions_repo.py` и полная поддержка в CLI `scripts/db_cli.py exceptions`.
|
||
- [x] **Агрегация мульти-пропусков физлиц в СКУД:**
|
||
- Функция `aggregate_scud_by_person` в `merger.py`: объединение событий всех пропусков одного человека (ранний вход, поздний выход, присутствие).
|
||
- Автоматическая фиксация аномалий дублирования пропусков (`DUPLICATE_SCUD_CARD`).
|
||
- [x] **Умный выбор ставки совместителей 1С:ЗУП:**
|
||
- Функция `select_best_zup_position` в `merger.py`: привязка ставки 1С по подразделению физического нахождения в СКУД.
|
||
- [x] **Автозакрытие смен по Правилу 8.5ч:**
|
||
- Для забывших отметиться на выходе офисных сотрудников: автоматический расчет `Вход + 8ч 30мин`, норма 8 часов и отклонение `0:00` в `excel_exporter.py`.
|
||
- [x] **Кэш сопоставлений личностей (`person_identity_mapping`):**
|
||
- Таблица в SQLite и команды `db_cli.py mapping [list|add|del]`.
|
||
- Теневой режим ИИ-подсказок по нечетким ФИО в `text_reporter.py`.
|
||
- [x] **Каскадный fallback кадровых отсутствий:**
|
||
- `MS SQL ЗУП` $\rightarrow$ резервный парсинг `Отсутствия_*.xlsx` $\rightarrow$ `static_reason_workers.csv`.
|
||
|
||
---
|
||
|
||
## 10. Разграничение Сводки и Отчета + Почасовые срезы и Y-23:59:59 `[В РАБОТЕ]`
|
||
- [ ] **Корректировка финишного среза Y на 23:59:59:**
|
||
- [ ] Обновить время вечернего среза с `22:00:00` на `23:59:59` в `services/scud_export.py`, `scud_repo.py` и `pipeline.py`.
|
||
- [ ] **Разделение генераторов отчетов:**
|
||
- [ ] Создать `services/scud_etl/svodka_generator.py` (оперативная сводка, последний доступный срез или выбранный дневной).
|
||
- [ ] Создать `services/scud_etl/otchet_generator.py` (детальный отчет за прошлую смену, строго по единственному итоговому `Y`-снапшоту за 23:59:59).
|
||
- [ ] Исключить устаревший `report_generator.py`.
|
||
- [ ] **Параметризация `main_etl.py`:**
|
||
- [ ] Добавить поддержку аргументов `--date ДД.ММ.ГГГГ` и `--snapshot ID` для свободного запуска расчета за любой прошлый день.
|
||
- [ ] **Политика почасовых срезов (Hourly Snapshots) и retention-очистка:**
|
||
- [ ] Реализовать фоновое снятие часовых срезов в течение рабочего дня.
|
||
- [ ] Настроить ночную очистку промежуточных дневных срезов с сохранением полуденного (13:00) и финишного (`Y` 23:59:59).
|
||
- [ ] **Толерантный поиск срезов (Smart Snap-to-Grid, ±15–30 мин):**
|
||
- [ ] Поиск готового снапшота в SQLite при запросе оператора с возможностью мгновенного построения сводки без лишних запросов к MS SQL Орион.
|
||
- [ ] Формирование On-Demand запроса в MS SQL Орион при отсутствии подходящего среза.
|
||
|
||
---
|
||
|
||
## 11. Диалоговая генерация и контроль отчетов СКУД (Conversational Reporting Engine) `[В ПЛАНАХ]`
|
||
- [ ] **Интерактивный запуск отчетов из чата:**
|
||
- [ ] Инструменты `db_generate_svodka(date_str, snapshot_id)` и `db_generate_otchet(date_str)` в Function Calling.
|
||
- [ ] Автоматическая отдача карточки скачивания сформированного Excel-файла прямо в диалоге (`FILE_DOWNLOAD_CARD`).
|
||
- [ ] **Диалоговый аудит расхождений и подтверждение связок:**
|
||
- [ ] Инструмент точечной выборки: «Кто сегодня не пришел из отдела ОВК?», «Покажи опоздавших за вчера».
|
||
- [ ] Интерактивное подтверждение предложенных ИИ связок ФИО прямо из чата с записью в `person_identity_mapping`.
|
||
- [ ] **Веб-интерфейс управления исключениями:**
|
||
- [ ] Веб-форма просмотра и редактирования таблицы `exceptions_registry` в боковом меню.
|
||
|
||
---
|
||
|
||
## 12. Изолированная песочница кода (Code Execution Sandbox Engine) `[В ПЛАНАХ]`
|
||
- [ ] **Docker/gVisor контур:**
|
||
- Создание изолированного контейнера без доступа к внешней сети (network: none) с ограниченными лимитами по памяти и CPU (cgroups)[cite: 3].
|
||
- Настройка безопасного монтирования только необходимых CSV/Parquet-файлов данных в режиме Read-Only[cite: 3].
|
||
- [ ] **Динамические Python/Pandas вычисления:**
|
||
- Инструмент генерации и безопасного выполнения скриптов агрегации и аналитики данных СКУД / 1С на лету[cite: 3].
|
||
- Перехват stdout/stderr, сбор результатов расчетов и графиков с передачей в UI-чата[cite: 3]. |