11 KiB
Модель данных
1. Назначение документа
Этот документ фиксирует целевую формальную модель данных платформы. Его цель - определить такие структуры, которые можно без существенных изменений перенести в:
- Rust domain types;
- HTTP DTO;
- структуру таблиц БД;
- runtime-представление операций и агентов;
- UI-формы и конфигурационные экраны.
2. Общие принципы модели
2.1. Одна операция - один интеграционный контракт
Каждая Operation соответствует одному интеграционному контракту:
- GraphQL -> один конкретный
queryилиmutation; - gRPC -> один unary method или один server-streaming method в bounded execution mode;
- REST -> один endpoint-сценарий.
Однако MCP tool публикуется не напрямую из operation, а через AgentOperationBinding внутри конкретного Agent.
2.2. Внутренний транспортный формат - JSON
Независимо от внешнего протокола внутри системы данные представлены в JSON-ориентированном виде.
2.3. Mapping всегда явный
Даже если система умеет строить черновой mapping по примерам данных, итоговая конфигурация mapping сохраняется явно.
2.4. JSONPath как единый язык адресации
Для input и output mapping используется JSONPath.
2.5. Workspace - обязательная граница данных
Все продуктовые сущности принадлежат одному Workspace.
Минимальный набор workspace-scoped сущностей:
SecretSecretVersionOperationOperationVersionAuthProfileAgentPlatformApiKeyInvocationLogUsageRollup
2.6. YAML как формат обмена конфигурацией
Помимо канонической JSON-модели система поддерживает импорт и экспорт конфигураций в YAML.
2.7. Streaming operation обязана быть bounded
Если операция использует upstream streaming, она должна работать в одном из execution modes:
windowsessionasync_job
Бесконечный passthrough stream не является допустимой моделью Operation.
2.8. Execution model важнее transport-specific особенностей
Каждая операция в системе определяется двумя измерениями:
protocolexecution_mode
Это позволяет описывать:
- REST unary;
- REST SSE window;
- gRPC server-stream session;
- WebSocket event feed;
- SOAP request-response;
в рамках одной общей модели runtime и MCP publishing.
3. Корневые сущности
3.1. Workspace
Поля:
idslugdisplay_namestatussettingscreated_atupdated_at
Назначение:
- логическая изоляция команд;
- scoping для операций, агентов, ключей и логов;
- основа для multi-tenant MCP endpoints.
3.2. Operation
Поля:
idworkspace_idnamedisplay_namecategoryprotocolstatusversiontargetinput_schemaoutput_schemainput_mappingoutput_mappingexecution_configtool_descriptionsamplesgenerated_draftconfig_exportstreaming_configcreated_atupdated_atpublished_at
3.3. Agent
Agent - пользовательская MCP-поверхность, которая собирает ограниченный набор published operations.
Поля:
idworkspace_idslugdisplay_namedescriptionstatuscurrent_draft_versionlatest_published_versioncreated_atupdated_atpublished_at
3.4. AgentVersion
Снимок конфигурации агента.
Поля:
agent_idversionstatusinstructionstool_selection_policybindingscreated_at
3.5. AgentOperationBinding
Связь published operation с agent version.
Поля:
operation_idoperation_versiontool_nametool_titletool_description_overrideenabled
3.6. Secret
Секрет для доступа к внешней системе.
Поля:
idworkspace_idnamekindstatuscurrent_versioncreated_atupdated_at
Значение:
- plaintext не возвращается в list/get endpoints;
- текущее значение хранится в зашифрованном виде через
SecretVersion; - rotate создает новую версию секрета без потери ссылочной целостности.
3.7. SecretVersion
Зашифрованное значение секрета.
Поля:
secret_idversionciphertextkey_versioncreated_at
3.8. AuthProfile
Используется только для доступа к внешним системам.
Поля:
idworkspace_idnamekindconfig
Принцип:
AuthProfileне хранит plaintext;- config ссылается на
secret_idили паруsecret_id, если auth-схема составная; - runtime применяет profile к запросу только в момент вызова upstream.
3.9. PlatformApiKey
Отдельная сущность для доступа к самой платформе.
Поля:
idworkspace_idnameprefixscopesstatuscreated_atlast_used_at
Секрет:
- полный secret показывается только один раз при создании;
- в persistent storage сохраняется только
secret_hash.
3.10. User
Поля:
idemaildisplay_namepassword_hashstatuscreated_at
Пароль:
- хранится только как
Argon2idhash; - plaintext пароль не сохраняется;
- верификация использует
password_pepperиз env.
3.11. UserSession
Поля:
iduser_idsecret_hashstatusexpires_atlast_seen_atcreated_at
Секрет:
- браузеру выдается только opaque session token;
- в persistent storage сохраняется только
secret_hash; - подпись и верификация используют
session_secretиз env.
3.12. Membership
Поля:
workspace_iduser_idrolecreated_at
3.13. InvitationToken
Поля:
idworkspace_idemailrolestatusexpires_atcreated_at
Токен:
- полный invite token показывается только один раз при создании;
- в persistent storage сохраняется только
token_hash.
3.14. InvocationLog
Продуктовая запись о вызове tool.
Поля:
idworkspace_idagent_idoperation_idrequest_idlevelstatusduration_mserror_kindrequest_previewresponse_previewcreated_at
3.15. UsageRollup
Агрегированная статистика по периоду.
Поля:
workspace_idagent_idoperation_idperiod_kindperiod_startcalls_totalcalls_okcalls_errorp50_msp95_msp99_ms
3.16. StreamSession
Поля:
idworkspace_idagent_idoperation_idmodestatuscursorstateexpires_atlast_poll_atcreated_atclosed_at
Назначение:
- хранение bounded session state для streaming tools;
- поддержка
start/poll/stop; - cleanup orphaned и expired sessions.
3.17. AsyncJobHandle
Поля:
idworkspace_idagent_idoperation_idstatusprogressresulterrorexpires_atcreated_atupdated_atfinished_at
Назначение:
- поддержка
start/status/result/cancelдля long-running upstream actions.
4. Target
Target описывает конкретный внешний вызов. Это discriminated union по протоколу.
4.1. RestTarget
kindbase_urlmethodpath_templatestatic_headers
4.2. GraphqlTarget
kindendpointoperation_typeoperation_namequery_templateresponse_path
4.3. GrpcTarget
kindserver_addrpackageservicemethoddescriptor_refdescriptor_set_b64
4.4. WebSocketTarget
kindurlsubprotocolssubscribe_message_templateunsubscribe_message_templatestatic_headers
4.5. SoapTarget
kindwsdl_refservice_nameport_nameoperation_nameendpoint_overridesoap_versionsoap_actionbinding_styleheadersfault_contractmetadata
5. ProtocolOptions
ProtocolOptions хранит protocol-specific runtime tuning, который не должен смешиваться с общей ExecutionConfig.
5.1. GrpcProtocolOptions
use_tls
5.2. WebsocketProtocolOptions
heartbeat_interval_msreconnect_max_attemptsreconnect_backoff_ms
5.3. SoapProtocolOptions
use_tlsvalidate_certificatews_security_profile
6. XML normalization model
Для SOAP/XSD-пайплайна crank-schema теперь фиксирует XML-origin metadata отдельными code-level types:
XmlNodeKindXmlQualifiedNameXmlSchemaBinding
Они описывают:
- является ли узел element / attribute / text;
- локальное имя и namespace;
- repeated / nillable semantics.
7. Schema
Schema - нормализованное описание входа или выхода.
Поддерживаются:
- скалярные поля;
- вложенные объекты;
- массивы;
- enum;
- nullable-поля;
oneofдля protobuf.
8. Принцип совместимости
Если UI требует сущность, которой нет в текущем backend, эта сущность должна быть сначала явно добавлена в эту модель данных, а уже потом в код и БД.
Для upstream credentials это означает:
- placeholder-строки вида
${secrets.API_KEY}не считаются реальной моделью данных; - рабочая продуктовая модель строится только через
Secret+AuthProfile.
Для Operations и Wizard дополнительный уровень контрактной детализации закреплен в:
docs/operations-workspace-contracts.md