# Требования к master-service Источник: `meetings/meeting_1_document.md` + уточнение от тимлида ## Назначение Master-service — это control plane платформы AI-агентов. Он управляет sandbox-контейнерами с AI-Agent, рабочими пространствами пользователей, чатами, пользовательскими файлами, проверкой доступа и выдачей временного p2p-доступа к контейнеру. После старта sandbox и успешной авторизации Master должен оставаться плоскостью управления, а не постоянным data-plane прокси: рабочий трафик к агенту должен идти напрямую по выданному p2p-каналу. ## Границы ответственности ### В scope - оркестрация sandbox - управление workspace и chat volume - хранение чатов? и файлов пользователя - хранение и выдача артефактов - проверка доступа - выдача и отзыв p2p-доступа - учет сессий, TTL и cleanup-процессов - хранение служебных метаданных ### Вне scope - Telegram/Discord/Slack интеграции и их transport-логика - бизнес-логика AI-Agent внутри sandbox - реализация LLM-level защиты от prompt injection - реализация конкретных lambda-tools и browser tools ## Основные сущности - **User** — владелец workspace - **Workspace** — пользовательское хранилище с мягкой квотой 10 GB - **Chat** — изолированная рабочая область внутри workspace - **SandboxSession** — активный runtime AI-Agent для конкретного чата - **AccessLease** — временное право на p2p-доступ к sandbox - **ChatFile** — файл, прикрепленный к чату - **Artifact** — результат, созданный агентом и подготовленный к выдаче наружу - **DependencyBundle** — предзагруженный набор зависимостей tool/runtime - **LambdaToolBundle** — платформенный read-only набор тулов ## Функциональные требования ### 1. Управление workspace и chat storage - **FR-001** Master должен создавать workspace пользователя при первом обращении - **FR-002** Master должен вести мягкую квоту workspace в 10 GB на пользователя без физического резервирования места - **FR-003** Master должен создавать, получать, перечислять и удалять чаты пользователя - **FR-004** Каждый chat должен иметь собственную изолированную директорию с файлами и историей - **FR-005** История сообщений чата в первой версии должна храниться рядом с чатом в файле `history.md` - **FR-006** Master должен сохранять пользовательские вложения в директорию соответствующего чата до запуска или во время работы sandbox - **FR-007** Master должен предоставлять операции списка, чтения метаданных, удаления и очистки файлов чата ### 2. Оркестрация sandbox - **FR-008** Master должен поднимать sandbox-контейнер AI-Agent по первому сообщению или при отсутствии активной sandbox-сессии - **FR-009** Master должен переиспользовать активную sandbox-сессию, пока не истек TTL бездействия - **FR-010** Master должен завершать sandbox после периода неактивности; стартовое значение TTL — около 1 часа, но параметр должен быть конфигурируемым - **FR-011** После завершения sandbox данные чата и workspace должны сохраняться и использоваться при следующем старте - **FR-012** Master должен уметь пересоздать sandbox на другом узле при сохранности данных и доступности нужных volume ### 3. Подключение volume и runtime-ресурсов - **FR-013** При старте sandbox Master должен подключать volume текущего чата - **FR-014** При старте sandbox Master должен подключать volume с dependency cache - **FR-015** При старте sandbox Master должен подключать volume с lambda-tools в режиме read-only - **FR-016** Если используются user-tools, Master должен подключать их так, чтобы агент мог их только исполнять, но не менять - **FR-017** Master должен проверять наличие нужных dependency bundle на текущем узле и при отсутствии инициировать загрузку из внутреннего хранилища ### 4. Доступ и p2p-соединение - **FR-018** Master должен аутентифицировать внутренние запросы от интеграционного слоя и других доверенных сервисов - **FR-019** Master должен авторизовывать доступ по связке user/workspace/chat/sandbox - **FR-020** После успешной проверки доступа Master должен выдавать временные параметры p2p-подключения к sandbox - **FR-021** Выданный p2p-доступ должен быть ограничен по времени и привязан к конкретной sandbox-сессии - **FR-022** Master должен уметь отзывать p2p-доступ при остановке sandbox, смене прав или завершении сессии - **FR-023** Master не должен проксировать постоянный трафик к агенту после выдачи p2p-доступа, кроме управляющих операций ### 5. Хранение чатов, файлов и артефактов - **FR-024** Master должен хранить центральные метаданные о пользователях, чатах, sandbox-сессиях, lease, файлах и артефактах - **FR-025** Master должен отделять метаданные чата в центральной БД от фактической истории сообщений в `history.db` - **FR-026** Master должен поддерживать загрузку артефактов в S3-совместимое объектное хранилище - **FR-027** Master должен хранить связь между артефактом, пользователем, чатом и способом внешней доставки - **FR-028** После подтвержденной отправки артефакт должен быть помечен на удаление или удален по policy ### 6. Lifecycle и cleanup - **FR-029** Master должен отслеживать `last_read` и/или `last_update` для файлов чата - **FR-030** Файлы чата должны автоматически удаляться после 3 дней неактивности - **FR-031** Master должен поддерживать удаление всего workspace после длительной неактивности аккаунта; срок должен быть конфигурируемым - **FR-032** Cleanup должен быть безопасным: нельзя удалять данные активного sandbox или чата с действующим lease ### 7. Наблюдаемость и аудит - **FR-033** Master должен логировать создание и остановку sandbox, подключение volume, выдачу доступа и cleanup-операции - **FR-034** Master должен собирать метрики по активным sandbox, времени запуска, ошибкам старта, cleanup и storage usage - **FR-035** Master должен предоставлять аудитный след по операциям доступа к chat/file/artifact ресурсам ## Нефункциональные требования - **NFR-001** Master должен быть control-plane сервисом и не содержать бизнес-логику AI-Agent - **NFR-002** Все данные разных пользователей должны быть изолированы на уровне путей, mount policy и access policy - **NFR-003** Повторный запрос на создание chat или запуск sandbox не должен приводить к дублированию ресурсов при одинаковом идемпотентном ключе - **NFR-004** Политики TTL, cleanup, квоты и lease должны задаваться конфигом - **NFR-005** Решение должно позволять горизонтально масштабировать Master и пересоздавать sandbox независимо от конкретного инстанса сервиса - **NFR-006** Отказ sandbox не должен приводить к потере chat history и пользовательских файлов - **NFR-007** Все security-чувствительные операции должны быть трассируемы и наблюдаемы ## Явные ограничения первой версии - один master-service отвечает за orchestration и storage metadata - история сообщений хранится в `history.md` внутри chat directory - workspace quota считается по фактическому размеру файлов, без hard reservation - heavy tools и browser automation не выносятся в отдельный сервис, пока это не потребуется - интеграции мессенджеров считаются внешними клиентами master-service ## Открытые вопросы - какой именно transport используется для p2p-доступа: raw TCP, WebSocket, gRPC или другой вариант = WebSocket - какой срок inactivity cleanup для всего аккаунта считается продуктовым дефолтом - нужен ли отдельный API для скачивания chat files наружу или достаточно metadata + object/file gateway - подтверждается ли доставка артефакта внешней интеграцией явно или cleanup идет только по TTL - одна sandbox-сессия должна соответствовать одному chat или допустим multiplex нескольких чатов на один runtime