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

478 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}`
Что еще не хватает:
- финальная договоренность по 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` для первых двух экранов.