diff --git a/pr_office.md b/pr_office.md new file mode 100644 index 0000000..4c29633 --- /dev/null +++ b/pr_office.md @@ -0,0 +1,1728 @@ +# ТЕХНИЧЕСКОЕ ЗАДАНИЕ: PMO AI Assistant +## Автоматизация проектного офиса с использованием искусственного интеллекта + +--- + +## 1. РЕШАЕМАЯ ЗАДАЧА + +### 1.1. Бизнес-контекст +Проектный офис компании ведет множество параллельных проектов, по которым регулярно проводятся встречи различных типов (рабочие, оперативные советы, управляющие советы). Текущие проблемы: +- **Ручное ведение протоколов** занимает 30-60% времени встречи +- **Потеря контекста** между встречами — ответственные не помнят статус предыдущих мероприятий +- **Отсутствие единой базы знаний** по проектам — сложно найти информацию по похожим встречам +- **Разрозненность данных** — транскрибации в одном месте, протоколы в другом, мероприятия в третьем +- **Сложность контроля исполнения** — нет автоматического отслеживания просроченных задач + +### 1.2. Целевое состояние +Создать **единый AI-powered сервис** для проектного офиса, который: +- Автоматически транскрибирует аудио встреч (или принимает текстовые исходники) +- Генерирует структурированные протоколы трех типов с учетом истории проекта +- Обеспечивает семантический поиск по всем встречам ("найди встречи, где обсуждали риски по модулю авторизации") +- Формирует актуальный статус проекта и диаграмму Ганта на основе всех мероприятий +- Позволяет редактировать протоколы как текст, так и через AI-чат +- Экспортирует протоколы в DOCX для рассылки подписантам + +### 1.3. Описание сервиса +**PMO AI Assistant** — это веб-приложение (SPA + REST API), которое: +- Работает в браузере (Chrome, Firefox, Edge, Safari последних версий) +- Не требует установки на рабочие станции пользователей +- Интегрируется с корпоративными ВКС (MTS Link, Bitrix24, Яндекс.Телемост) для автоматической загрузки транскрибаций +- Использует LLM (OpenAI-совместимые API) для генерации протоколов +- Хранит данные в PostgreSQL с поддержкой векторного поиска (pgvector) +- Может работать как с облачными, так и с локальными моделями векторизации + +--- + +## 2. СТРАНИЦЫ SPA И ФУНКЦИОНАЛ + +### 2.1. Структура приложения + +``` +/ → Дашборд (обзор всех проектов) +/projects → Таблица проектов (список) +/projects/:id → Карточка проекта (детали) +/meetings → Таблица встреч (список) +/meetings/:id → Карточка встречи (работа с протоколом) +/settings → Настройки системы +/settings/prompts → Управление промптами +/settings/users → Управление пользователями +/settings/integrations → Настройки интеграций (ВКС) +``` + +### 2.2. Детальное описание страниц + +#### **Дашборд (/)** +**Назначение:** Быстрый обзор состояния всех проектов и недавних встреч. + +**Элементы:** +- **Карточки проектов** (Bento Grid): + - Краткое имя проекта + - Текущий этап (цветовой индикатор) + - AI-статус (краткое резюме от ИИ) + - Количество активных/просроченных мероприятий + - Дата последней встречи +- **Лента последних встреч** (Timeline): + - Дата, проект, тип встречи + - Краткое резюме (первые 2 предложения) + - Статус протокола (черновик / утвержден) +- **Виджет "Требует внимания"**: + - Просроченные мероприятия + - Проекты без встреч > 14 дней + - Нерешенные вопросы с высоким приоритетом + +#### **Таблица проектов (/projects)** +**Назначение:** Управление списком проектов, быстрый поиск. + +**Элементы:** +- **Таблица с колонками:** + - Краткое имя (кликабельно → переход в карточку) + - Полное наименование + - Этап (badge с цветом) + - Ответственный ПМ + - AI-статус (краткий текст) + - Дата создания + - Действия (⋮ меню: редактировать, архивировать) +- **Панель фильтров (слева):** + - Текстовый поиск (по всем полям) + - Фильтр по этапу (multi-select) + - Фильтр по ответственному + - Фильтр по дате создания +- **Кнопка "+ Новый проект"** (открывает модальное окно) + +#### **Карточка проекта (/projects/:id)** +**Назначение:** Детальная информация о проекте, история встреч, визуализация. + +**Вкладки:** +1. **Обзор:** + - Карточка проекта (все поля, редактируемые) + - AI-статус (большой блок, кнопка "Обновить статус") + - Диаграмма Ганта (Mermaid.js, интерактивная) + - Статистика: всего встреч, активных мероприятий, просроченных +2. **Встречи:** + - Таблица встреч этого проекта (отфильтрованная) + - Кнопка "+ Новая встреча" +3. **Мероприятия:** + - Сводная таблица всех мероприятий по проекту + - Фильтры: статус, ответственный, срок + - Экспорт в Excel + +#### **Таблица встреч (/meetings)** +**Назначение:** Управление всеми встречами, семантический поиск. + +**Элементы:** +- **Таблица с колонками:** + - Дата + - Проект (ссылка) + - Тип встречи (badge) + - Место + - Ответственный + - Краткое резюме (первые 100 символов) + - Статус протокола +- **Панель фильтров:** + - **Векторный поиск** (текстовое поле: "О чем были встречи?") + - Фильтр по проекту + - Фильтр по дате (range picker) + - Фильтр по ответственному + - Фильтр по типу встречи +- **Кнопка "+ Новая встреча"** + +#### **Карточка встречи (/meetings/:id)** +**Назначение:** Основная рабочая область — загрузка исходников, генерация и редактирование протокола. + +**Вкладки:** +1. **Исходник:** + - Если аудио: плеер + кнопка "Транскрибировать" (показывает прогресс) + - Если текст: редактор транскрибации (textarea с подсветкой синтаксиса) + - Кнопка "Сохранить исходник" +2. **Резюме:** + - Блок с универсальным резюме (генерируется автоматически) + - Кнопка "✏️ Редактировать" (переключает в режим редактирования) + - Кнопка "Перегенерировать" +3. **Протокол:** + - **Три кнопки генерации** (с иконками): + - 📋 Протокол встречи + - ⚡ Протокол оперативного совета + - 👔 Протокол управляющего совета + - **Markdown редактор** (md-editor-v3): + - Split view (редактор + превью) + - Панель инструментов (жирный, списки, таблицы) + - Возможность вставки таблиц (для перечня мероприятий) + - **AI-чат (справа, collapsible):** + - Выделяешь текст в протоколе → пишешь в чат: "Сделай более формальным" + - ИИ стримит ответ, можно принять или отклонить + - **Кнопки действий:** + - 💾 Сохранить черновик + - ✅ Утвердить протокол (триггерит обновление статуса проекта) + - 📥 Экспорт в DOCX + +#### **Настройки (/settings)** +**Вкладки:** +1. **Проекты:** Управление справочником проектов (CRUD) +2. **Пользователи:** Управление доступами (роли: admin, pmo, viewer) +3. **Промпты:** Редактирование системных промптов для генерации протоколов +4. **Интеграции:** Настройка API-ключей для ВКС (MTS Link, Bitrix24, Яндекс.Телемост) +5. **Векторизация:** Выбор режима (OpenAI API / Локальная модель) + +--- + +## 3. ИТОГОВЫЙ ФУНКЦИОНАЛ (MVP) + +### 3.1. Функционал первого этапа (MVP) +✅ Управление проектами (CRUD, поиск, фильтры) +✅ Управление встречами (CRUD, загрузка аудио/текста) +✅ Транскрибация аудио через Whisper API (синхронно) +✅ Генерация универсального резюме встречи +✅ Генерация протоколов трех типов (с учетом истории проекта) +✅ Редактирование протоколов в Markdown +✅ AI-чат для редактирования выделенного текста (стриминг) +✅ Экспорт протокола в DOCX +✅ Векторный поиск по встречам (OpenAI embeddings / локальная модель) +✅ AI-статус проекта (генерируется при утверждении протокола) +✅ Диаграмма Ганта (Mermaid.js) +✅ Интеграция с одной ВКС (например, Яндекс.Телемост) + +### 3.2. Функционал второго этапа +⏳ Очереди задач (BullMQ + Redis) для асинхронной транскрибации и генерации +⏳ WebSocket-уведомления о готовности транскрибации +⏳ Интеграция с остальными ВКС (MTS Link, Bitrix24) +⏳ Расширенная аналитика (дашборды, графики) +⏳ Мобильная адаптация +⏳ Мультиязычность (i18n) + +--- + +## 4. АРХИТЕКТУРА И СТЕК ТЕХНОЛОГИЙ + +### 4.1. Backend +- **Runtime:** Node.js 20+ (LTS) +- **Framework:** Express.js 4.x +- **ORM:** Drizzle ORM (TypeScript-first, легкая, с декларативными миграциями) +- **База данных:** PostgreSQL 15+ с расширением `pgvector` +- **Валидация:** Zod (для runtime-проверок) +- **ИИ-клиент:** OpenAI SDK (официальный) +- **Локальная векторизация:** @xenova/transformers (Hugging Face, ONNX Runtime) +- **Генерация DOCX:** docx (библиотека для создания Word-документов) +- **Аутентификация:** JWT (jsonwebtoken + bcrypt) +- **Логирование:** pino (быстрый структурированный логгер) + +### 4.2. Frontend +- **Framework:** Vue 3 (Composition API, `