Три аудитории, одна платформа — от чат-бота до enterprise-приложения.
💬
Consumer
Описывает идею в AI-чате → получает работающее приложение. Нулевой порог входа. Как Bubble, но через разговор с AI.
⚙️
Professional
Разработчики и компании. Полный контроль: схемы, хуки, интеграции, процессы. Собственный workspace.
🧩
Plugin Developer
Расширяет платформу. Публикует плагины в marketplace. CLI для разработки, sandbox для тестирования.
2 Ключевой принцип: Everything is an Object
Каждая сущность в системе — типизированный объект с UUID, управляемый через единый ObjectService. Нет специальных таблиц для пользователей, ролей или типов — всё унифицировано.
Object(6ba7b814)← Корневой тип. Каждая сущность IS an Object.
├── ObjectType(8ba7b815)← Тип типов. Self-referential.
├── Attribute(6ba7b810)← Определения атрибутов (code, dataType, isRequired…)
├── AttributeDataType← String, Number, Boolean, Reference…
├── Plugin← Метаданные + статус установки плагинов
├── Tenant← Workspace-изоляция (→ будет Workspace)
├── User, Session, Account← Auth (core module)
├── Role, Permission← RBAC (core module)
├── AuditEntry← Аудит (plugin)
├── MenuItem← Навигация UI (plugin)
└── Employee, Project, Dog…← Пользовательские типы
🔄
Circular Bootstrap
ObjectType — тип самого себя. Object наследуется от ObjectType, а ObjectType от Object. Kernel bootstrap разрешает циклическую зависимость через raw Cypher MERGE.
🔗
Edge-based References
Все связи — Neo4j рёбра REF_*. Создаются/удаляются через стандартный CRUD. Операторы $add/$remove для коллекций. Нет прямого API для рёбер.
📋
Attribute Inheritance
Каждый тип наследует атрибуты от родителей. MetadataCache обходит parentTypeId цепочку. Object даёт 6 базовых атрибутов всем типам.
🔍
Единый API запросов
IQuery — один интерфейс для всего: find({typeCode: 'Role'}) или find({typeCode: 'ObjectType'}). Типы, атрибуты, данные — единообразно.
3 Архитектура слоёв
Строгое разделение на 5 слоёв. Каждый слой взаимодействует только с соседним. Core — sealed package, его внутренности недоступны.
package.json exports блокирует доступ к internals. Только 9 публичных методов IObjectService. Хуки работают через IObjectServiceForHooks (findById, find, count, patch).
🪝
Hook Pipeline
Priority-based execution. RBAC (1000) → Tenant (900) → Audit (500) → Custom. Хуки могут блокировать, модифицировать данные или обогащать результаты.
4 Core Modules: Auth, RBAC, Tenant, Events
4 из 8 «плагинов» — не плагины. Система не работает без них, cross-plugin imports нарушают изоляцию. Решение: выделить в Core Modules с фиксированным порядком инициализации.
Проблемы текущей архитектуры
❌
Cross-Plugin Imports
RBAC импортирует AUTH_TYPE_IDS из ../auth/constants. Audit тоже. EventBus импортируется из IUnifiedPlugin интерфейса. Нарушена изоляция.
❌
Ложная опциональность
Auth/RBAC/Tenant помечены как optional в manifest, но система без них не работает. requestContext уже имеет getTenantId()/getUserId() — «плагинные» концепции в ядре.
• Интерфейс CoreModule (отличен от IUnifiedPlugin) • Фиксированный порядок init, нет uninstall • Core modules по-прежнему используют ObjectService для self-bootstrap
5 Workspace-изоляция
Workspace = развитие текущей Tenant-модели. Все объекты workspace (включая типы!) связаны через REF_objects рёбра. Типы уже scoped per tenant — workspace-изоляция для типов работает.
🏢 Platform Workspace
User: Маша (создатель)
User: Петя (создатель)
Billing, Subscriptions
Kernel types (shared)
💅 Masha's Workspace
ObjectType: Клиент
ObjectType: Запись
ObjectType: Услуга
Object: Клиент "Аня"
Object: Запись "15:00 маникюр"
User: Аня (клиент Маши)
Ключевой инсайт
💡
Types ARE Objects — уже scoped per tenant!
ObjectType имеет typeId = OBJECT_TYPE_TYPE и хранится как обычный Object. TenantHook.beforeQuery уже фильтрует запросы ObjectType по tenant. Workspace-изоляция для типов — уже работает. Не нужна отдельная система!
Как запросы фильтруются
API Request→Middleware: X-Tenant-Id / subdomain→TenantHook.beforeQuery→edgeFilter: REF_objects→Cypher: EXISTS {MATCH}
План реализации
📡
Routing
Subdomain: masha.metacore.app или path: /workspace/:slug/api/v1/...
🔐
Auth per Workspace
Клиенты Маши — отдельные пользователи в её workspace. Не видят другие workspaces.
📦
Per-Workspace Plugins
Каждый workspace устанавливает свой набор плагинов. Plugin types создаются внутри workspace scope.
6 Plugin Registry
Эволюция от захардкоженного manifest к динамическому обнаружению и marketplace.
Зависимости определяют порядок. Параллельные фазы отмечены. Каждая фаза — инкрементальный шаг к полноценной low-code платформе.
Граф зависимостей
Expression Engine←не зависит ни от чегоPlugin Registry←не зависит ни от чегоCore Modules←не зависит ни от чегоWorkspaces←Core Modules + Plugin RegistryProcess Engine←Expression EngineFormSpec v2←Expression EngineAI Chat←Expression Engine + Workspaces
Data LayerObjectService · Neo4j · Workspace Isolation
∞ Итого
MetaCore — граф-нативная платформа где всё является объектом. Sealed core гарантирует стабильность. Hook system даёт расширяемость. Core Modules обеспечивают безопасность. А Workspaces, AI и Process Engine делают её полноценным конструктором приложений.