Референсные шаблоны комнат
FEAT-032 добавляет три неизменяемых контракта шаблонов версии 2.0.0. Первое развёртывание использует каталог Wave 2: существующие записи для создания комнат остаются активными до явной активации с защитными проверками. При запуске новый каталог никогда не активируется, а комнаты не переносятся.
| Шаблон | Зафиксированная сцена | Места | Логические поверхности |
|---|---|---|---|
personal-room-basic@2.0.0 |
personal-workspace-v1@0.4.2 |
1 | workspace-main |
meeting-room-basic@2.0.0 |
warm-modern-meeting-room-candidate-01@0.3.4 |
8 | debug-main, whiteboard-wall |
presentation-room-basic@2.0.0 |
presentation-room-v1@0.4.2 |
8 | debug-main |
Ревизии репозитория, размеры файлов и зафиксированные хеши SHA-256 лежат в packages/templates/src/product-room-definitions.ts. Прежние определения 0.1.0 и 1.0.0 не меняются. Трансформациями физических поверхностей управляет геометрия сцены, а ID и разрешёнными типами медиаобъектов — подписанный контекст шаблона.
Создание и редактирование
GET /api/templates возвращает активный каталог: версию, описание, фактический URL превью и значения по умолчанию. После активации в нём ровно три записи из таблицы выше. Control plane подставляет значения по умолчанию при выборе шаблона и запрашивает подтверждение, прежде чем заменить изменённые значения. Личному пространству нужен владелец; оно остаётся закрытым, гостевой доступ отключён, заметки изначально закрыты. В зале по умолчанию выбран вход с выключенным микрофоном. Явно заданные настройки звука и заметок сохраняются для каждой комнаты отдельно.
POST /api/rooms определяет активную версию на сервере и сохраняет её полный снимок и абсолютный URL сцены. Чтобы использовать текущую версию, не передавайте templateVersion или передайте именно эту версию. Не передавайте templateSnapshot и sceneBundleUrl референсной сцены. Создание комнаты напрямую через API и через control plane использует одну и ту же материализацию.
Ошибки:
| Входные данные | HTTP / ошибка |
|---|---|
| Неизвестный шаблон | 400 / unknown_template |
| Некорректный формат версии | 400 / invalid_template_version |
| Неизвестная версия | 400 / unknown_template_version |
| Известная, но не текущая версия | 409 / template_version_not_current |
| Устаревший шаблон | 409 / deprecated_template |
| Снимок от клиента | 400 / server_owned_template_snapshot |
| Замена референсной сцены | 409 / reference_scene_override_not_allowed |
| Смена шаблона или версии через PATCH | 409 / template_change_not_supported |
| Не указан владелец личного пространства | 400 / missing_personal_room_owner |
| Публичное личное пространство / гостевой доступ | 400 / personal_room_must_be_private / personal_room_guest_access_forbidden |
| Замена владельца личного пространства | 409 / personal_room_owner_immutable |
Существующие комнаты старого формата можно редактировать, их зафиксированная версия и URL сцены сохраняются. PATCH для референсной комнаты меняет только разрешённые настройки комнаты и проекцию roomConfig в снимке. Заменить политику или сцену, которые принадлежат версии, он не может. Runtime проверяет манифест сцены и байты самодостаточного GLB до разбора и отрисовки; при ошибке контрольной суммы или отсутствии обязательной поверхности показывается явная диагностика перехода на резервную сцену.
Ассеты при самостоятельном запуске
По умолчанию ассеты берутся из jsDelivr по репозиторию и полному SHA коммита, поэтому их адреса неизменяемы. При необходимости задайте для API ROOM_TEMPLATE_ASSET_BASE_URL=https://mirror.example/scenes. Скопируйте побайтно идентичные файлы по пути:
<mirror-root>/<owner>/<repository>/<full-commit-sha>/<locked-relative-path>
Добавьте зафиксированный корневой manifest.json и все четыре файла пакета. Отдавайте их с CORS, доступным браузеру, правильными типами содержимого и неизменяемым кешированием. В production обязателен HTTPS. Учётные данные в URL, строки запроса, фрагменты и выход за пределы каталога отклоняются. Это хранилище не связано с хранилищем загрузок документов и сцен. Изменения зеркала влияют только на превью в каталоге и на будущие комнаты; существующие абсолютные URL комнат остаются зафиксированными и должны оставаться доступными.
Проверка у себя
Перед тестами пакетов выполните сборку. Используйте одноразовую базу PostgreSQL через VRATA_TEST_POSTGRES_URL; для репетиции с изменением данных укажите в VRATA_TEMPLATE_ROLLBACK_STORAGE_MODULE собранный модуль хранилища API из checkout той ревизии, на которую делается откат. CI собирает этот checkout автоматически. node tools/fetch-reference-template-fixtures.mjs скачивает и проверяет зафиксированные ассеты; изолированный референсный e2e использует отдельную схему PostgreSQL на каждый запуск и побайтно идентичное HTTP-зеркало.
Запустите pnpm build, pnpm lint, pnpm typecheck, pnpm test, шесть проверок зафиксированных шаблонов и сцен, а затем полный pnpm test:e2e. Если выбираете нестандартные тестовые порты, задайте не только E2E_API_PORT, но и BASE_URL, чтобы фикстуры браузера и фикстуры запросов обращались к одному серверу.
Источник: docs/reference-room-templates.md в vrata-labs/platform на ревизии 380b2e7ff1dd, лицензия Apache-2.0. GitHub