Files
crank/docs/admin-api.md
T
2026-04-07 00:00:19 +03:00

280 lines
12 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.
# Admin API
## 1. Назначение документа
Этот документ фиксирует целевые HTTP-контракты административного API, через которое UI управляет workspace, operations, agents, platform access и observability.
Для потоковой модели детальные HTTP DTO вынесены отдельно в:
- `docs/streaming-admin-api.md`
## 2. Общие правила API
- все payload по умолчанию в `JSON`;
- import/export конфигурации используют `YAML`;
- все основные ресурсы являются `workspace-scoped`;
- версии operation и agent адресуются явно;
- published operation и published agent - ссылки на конкретные version;
- ошибки валидации возвращаются отдельно от transport errors.
Базовый префикс:
```text
/api/admin
```
## 3. Основные ресурсы
- `workspaces`
- `auth`
- `memberships`
- `invitations`
- `operations`
- `secrets`
- `auth-profiles`
- `agents`
- `platform-api-keys`
- `logs`
- `usage`
- `samples`
- `descriptors`
- `config import/export`
## 4. Workspace-scoped routing
Канонический префикс для UI-driven сценариев:
```text
/api/admin/workspaces/{workspace_id}
```
## 5. Группы endpoints
### 5.1. Workspaces and members
- `GET /api/admin/workspaces`
- `POST /api/admin/workspaces`
- `GET /api/admin/workspaces/{workspace_id}`
- `PATCH /api/admin/workspaces/{workspace_id}`
- `DELETE /api/admin/workspaces/{workspace_id}`
- `GET /api/admin/workspaces/{workspace_id}/members`
- `PATCH /api/admin/workspaces/{workspace_id}/members/{user_id}`
- `DELETE /api/admin/workspaces/{workspace_id}/members/{user_id}`
- `GET /api/admin/workspaces/{workspace_id}/invitations`
- `POST /api/admin/workspaces/{workspace_id}/invitations`
- `DELETE /api/admin/workspaces/{workspace_id}/invitations/{invitation_id}`
- `GET /api/admin/workspaces/{workspace_id}/export`
Контракт:
- `POST /invitations` возвращает metadata invitation и одноразовый `invite_token`;
- `invite_token` доступен только в create-response и не возвращается повторно в list endpoints;
- `PATCH /members/{user_id}` меняет роль участника;
- `DELETE /members/{user_id}` удаляет участника из workspace;
- `GET /export` возвращает JSON snapshot workspace lifecycle-данных;
- `DELETE /workspaces/{workspace_id}` разрешен только `owner`.
### 5.2. Auth and session
- `POST /api/auth/login`
- `POST /api/auth/logout`
- `GET /api/auth/session`
- `GET /api/auth/profile`
- `PATCH /api/auth/profile`
- `POST /api/auth/current-workspace`
- `POST /api/auth/password`
Контракт:
- `POST /login` принимает `email` и `password`;
- при успешном логине backend выставляет `HttpOnly` session cookie;
- `GET /session` возвращает текущего пользователя, memberships и `current_workspace_id`;
- `GET /profile` возвращает текущего пользователя, memberships и `current_workspace_id` для settings UI;
- `PATCH /profile` обновляет `display_name` и `email` текущего пользователя;
- `POST /current-workspace` переключает текущий workspace внутри текущей authenticated session;
- `POST /password` меняет пароль текущего пользователя после проверки `current_password`;
- `POST /logout` инвалидирует текущую session.
### 5.3. Operations
- `GET /api/admin/workspaces/{workspace_id}/operations`
- `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}`
- `DELETE /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}/publish`
- `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/archive`
- `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/test-runs`
- `GET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/export`
- `POST /api/admin/workspaces/{workspace_id}/operations/import`
### 5.4. Samples and descriptors
- `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`
- `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/wsdl`
- `POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/xsd`
- `GET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/grpc/services`
- `GET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/soap/services`
Контракт:
- `POST /descriptors/wsdl` принимает raw WSDL payload и сохраняет inspection metadata для SOAP;
- `POST /descriptors/xsd` принимает supporting XSD artifacts для SOAP operation;
- `GET /soap/services` возвращает нормализованный список `service -> port -> operation` из последнего WSDL текущего draft version.
### 5.5. Upstream auth profiles
- `GET /api/admin/workspaces/{workspace_id}/secrets`
- `POST /api/admin/workspaces/{workspace_id}/secrets`
- `GET /api/admin/workspaces/{workspace_id}/secrets/{secret_id}`
- `POST /api/admin/workspaces/{workspace_id}/secrets/{secret_id}/rotate`
- `DELETE /api/admin/workspaces/{workspace_id}/secrets/{secret_id}`
- `GET /api/admin/workspaces/{workspace_id}/auth-profiles`
- `POST /api/admin/workspaces/{workspace_id}/auth-profiles`
- `GET /api/admin/workspaces/{workspace_id}/auth-profiles/{auth_profile_id}`
- `PATCH /api/admin/workspaces/{workspace_id}/auth-profiles/{auth_profile_id}`
- `DELETE /api/admin/workspaces/{workspace_id}/auth-profiles/{auth_profile_id}`
Контракт:
- `POST /secrets` принимает metadata и plaintext value, но create-response возвращает только metadata;
- `GET /secrets` и `GET /secrets/{secret_id}` возвращают только metadata, `kind`, `status`, `current_version`, `created_at`, `updated_at`, `last_used_at` при наличии;
- `POST /secrets/{secret_id}/rotate` создает новую secret version;
- `DELETE /secrets/{secret_id}` в secret foundation удаляет secret без reference checks; валидация ссылок добавляется в `feat/auth-profile-secret-resolution`;
- `AuthProfile.config` хранит ссылки на `secret_id`, а не placeholder-строки `${secrets.*}`.
### 5.6. Agents
- `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}/versions`
- `GET /api/admin/workspaces/{workspace_id}/agents/{agent_id}/versions/{version}`
- `POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/publish`
- `POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/unpublish`
- `POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/archive`
- `POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/bindings`
- `DELETE /api/admin/workspaces/{workspace_id}/agents/{agent_id}/bindings/{operation_id}`
### 5.7. Platform API keys
- `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}`
Контракт:
- `POST /platform-api-keys` возвращает metadata ключа и одноразовый `secret`;
- `secret` доступен только в create-response;
- list endpoints возвращают только metadata, `prefix`, `status`, `scopes` и `last_used_at`.
- `last_used_at` обновляется при успешной machine-auth аутентификации этим ключом в `mcp-server`.
### 5.8. Observability
- `GET /api/admin/workspaces/{workspace_id}/logs`
- `GET /api/admin/workspaces/{workspace_id}/logs/{log_id}`
- `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}`
Контракт:
- `GET /logs` поддерживает `level`, `search`, `source`, `operation_id`, `agent_id`, `period`, `limit`;
- `period` использует UI-friendly значения `30m`, `1h`, `6h`, `24h`, `7d`, `30d`, `90d`, `this_month`;
- `source` различает `admin_test_run` и `agent_tool_call`;
- `GET /usage` возвращает `summary`, `timeline`, `operations`, `agents` одним ответом;
- detail endpoints по operation и agent возвращают rollup для выбранного периода.
## 6. Page-to-endpoint mapping
### Operations catalog
Нужны:
- список операций;
- удаление операции;
- edit/open operation;
- publish/archive;
- usage summary для карточек и фильтров.
### Wizard
Нужны:
- create/update version;
- test run;
- samples;
- draft generation;
- gRPC descriptor upload и discovery.
- upstream auth selector;
- quick-create secret / auth profile modal.
- execution mode selector;
- streaming config blocks;
- stream test-runs;
- tool family preview.
Детальные DTO и response shapes для экранов `Operations` и `Wizard` зафиксированы отдельно в:
- `docs/operations-workspace-contracts.md`
### Agents
Нужны:
- CRUD агентов;
- bindings к operations;
- publish agent;
- выдача MCP endpoint metadata.
### API Keys
Нужны:
- list/create/revoke/delete platform API keys;
- one-time reveal значения ключа при создании.
### Secrets
Нужны:
- list/create/rotate/delete upstream secrets;
- metadata-only retrieval после создания;
- связь с auth profiles;
- usage references, чтобы оператор видел, где секрет используется.
### Logs
Нужны:
- list logs с фильтрами;
- log detail;
- polling или live refresh strategy.
### Usage
Нужны:
- агрегаты по периодам;
- breakdown по operation;
- breakdown по agent;
- CSV export.
Текущая реализация:
- summary и breakdown считаются по `invocation_logs`;
- materialized `usage_rollups` остаются совместимым storage-слоем для дальнейшей оптимизации, но не являются единственным source of truth в MVP.
## 7. Принцип совместимости
Если UI расходится с текущим backend, приоритет отдается целевой продуктовой модели, но конфликт должен быть явно разобран в `docs/as-is-to-be.md` до начала реализации.