Space types (типы пространств)
Расширяемая классификация Space: одно поле в core-сущности + registry метаданных и UI на форме создания. Позволяет расширениям настраивать создание и runtime Space без форка ядра и без жёсткой связи между пакетами.
Модель
| Слой | Что это |
|---|---|
| Core field | Space.spaceTypeId: string — идентификатор типа |
| Default | standard — «Стандартный», регистрируется ядром |
| Registry | backend.spaceTypes — метаданные типов (label, extension owner) |
| Create UI | app.spaceCreatePanels — Vue-компонент доп. полей на форме создания per type |
| Runtime UI | app.spaceTypeViews — опциональные отличия экрана Space (секции, баннеры) |
Тип Space не меняет ACL ядра (owner / editor / viewer). Расширения добавляют свои abilities и entity fields поверх.
mermaid
flowchart LR
subgraph core [Ядро]
ST[Space.spaceTypeId]
FORM[CreateSpaceDialog]
end
subgraph reg [Registries]
BT[backend.spaceTypes]
CP[app.spaceCreatePanels]
TV[app.spaceTypeViews]
end
subgraph ext [Расширения]
AF[ai-flow → automatic]
SM[space-methodology → guided]
end
BT --> FORM
CP --> FORM
ST --> TV
AF --> BT
AF --> CP
SM --> BT
SM --> CPCore: тип standard
Ядро регистрирует встроенный тип:
spaceTypeId | Label | Назначение |
|---|---|---|
standard | Стандартный | Обычное хранилище артефактов; default при создании |
Без включённых расширений форма создания — имя, описание, тип (один вариант). Дерево артефактов и agent_edit работают как в v3 core.
Registry backend.spaceTypes
Расширение объявляет тип:
typescript
ctx.registerSpaceType({
id: 'ai-flow.automatic',
label: 'Автоматический (AI-flow)',
description: 'Space создаётся и заполняется оркестратором по пресету',
extensionId: '@artiroute/ai-flow',
// опционально: скрыть из UI если extension disabled
selectableOnCreate: true,
});Правила:
id— namespaced, уникален глобально (<extension>.<slug>).- Ядро валидирует
spaceTypeIdпри create/update: значение должно быть в объединённом каталоге (standard+ зарегистрированные типы). - Смена типа после создания — запрещена (immutable) или только admin policy (решение при реализации host).
Форма создания Space
Host CreateSpaceDialog:
- Поле «Тип пространства» — select из
backend.spaceTypes.entries()(всегда естьstandard). - При смене типа — монтирует panel из
app.spaceCreatePanelsдля выбранногоspaceTypeId. - Submit: core create Space + extension panels передают payload в create mutation / follow-up API.
typescript
// app.spaceCreatePanels
getExtensionRegistry('app.spaceCreatePanels').register('ai-flow.automatic', {
spaceTypeId: 'ai-flow.automatic',
component: AiFlowCreatePanel, // пресет, bootstrap files, prompts, API hint
order: 10,
});Расширение само рисует panel и валидирует свой payload. Ядро не знает про пресеты и deliverables.
Create mutation (ориентир)
graphql
mutation CreateSpace($input: CreateSpaceInput!) {
createSpace(input: $input) {
id
spaceTypeId
}
}
input CreateSpaceInput {
name: String!
description: String
spaceTypeId: String = "standard"
extensionPayload: JSON # per-type blob от panels; host маршрутизирует по spaceTypeId
}Backend после create вызывает extension hook или dedicated handler по spaceTypeId (например ai-flow стартует run, required-deliverables создаёт слоты из шаблона).
Runtime: app.spaceTypeViews
Опционально — отличия UI открытого Space:
typescript
getExtensionRegistry('app.spaceTypeViews').register('ai-flow.automatic', {
spaceTypeId: 'ai-flow.automatic',
// баннер run, скрыть ручной AI, activity log
components: { banner: AiFlowRunBanner, ... },
});Тип standard — без entry: дефолтный Space UI.
Backend routing по типу
Сервисы расширений и host helpers проверяют space.spaceTypeId:
typescript
if (space.spaceTypeId === 'ai-flow.automatic') {
// orchestrator-only paths
}
if (space.spaceTypeId === 'space-methodology.guided') {
// methodology tab, areas, methodologygen
}Без entityHooks для блокировки core CRUD — только условный UI и extension APIs.
Кто что регистрирует (продуктовые расширения)
| Расширение | spaceTypeId | Create panel | Runtime view |
|---|---|---|---|
| (ядро) | standard | — | default |
| Space methodology | space-methodology.guided | шаблон методологии | вкладка Методология, области |
| AI-flow | ai-flow.automatic | пресет, bootstrap, API | баннер run, activity |
| Artifact review | — | ничего | галочка на артефакте |