# Alpine UI Integration Plan ## 1. Назначение документа Этот документ фиксирует, как переносимый Alpine UI из `apps/ui` должен подключаться к реальному backend. Его задача: - разложить UI по страницам; - показать, что уже поддержано текущим backend; - зафиксировать отсутствующие endpoint-ы и контрактные разрывы; - определить порядок интеграции без хаотичных правок. ## 2. Текущее состояние Сейчас `apps/ui` уже заменен на Alpine.js UI, перенесенный из `test-ui`. Важно: - `apps/ui` теперь является основной UI-кодовой базой; - `test-ui` остается fallback-источником и не должен использоваться как рабочая папка интеграции; - новый UI пока опирается на `localStorage`, mock JSON и локальные сценарии; - backend уже поддерживает `workspace`, `operations`, `agents`, `platform access`, `logs`, `usage`, но не все UI-flow закрыты полностью. ## 3. Принципы интеграции - сначала подключаем страницы, уже совпадающие с текущим backend-контрактом; - затем добавляем недостающие endpoint-ы под уже существующие UI-flow; - только после этого убираем mock JSON и `localStorage`-костыли; - если UI противоречит текущему backend, приоритет у целевой продуктовой модели, но конфликт должен быть разобран явно. ## 4. Page-by-page integration matrix ### 4.1. Operations catalog UI-файлы: - `apps/ui/index.html` - `apps/ui/js/catalog.js` Что UI хочет: - список операций; - фильтры по protocol/category/agent/status; - карточки верхних метрик; - переход в wizard create/edit; - удаление/архивирование; - отображение агентных привязок. Что уже можно подключить: - `GET /api/admin/workspaces/{workspace_id}/operations` - `GET /api/admin/workspaces/{workspace_id}/agents` - `GET /api/admin/workspaces/{workspace_id}/usage` - `PATCH /api/admin/workspaces/{workspace_id}/operations/{operation_id}` - `DELETE /api/admin/workspaces/{workspace_id}/operations/{operation_id}` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/archive` Что еще не хватает: - frontend data adapter, который заменит mock merge на реальные `items/page/page_size/total`; - wiring server-side filters `protocol/category/agent/status/search`; - переключение карточек верхних метрик с seeded summary на реальный usage payload. Что убрать из UI после интеграции: - `crank_ops_overrides` в `localStorage` - merge поверх `data/operations.json` - локальный tombstone/delete flow Простой итог: - эту страницу можно интегрировать первой; - backend уже отдает server-side category, usage summary и agent refs; - каталог уже может работать через реальные `list/delete/edit` вызовы; - следующий шаг здесь только в server-side paging и остальных catalog actions; `target_url` и `target_action` теперь должны приходить из backend summary. ### 4.2. Wizard UI-файлы: - `apps/ui/html/wizard/index.html` - `apps/ui/html/wizard/step*.html` - `apps/ui/js/wizard.js` Что UI хочет: - create operation; - edit operation; - draft/save flow; - test run; - publish; - загрузку samples; - генерацию draft mapping; - gRPC descriptor upload; - import/export. Что уже можно подключить: - `POST /api/admin/workspaces/{workspace_id}/operations` - `GET /api/admin/workspaces/{workspace_id}/operations/{operation_id}` - `PATCH /api/admin/workspaces/{workspace_id}/operations/{operation_id}` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/versions` - `GET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/versions/{version}` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/archive` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/test-runs` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/samples/input-json` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/samples/output-json` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/drafts/generate` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/proto` - `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/descriptor-set` - `GET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/grpc/services` - `GET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/export` - `POST /api/admin/workspaces/{workspace_id}/operations/import` Что еще не хватает: - frontend adapter поверх `OperationDetail` и `OperationVersionDocument`, чтобы wizard перестал хранить edit-state в браузере; - финальное выравнивание step payload c canonical DTO, чтобы create/edit/export/import использовали одну модель на фронте. Что убрать из UI после интеграции: - `sessionStorage`-передачу `wizard_edit` - draft-overrides через `localStorage` - локальное создание operation без backend Простой итог: - wizard почти готов для реального backend; - это основной экран второй очереди после catalog; - базовый create/edit draft flow уже можно посадить на live `create/get version/update` endpoints; - следующий разрыв здесь - test/publish/import/export wiring и полноценный gRPC descriptor-set lifecycle. ### 4.3. Agents UI-файлы: - `apps/ui/html/agents.html` - `apps/ui/js/agents.js` Что UI хочет: - список агентов; - create/edit agent; - выбор операций для агента; - publish agent; - MCP endpoint на агента; - calls today / operation count / key count. Что уже можно подключить: - `GET /api/admin/workspaces/{workspace_id}/agents` - `POST /api/admin/workspaces/{workspace_id}/agents` - `GET /api/admin/workspaces/{workspace_id}/agents/{agent_id}` - `PATCH /api/admin/workspaces/{workspace_id}/agents/{agent_id}` - `DELETE /api/admin/workspaces/{workspace_id}/agents/{agent_id}` - `POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/bindings` - `POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/publish` - `GET /api/admin/workspaces/{workspace_id}/usage` Что еще не хватает: - `POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/versions` - `DELETE /api/admin/workspaces/{workspace_id}/agents/{agent_id}/bindings/{operation_id}` Отдельный конфликт: - UI считает, что агент можно редактировать прямо как рабочую сущность; - backend пока ближе к publish-модели с version snapshot; - нужно решить, edit агента мутирует draft напрямую или всегда создает новую version. Простой итог: - базовый live flow уже закрыт: list/create/edit/delete/bind/publish работают через backend; - `GET /agents` уже отдает `calls_today`, `key_count`, `operation_count`, `operation_ids` и `mcp_endpoint`; - следующий реальный разрыв здесь уже не в CRUD, а в version lifecycle и явном unpublish/archive flow для агентов. ### 4.4. API Keys UI-файлы: - `apps/ui/html/api-keys.html` - `apps/ui/js/api-keys.js` Что UI хочет: - список platform API keys; - create; - one-time reveal; - revoke; - delete; - scopes. Что уже можно подключить: - `GET /api/admin/workspaces/{workspace_id}/platform-api-keys` - `POST /api/admin/workspaces/{workspace_id}/platform-api-keys` - `POST /api/admin/workspaces/{workspace_id}/platform-api-keys/{key_id}/revoke` - `DELETE /api/admin/workspaces/{workspace_id}/platform-api-keys/{key_id}` Что еще не хватает: - финальная договоренность по scope model; - согласование response shape с UI: - `secret` - `prefix` - `status` - `last_used_at` Отдельный конфликт: - UI сейчас обещает scope `deploy` и формулировки про rollback/deployments; - backend этого продуктово не поддерживает; - scope-тексты надо выровнять до интеграции. Простой итог: - эта страница почти закрывается текущим backend; - здесь нужен не новый слой, а выравнивание payload и текстов. ### 4.5. Logs UI-файлы: - `apps/ui/html/logs.html` - `apps/ui/js/logs.js` Что UI хочет: - список invocation logs; - фильтры; - detail row expansion; - live refresh; - status/error/duration. Что уже можно подключить: - `GET /api/admin/workspaces/{workspace_id}/logs` - `GET /api/admin/workspaces/{workspace_id}/logs/{log_id}` Что еще не хватает: - frontend adapter с трансформацией backend response в текущую log-row форму; - polling strategy вместо локального seeded массива; - явная поддержка `debug/info/warn/error` в UI без локального seed; - если нужен live mode, то либо polling, либо отдельный future streaming endpoint Простой итог: - backend foundation для logs уже есть; - страница интегрируется быстро, если заменить seeded `LOGS` на API polling. ### 4.6. Usage UI-файлы: - `apps/ui/html/usage.html` - `apps/ui/js/usage.js` Что UI хочет: - верхние summary cards; - timeline; - breakdown по operations; - p50/p95/p99; - breakdown по agents; - CSV export. Что уже можно подключить: - `GET /api/admin/workspaces/{workspace_id}/usage` - `GET /api/admin/workspaces/{workspace_id}/usage/operations/{operation_id}` - `GET /api/admin/workspaces/{workspace_id}/usage/agents/{agent_id}` Что еще не хватает: - frontend mapping из backend `summary/timeline/operations/agents` в текущие widgets; - `CSV export` endpoint или серверная договоренность, если экспорт не хотим делать на клиенте; - согласование полей latency percentiles в одном формате Простой итог: - usage page можно подключать сразу после logs; - главная работа здесь на frontend adapter, а не на новом backend-ядре. ### 4.7. Workspace setup UI-файлы: - `apps/ui/html/workspace-setup.html` - `apps/ui/js/workspace-setup.js` - `apps/ui/js/workspace.js` Что UI хочет: - create workspace; - edit workspace; - список участников; - приглашения; - смену текущего workspace. Что уже можно подключить: - `GET /api/admin/workspaces` - `POST /api/admin/workspaces` - `GET /api/admin/workspaces/{workspace_id}` - `PATCH /api/admin/workspaces/{workspace_id}` - `GET /api/admin/workspaces/{workspace_id}/members` - `GET /api/admin/workspaces/{workspace_id}/invitations` - `POST /api/admin/workspaces/{workspace_id}/invitations` - `DELETE /api/admin/workspaces/{workspace_id}/invitations/{invitation_id}` Что еще не хватает: - `switch current workspace` как backend-aware UI state, а не `localStorage`; - нормальная серверная модель current user + memberships; - endpoint на удаление участника или изменение роли, если UI хочет это поддерживать Отдельный конфликт: - UI создает workspace локально и сразу считает его текущим; - backend уже умеет создавать workspace, но у нас нет полноценной user-session модели; - значит выбор текущего workspace пока придется держать на клиенте, но список и metadata брать с сервера. Простой итог: - create/edit workspace уже можно подключать; - members/invites тоже частично готовы; - но полноценный switch и role management еще не закрыты. ### 4.8. Settings UI-файлы: - `apps/ui/html/settings.html` - `apps/ui/js/settings.js` Что UI хочет: - профиль пользователя; - security/preferences; - workspace settings; - language switcher. Что уже можно подключить: - частично `GET /api/admin/workspaces/{workspace_id}` - `PATCH /api/admin/workspaces/{workspace_id}` Что еще не хватает: - current user endpoint; - user profile update endpoint; - preferences endpoint; - security/auth settings model Отдельный конфликт: - UI считает, что у нас уже есть app-level user profile; - backend пока не имеет session/user profile API; - страницу стоит разбить: - workspace settings подключать раньше; - profile/security оставить временно mock или read-only. Простой итог: - эту страницу нельзя подключать целиком сразу; - сначала надо отделить workspace settings от пользовательского профиля. ### 4.9. Login UI-файлы: - `apps/ui/html/login.html` - `apps/ui/js/login.js` Что UI хочет: - app-level sign in; - mock SSO button; - user session. Что уже есть реально: - внешний `Basic Auth` на `nginx` Что отсутствует: - session auth backend; - login endpoint; - logout endpoint; - current user endpoint Отдельный конфликт: - это не баг реализации, а отсутствие целого auth слоя; - login page пока не должна позиционироваться как production-ready flow. Простой итог: - пока не интегрировать как реальный backend flow; - оставить как временный mock screen до отдельного решения по auth. ## 5. Отдельные UI-vs-backend конфликты ### 5.1. Login vs Basic Auth UI предполагает встроенный login, backend сейчас защищен внешним `Basic Auth`. Решение: - не делать вид, что login уже рабочий; - отложить интеграцию login до отдельного auth этапа. ### 5.2. Agent draft/edit lifecycle UI редактирует агента напрямую, backend идет к version/publish модели. Решение: - зафиксировать draft agent как редактируемую сущность; - publish должен фиксировать snapshot; - UI не должен скрывать разницу между draft и published. ### 5.3. API key scopes UI вводит scope `deploy`, backend пока не отражает полноценную deploy-подсистему. Решение: - либо урезать scope-тексты; - либо позже расширять platform access под реальный deploy scope. ### 5.4. Workspace switching UI хранит current workspace в `localStorage`. Решение: - на ближайшем этапе оставить client-side current workspace; - данные workspace брать с backend; - позже заменить на session-aware current workspace model. ## 6. Порядок интеграции ### Wave 1 - `Operations catalog` - `Wizard` ### Wave 2 - `Agents` - `API Keys` ### Wave 3 - `Logs` - `Usage` ### Wave 4 - `Workspace setup` - частичный `Settings` ### Wave 5 - `Login` - полноценный session/auth layer ## 7. Ближайший практический шаг Следующий рабочий этап: - реализовать frontend adapters для `Operations catalog` и `Wizard`; - добить backend `PATCH/DELETE/archive` по operations; - убрать `localStorage` overrides и mock `operations.json` для первых двух экранов.