Files
crank/docs/alpine-ui-integration-plan.md
T
2026-03-30 01:49:32 +03:00

473 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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}`
Что еще не хватает:
- отдельный 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.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}`
Что еще не хватает:
- optional pagination и server-driven cursor, если логи начнут расти;
- отдельный streaming endpoint, если polling перестанет устраивать;
- richer detail metadata, если захотим показывать trace/request ids отдельными виджетами
Простой итог:
- страница уже подключена к live `logs` API;
- текущий `live mode` реализован через 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}`
Что еще не хватает:
- если понадобится agent-specific usage drilldown, для него нужен отдельный экран или таб;
- если понадобится server-side export, можно добавить отдельный CSV endpoint позже;
- quota/limits пока не являются частью backend модели, поэтому страница честно показывает traffic share
Простой итог:
- usage page уже подключена к live `usage` API;
- CSV export сейчас делается на клиенте и этого достаточно для текущего этапа.
### 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` для первых двух экранов.