18 KiB
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.htmlapps/ui/js/catalog.js
Что UI хочет:
- список операций;
- фильтры по protocol/category/agent/status;
- карточки верхних метрик;
- переход в wizard create/edit;
- удаление/архивирование;
- отображение агентных привязок.
Что уже можно подключить:
GET /api/admin/workspaces/{workspace_id}/operationsGET /api/admin/workspaces/{workspace_id}/agentsGET /api/admin/workspaces/{workspace_id}/usagePATCH /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.htmlapps/ui/html/wizard/step*.htmlapps/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}/operationsGET /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}/versionsGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/versions/{version}POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/archivePOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/test-runsPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/samples/input-jsonPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/samples/output-jsonPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/drafts/generatePOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/protoPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/descriptor-setGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/grpc/servicesGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/exportPOST /api/admin/workspaces/{workspace_id}/operations/import
Что еще не хватает:
- server-side current workspace model вместо client-side
localStorage; - дальнейший UX polish вокруг gRPC discovery, потому что server reflection сознательно заменен на descriptor-driven live flow;
- возможные smoke tests для
wizard, чтобы закрепить уже подключенный live contract.
Что убрать из UI после интеграции:
sessionStorage-передачуwizard_edit- draft-overrides через
localStorage - локальное создание operation без backend
Простой итог:
- wizard почти готов для реального backend;
- это основной экран второй очереди после catalog;
- базовый create/edit draft flow уже можно посадить на live
create/get version/updateendpoints; - следующий разрыв здесь - test/publish/import/export wiring и полноценный gRPC descriptor-set lifecycle.
4.3. Agents
UI-файлы:
apps/ui/html/agents.htmlapps/ui/js/agents.js
Что UI хочет:
- список агентов;
- create/edit agent;
- выбор операций для агента;
- publish agent;
- MCP endpoint на агента;
- calls today / operation count / key count.
Что уже можно подключить:
GET /api/admin/workspaces/{workspace_id}/agentsPOST /api/admin/workspaces/{workspace_id}/agentsGET /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}/bindingsPOST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/publishGET /api/admin/workspaces/{workspace_id}/usage
Что еще не хватает:
POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/versionsDELETE /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.htmlapps/ui/js/api-keys.js
Что UI хочет:
- список platform API keys;
- create;
- one-time reveal;
- revoke;
- delete;
- scopes.
Что уже можно подключить:
GET /api/admin/workspaces/{workspace_id}/platform-api-keysPOST /api/admin/workspaces/{workspace_id}/platform-api-keysPOST /api/admin/workspaces/{workspace_id}/platform-api-keys/{key_id}/revokeDELETE /api/admin/workspaces/{workspace_id}/platform-api-keys/{key_id}
Что еще не хватает:
- отдельный usage/last-used update flow, когда ключи реально начнут использоваться в runtime;
- если захотим richer UX, можно добавить server-side pagination и фильтрацию по статусу.
Отдельный конфликт:
- одноразовый
secretдоступен только в create-response, а list endpoint возвращает только metadata; - это уже совпадает с backend, но UX нельзя случайно перевести в режим “показывать ключ повторно”.
Простой итог:
- страница уже сажается на текущий backend без новых ручек;
- live
list/create/revoke/deleteможно считать закрытым; - следующий реальный шаг здесь только в polishing вокруг usage и audit trail.
4.5. Logs
UI-файлы:
apps/ui/html/logs.htmlapps/ui/js/logs.js
Что UI хочет:
- список invocation logs;
- фильтры;
- detail row expansion;
- live refresh;
- status/error/duration.
Что уже можно подключить:
GET /api/admin/workspaces/{workspace_id}/logsGET /api/admin/workspaces/{workspace_id}/logs/{log_id}
Что еще не хватает:
- optional pagination и server-driven cursor, если логи начнут расти;
- отдельный streaming endpoint, если polling перестанет устраивать;
- richer detail metadata, если захотим показывать trace/request ids отдельными виджетами
Простой итог:
- страница уже подключена к live
logsAPI; - текущий
live modeреализован через polling и этого достаточно для текущего этапа.
4.6. Usage
UI-файлы:
apps/ui/html/usage.htmlapps/ui/js/usage.js
Что UI хочет:
- верхние summary cards;
- timeline;
- breakdown по operations;
- p50/p95/p99;
- breakdown по agents;
- CSV export.
Что уже можно подключить:
GET /api/admin/workspaces/{workspace_id}/usageGET /api/admin/workspaces/{workspace_id}/usage/operations/{operation_id}GET /api/admin/workspaces/{workspace_id}/usage/agents/{agent_id}
Что еще не хватает:
- если понадобится agent-specific usage drilldown, для него нужен отдельный экран или таб;
- если понадобится server-side export, можно добавить отдельный CSV endpoint позже;
- quota/limits пока не являются частью backend модели, поэтому страница честно показывает traffic share
Простой итог:
- usage page уже подключена к live
usageAPI; - CSV export сейчас делается на клиенте и этого достаточно для текущего этапа.
4.7. Workspace setup
UI-файлы:
apps/ui/html/workspace-setup.htmlapps/ui/js/workspace-setup.jsapps/ui/js/workspace.js
Что UI хочет:
- create workspace;
- edit workspace;
- список участников;
- приглашения;
- смену текущего workspace.
Что уже можно подключить:
GET /api/admin/workspacesPOST /api/admin/workspacesGET /api/admin/workspaces/{workspace_id}PATCH /api/admin/workspaces/{workspace_id}GET /api/admin/workspaces/{workspace_id}/membersGET /api/admin/workspaces/{workspace_id}/invitationsPOST /api/admin/workspaces/{workspace_id}/invitationsDELETE /api/admin/workspaces/{workspace_id}/invitations/{invitation_id}
Что еще не хватает:
switch current workspaceвсе еще живет на клиенте, а не в session/backend;- endpoint на удаление участника или изменение роли, если UI хочет это поддерживать;
- delete/export workspace lifecycle пока не реализован на backend
Отдельный конфликт:
- current workspace по-прежнему client-side;
- memberships и invitations уже live, но role-management пока read-only;
settingspage не должна дублировать этот flow, пока у нее нет своего backend-контракта
Простой итог:
workspace-setupуже подключен к live backend;- create/edit workspace, refresh списка workspace и invitations работают;
- role management и workspace deletion остаются отдельным следующим этапом.
4.8. Settings
UI-файлы:
apps/ui/html/settings.htmlapps/ui/js/settings.js
Что UI хочет:
- профиль пользователя;
- security/preferences;
- workspace settings;
- language switcher.
Что уже можно подключить:
GET /api/auth/sessionGET /api/auth/profilePATCH /api/auth/profilePOST /api/auth/password- workspace block через
GET /api/admin/workspaces/{workspace_id} PATCH /api/admin/workspaces/{workspace_id}
Что еще не хватает:
- preferences endpoint;
- полноценный advanced security model (
2FA, passkeys, session inventory); - session-aware current workspace model вместо client-side
localStorage.
Отдельный конфликт:
- UI исторически притворялся, что
2FA, passkeys и active sessions уже реализованы; - backend пока дает только live
profileиpassword change, без advanced security lifecycle; - поэтому страница должна честно разделять:
- live
profile; - live
password change; - read-only/security roadmap блоки без fake data.
- live
Простой итог:
- workspace block уже live;
- profile и password change уже live;
- notifications остаются локальным placeholder;
- страницу теперь можно считать частично интегрированной без ложных mock-сценариев.
4.9. Login
UI-файлы:
apps/ui/html/login.htmlapps/ui/js/login.js
Что UI хочет:
- app-level sign in;
- mock SSO button;
- user session.
Что уже есть реально:
- login screen и mock redirect flow
Что уже есть:
- session auth backend;
POST /api/auth/login;POST /api/auth/logout;GET /api/auth/session;- protected page guard через backend session.
Простой итог:
- login уже перешел на live backend flow;
- защищенные страницы проверяют server-side session;
localStorageбольше не должен быть source of truth для auth.
5. Отдельные UI-vs-backend конфликты
5.1. Login vs Basic Auth
Конфликт закрыт. UI использует встроенный login, backend перешел на app-level session auth.
Решение:
- использовать
POST /api/auth/login,POST /api/auth/logout,GET /api/auth/session; - хранить auth state в
HttpOnlycookie; - использовать
localStorageтолько как UI mirror для display state и не считать его source of truth.
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— completedWizard— completed
Wave 2
Agents— completedAPI Keys— completed
Wave 3
Logs— completedUsage— completed
Wave 4
Workspace setup— completed- частичный
Settings— completed
Wave 5
Login— completed- полноценный session/auth layer — completed
7. Ближайший практический шаг
Следующий рабочий этап:
- добить live
Settingsбез заглушек для profile/security; - закрыть
workspace accesslifecycle (roles,member removal,delete/export workspace); - пройти stabilization pass по Alpine UI и убрать оставшиеся client-side fallback patterns.