feat(web): стабилизация UI, Gemini-скроллинг, роутеры контекста/снапшотов и актуализация роадмапа
This commit is contained in:
+95
-66
@@ -1,76 +1,77 @@
|
||||
# План реализации (ROADMAP)
|
||||
|
||||
## 1. Очистка от регулярок и костылей (`tool_injector.py`) `[ЗАВЕРШЕНО]`
|
||||
- [x] Полностью удалить принудительные перехваты текста регулярными выражениями для команд добавления, редактирования и удаления пунктов[cite: 3].
|
||||
- [x] Оставить в модуле только базовую санитарную очистку сырых тегов (`<tool_call>`)[cite: 3].
|
||||
- [x] Полностью удалить принудительные перехваты текста регулярными выражениями для команд добавления, редактирования и удаления пунктов.
|
||||
- [x] Оставить в модуле только базовую санитарную очистку сырых тегов (`<tool_call>`).
|
||||
|
||||
---
|
||||
|
||||
## 2. Настройка контекста и инструкций сессии (`agent.py`) `[ЗАВЕРШЕНО]`
|
||||
- [x] Передать управление диалогом языковой модели через системный блок `role: "system"`[cite: 3].
|
||||
- [x] Передать управление диалогом языковой модели через системный блок `role: "system"`.
|
||||
- [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].
|
||||
- **Подтверждение / отмена / корректировка:** продолжать работу с превью и вызывать соответствующие инструменты.
|
||||
- **Смена темы:** вежливо напомнить об открытом изменении и запросить решение.
|
||||
- [x] Обеспечить видимость эфемерных сообщений (`is_ephemeral = 1`) для модели во время активной работы с превью.
|
||||
- [x] Внедрить семантический Topic Drift Guard (`idle_turns` = 3) с вопросами и кнопками из `tool_action_registry`.
|
||||
- [x] Реализовать детерминированный мгновенный сброс сессии и зачистку эфемерного контекста при вызове сторонних инструментов.
|
||||
|
||||
---
|
||||
|
||||
## 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].
|
||||
- [x] Настроить удаление временных сообщений превью (`db_purge_ephemeral_messages`) строго в момент нажатия кнопок **«Подтвердить»** или **«Отменить»**.
|
||||
- [x] Сбрасывать состояние сессии в базе данных после фиксации решения.
|
||||
- [x] Внедрить прямое точечное применение изменений через `db_apply_prompt_node_action`.
|
||||
- [x] Добавить обработку фазы `PROMPT_FOLLOWUP` с кнопками завершения и очистки контекста.
|
||||
- [x] Создать `context_manager.py` для строгого разграничения служебных tool-пар (`is_ephemeral=1`) и содержательного диалога (`is_ephemeral=0`), сохраняя беседы Topic Drift в истории.
|
||||
|
||||
---
|
||||
|
||||
## 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].
|
||||
- [x] Проверить работу блока ручного редактирования (`inline-prompt-editor-container`) с кнопками **«Сохранить правки»** и **«Свернуть»**.
|
||||
- [x] Обеспечить сохранение черновика через API (`/api/v1/chat/draft`) и отображение обновленного текста перед подтверждением.
|
||||
- [x] Реализовать двусторонний клиентский Diff-рендерер (одновременная подсветка добавленных строк и зачеркивание удаленных `[УДАЛЕНИЕ]`).
|
||||
- [x] Добавить авто-форматирование и отступы подпунктов (`X.Y.`) при ручном сохранении черновика.
|
||||
|
||||
---
|
||||
|
||||
## 5. Тестирование и валидация системного промпта `[ЗАВЕРШЕНО]`
|
||||
- [x] **Нативные вызовы:** проверить добавление, редактирование и удаление пунктов через нативные вызовы модели (`db_prompt_node_edit`)[cite: 3].
|
||||
- [x] **Контекстные сценарии:** проверить поведение модели при смене темы диалога оператором (Guardrail)[cite: 3].
|
||||
- [x] **UI и очистка:** проверить ручное редактирование через кнопку в окне чата и последующую очистку контекста (`db_purge_ephemeral_messages`)[cite: 3].
|
||||
- [x] **Нативные вызовы:** проверить добавление, редактирование и удаление пунктов через нативные вызовы модели (`db_prompt_node_edit`).
|
||||
- [x] **Контекстные сценарии:** проверить поведение модели при смене темы диалога оператором (Guardrail).
|
||||
- [x] **UI и очистка:** проверить ручное редактирование через кнопку в окне чата и последующую очистку контекста (`db_purge_ephemeral_messages`).
|
||||
- [x] **Строгий вызов Базы Знаний:** внедрено правило 2.9 в системный промпт для пресечения текстовой имитации вызова `db_get_rules`.
|
||||
|
||||
---
|
||||
|
||||
## 6. Распространение архитектурного паттерна на модуль задач (`tasks`) `[ЗАВЕРШЕНО]`
|
||||
- [x] **Масштабирование UI задач:**
|
||||
- Увеличена ширина карточки до `max-w-4xl` и динамическая высота скролла до `70vh`[cite: 3].
|
||||
- Реализованы переключатели фильтрации: «В работе» (по умолчанию), «В планах», «Готово», «Все»[cite: 3].
|
||||
- Разделены кнопки действия: «В работу» (для плановых) и «Готово» (для текущих)[cite: 3].
|
||||
- Увеличена ширина карточки до `max-w-4xl` и динамическая высота скролла до `70vh`.
|
||||
- Реализованы переключатели фильтрации: «В работе» (по умолчанию), «В планах», «Готово», «Все».
|
||||
- Разделены кнопки действия: «В работу» (для плановых) и «Готово» (для текущих).
|
||||
- [x] **Инлайн-редактирование карточки задачи:**
|
||||
- Плавная трансформация карточки в 3-строчную форму (текст, дата со встроенным пикером, выпадающий список важности)[cite: 3].
|
||||
- Отображение даты создания задачи[cite: 3].
|
||||
- Сохранение через REST API эндпоинт `PATCH /api/v1/tasks/{id}`[cite: 3].
|
||||
- Плавная трансформация карточки в 3-строчную форму (текст, дата со встроенным пикером, выпадающий список важности).
|
||||
- Отображение даты создания задачи.
|
||||
- Сохранение через REST API эндпоинт `PATCH /api/v1/tasks/{id}`.
|
||||
- [x] **Детерминированный Fast-Path и двухфазное удаление:**
|
||||
- Мгновенная смена статусов без задержек LLM[cite: 3].
|
||||
- Карточка подтверждения удаления с автоочисткой контекста[cite: 3].
|
||||
- Мгновенная смена статусов без задержек LLM.
|
||||
- Карточка подтверждения удаления с автоочисткой контекста.
|
||||
- [x] **Генерация отчетов задач в Markdown:**
|
||||
- Добавлен инструмент `db_export_tasks_markdown` для формирования Markdown-файла с группировкой по модулям и чекбоксами `[x]` / `[ ]`[cite: 3].
|
||||
- Реализован роутер безопасной отдачи файлов с сохранением имени (`/api/v1/files/download/...`)[cite: 3].
|
||||
- Добавлен инструмент `db_export_tasks_markdown` для формирования Markdown-файла с группировкой по модулям и чекбоксами `[x]` / `[ ]`.
|
||||
- Реализован роутер безопасной отдачи файлов с сохранением имени (`/api/v1/files/download/...`).
|
||||
- [x] **Доменная консолидация задач:**
|
||||
- Реализован консолидированный инструмент `db_tasks_edit(action: ["ADD", "UPDATE", "DELETE", "EXPORT"], ...)`[cite: 3].
|
||||
- Реализован консолидированный инструмент `db_tasks_edit(action: ["ADD", "UPDATE", "DELETE", "EXPORT"], ...)`.
|
||||
|
||||
---
|
||||
|
||||
## 7. Распространение на модуль снапшотов (`snapshots`) `[ЗАВЕРШЕНО]`
|
||||
- [x] **Поддержка Y-снапшотов:** универсальный парсинг и поиск по `snapshot_id LIKE 'Y%'` и срезам за 22:00:00[cite: 3].
|
||||
- [x] **Single Active Snapshot View:** сохранение активного среза в контексте для аналитики с автоматической ротацией и зачисткой при запросе новых дат[cite: 3].
|
||||
- [x] **Поддержка Y-снапшотов:** универсальный парсинг и поиск по `snapshot_id LIKE 'Y%'` и срезам за 22:00:00.
|
||||
- [x] **Single Active Snapshot View:** сохранение активного среза в контексте для аналитики с автоматической ротацией и зачисткой при запросе новых дат.
|
||||
- [x] **Интерактивный UI с чекбоксами и защитой срезов:**
|
||||
- Чекбоксы в строках дневных срезов и кнопка «Выбрать все» в шапке[cite: 3].
|
||||
- Защита итогового вечернего среза Y (иконка замочка `🔒`, блокировка выбора)[cite: 3].
|
||||
- Динамическая кнопка «Удалить выбранные (N)» в подвале карточки[cite: 3].
|
||||
- Чекбоксы в строках дневных срезов и кнопка «Выбрать все» в шапке.
|
||||
- Защита итогового вечернего среза Y (иконка замочка `🔒`, блокировка выбора).
|
||||
- Динамическая кнопка «Удалить выбранные (N)» в подвале карточки.
|
||||
- [x] **Детерминированный Fast-Path удаления срезов:**
|
||||
- Двухфазное подтверждение удаления (одиночное и пакетное) с корректным счётчиком количества удаляемых элементов[cite: 3].
|
||||
- Защита от сброса фильтра даты (`query_date`) при обновлении карточки после удаления[cite: 3].
|
||||
- Двухфазное подтверждение удаления (одиночное и пакетное) с корректным счётчиком количества удаляемых элементов.
|
||||
- Защита от сброса фильтра даты (`query_date`) при обновлении карточки после удаления.
|
||||
|
||||
---
|
||||
|
||||
@@ -109,39 +110,67 @@
|
||||
|
||||
---
|
||||
|
||||
## 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 Орион при отсутствии подходящего среза.
|
||||
## 10. Разделение генераторов и почасовые срезы `[ЗАВЕРШЕНО]`
|
||||
- [x] Разделение логики генерации на `svodka_generator.py` и `otchet_generator.py`.
|
||||
- [x] Перевод времени суточного среза `Y` на `23:59:59`.
|
||||
- [x] Интеллектуальный поиск срезов `services/snapshots/finder.py` (Snap-to-Grid ±20 мин).
|
||||
- [x] Флаг `--time` и интерактивный help в `main_etl.py`.
|
||||
- [x] Флаг `--export-only` для почасового крона.
|
||||
- [x] Политика ночной ротации промежуточных срезов `services/snapshots/retention.py`.
|
||||
- [x] Исправление целочисленного инкремента `snapshot_id`.
|
||||
|
||||
---
|
||||
|
||||
## 11. Интеллектуальный кадровый арбитраж ДО генерации отчетов `[В ПЛАНАХ]`
|
||||
- [ ] **Двухконтурный запуск ИИ:**
|
||||
- [ ] Перенос арбитража не сопоставившихся персон на этап [2.5] ДО сохранения Excel-файлов `сводка.xlsx` и `отчет.xlsx`.
|
||||
## 11. Стабилизация генератора отчетов и верстки `[ЗАВЕРШЕНО]`
|
||||
- [x] **Миграция на `XlsxWriter`:** полный перевод экспорта книг (`scud_export.py`, `excel_exporter.py`) на чистый генератор, устранивший ошибки OpenXML и окна восстановления при открытии.
|
||||
- [x] **Интерактивные группировки в Сводке:** восстановление сворачивания категорий по умолчанию (`level=1`, `collapsed=True`) и кнопок управления уровнями `[+]`/`[-]` (`outline_settings(symbols_below=False)`).
|
||||
- [x] **Компактная экранная верстка Детального отчета:** центрирование столбца «Подразделение», расширение столбца «ФИО» (+10%, ширина 33), оптимизация ширины колонок «Первая активность» (11) и «Отклонение от нормы» (11) для отображения без горизонтальной прокрутки.
|
||||
- [x] **Защита от блокировок занятых файлов (Fallback Timestamp):** механизм перехвата `FileCreateError`/`OSError` в `safe_close_workbook` с сохранением копии при открытом в Excel файле.
|
||||
- [x] **Безопасная синхронизация 1С с сетевой шары:** переход на `shutil.copyfile` в `share_copier.py` для устранения сбоев прав доступа (`Operation not permitted`) на SMB/CIFS-ресурсах.
|
||||
|
||||
---
|
||||
|
||||
## 12. UI/UX веб-интерфейса и скроллинг ленты сообщений `[ЗАВЕРШЕНО]`
|
||||
- [x] **Паттерн Gemini-скролла:** реализация функции `scrollToUserMessageTop` в `core.js`, позиционирующей свежий вопрос пользователя строго по верхней кромке видимой области.
|
||||
- [x] **Полное скрытие истории:** предыдущие объемные ответы модели гарантированно вытесняются за верхний край экрана.
|
||||
- [x] **Стабилизация панели ввода:** настройка `padding-bottom: 80vh` для `#chat-messages-container` в `index.html`, обеспечивающая необходимый запас высоты прокрутки без сдвига строки ввода текста.
|
||||
|
||||
---
|
||||
|
||||
## 13. Интеллектуальный кадровый арбитраж ДО генерации отчетов `[В ПЛАНАХ]`
|
||||
- [ ] **Двухконтурный вызов ИИ:** перенос арбитража не сопоставившихся персон на этап [2.5] ДО сохранения Excel-файлов `сводка.xlsx` и `отчет.xlsx`.
|
||||
- [ ] **Якорный табельный номер (TabNo Matching):**
|
||||
- [ ] Извлечение `TabNo` из MS SQL Орион (`pList.TabNo`) и MS SQL 1С:ЗУП.
|
||||
- [ ] Добавление колонок `scud_tab_no` и `zup_tab_no` в SQLite (`scud_logs`, `zup_staff`, `person_identity_mapping`).
|
||||
- [ ] Защита от смены фамилий и опечаток через неизменяемый табельный номер.
|
||||
- [ ] **Динамическая инвалидация кэша связок:**
|
||||
- [ ] Автоматическая отбраковка записей кэша при увольнении сотрудника или несовпадении подразделения.
|
||||
- [ ] Извлечение `TabNo` из MS SQL СКУД Орион и 1С:ЗУП.
|
||||
- [ ] Добавление колонок `scud_tab_no` и `zup_tab_no` в SQLite.
|
||||
- [ ] Защита от смены фамилий и опечаток через инвариант табельного номера.
|
||||
- [ ] **4-уровневая система предохранителей (Guardrails):**
|
||||
- Уровень 1: Точный матч ФИО (100%).
|
||||
- Уровень 2: Матч по табельному номеру при расхождении ФИО.
|
||||
- Уровень 3: Валидация кэша `person_identity_mapping` с проверкой актуальности статуса в 1С.
|
||||
- Уровень 4: ИИ-арбитраж с записью верифицированной связки в кэш.
|
||||
|
||||
---
|
||||
|
||||
## 12. Изолированная песочница кода (Code Execution Sandbox Engine) `[В ПЛАНАХ]`
|
||||
## 14. Изолированная песочница кода (Code Execution Sandbox Engine) `[В ПЛАНАХ]`
|
||||
- [ ] **Docker/gVisor контур:**
|
||||
- Создание изолированного контейнера без доступа к внешней сети (network: none) с ограниченными лимитами по памяти и CPU (cgroups)[cite: 3].
|
||||
- Настройка безопасного монтирования только необходимых CSV/Parquet-файлов данных в режиме Read-Only[cite: 3].
|
||||
- Создание изолированного контейнера без доступа к внешней сети (network: none) с ограниченными лимитами по памяти и CPU (cgroups).
|
||||
- Настройка безопасного монтирования только необходимых CSV/Parquet-файлов данных в режиме Read-Only.
|
||||
- [ ] **Динамические Python/Pandas вычисления:**
|
||||
- Инструмент генерации и безопасного выполнения скриптов агрегации и аналитики данных СКУД / 1С на лету[cite: 3].
|
||||
- Перехват stdout/stderr, сбор результатов расчетов и графиков с передачей в UI-чата[cite: 3].
|
||||
- Инструмент генерации и безопасного выполнения скриптов агрегации и аналитики данных СКУД / 1С на лету.
|
||||
- Перехват stdout/stderr, сбор результатов расчетов и графиков с передачей в UI-чата.
|
||||
|
||||
---
|
||||
|
||||
## 15. Архитектура обработки событий турникетов и детализация проходов (Сырые логи СКУД) `[В РАБОТЕ]`
|
||||
- [ ] **Итерация 1: Устранение фантомных выходов в боевом SQL (`scud_export.py`):**
|
||||
- [ ] Перестроить блок `CASE WHEN` определения `Direction`: приоритет отдавать физическому направлению контроллера (`log.Mode = 1` -> `'IN'`, `log.Mode = 2` -> `'OUT'`).
|
||||
- [ ] Исключить универсальные коды событий `28` (разблокировка створки) и `32` (проворот турникета) из жесткого перечня `'IN'`, так как они зеркальны для обоих направлений.
|
||||
- [ ] Закрепить расчет первого входа `FirstIn` и последнего выхода `FilteredLastOut` (строго `OUT` позже `FirstIn`).
|
||||
- [ ] **Итерация 2: DDL-схема и таблица сырых событий (`core/schema.py`):**
|
||||
- [ ] Создать таблицу `scud_events_raw` (поля: `log_date`, `time_val`, `hoz_organ`, `fio_clean`, `event_code`, `mode`, `direction`, `created_at`).
|
||||
- [ ] Настроить индексы `idx_raw_date_fio` и `idx_raw_mode` для быстрых выборок.
|
||||
- [ ] **Итерация 3: Конвейер выгрузки сырых событий (`services/scud_export.py`):**
|
||||
- [ ] Добавить сохранение всех фактов физических проходов (`Event = 32` / `Event = 28`) в `scud_events_raw` параллельно с формированием агрегированного снапшота в `scud_logs`.
|
||||
- [ ] **Итерация 4: Модуль оперативного присутствия и внутридневного учета:**
|
||||
- [ ] Реализовать инструмент «Кто прямо сейчас в здании» по последнему зафиксированному `Mode` сотрудника за текущие сутки.
|
||||
- [ ] Подготовить расчет реального суммарного времени нахождения на рабочем месте с учетом перекуров, обедов и выходов за периметр.
|
||||
Reference in New Issue
Block a user