Архитектура
Как расширения загружаются и исполняются в artiroute.
Компоненты
| Компонент | Пакет / путь | Роль |
|---|---|---|
| Extension SDK | @artiroute/extension-sdk | Реестры, resolve, bootstrap API |
| Extension Build | @artiroute/extension-build | Vite-сборка frontend/backend/ai |
| Backend host | apps/backend/src/modules/extensions/ | Discovery, migrations, Feathers, hotplug |
| Frontend host | apps/frontend/src/shared/extensions/ | Host modules, bootstrap, UI bridges |
| AI host | apps/ai-agent-service/ | Загрузка AI drivers и artifact types |
| Data dir | apps/backend/data/extensions/ | Установленные расширения (runtime) |
Bootstrap (frontend)
mermaid
sequenceDiagram
participant App as Frontend App
participant API as Backend /api/extensions
participant SDK as extension-sdk
participant Ext as extension frontend/index.js
App->>API: GET список расширений
App->>SDK: resolveExtensionsForLoad
SDK->>SDK: topo-sort по dependencies
loop каждое расширение
SDK->>Ext: dynamic import
Ext->>SDK: setup(ctx) — register entries
end
App->>App: UI читает реестры- Frontend запрашивает список включённых расширений у backend
resolveExtensionsForLoadвалидирует manifest, implied dependencies, semverinitializeExtensionsимпортирует entry каждого target и вызываетsetup(ctx)- Компоненты хоста читают реестры (
AppSidebar,WidgetRenderer,ExtensionSlotHost, …)
Bootstrap (backend)
Backend host (extension-host.ts):
- Discovery — сканирует
data/extensions/, читаетmanifest.json - Readiness — проверяет targets,
.install-complete - Migrations — выполняет
registerMigrationиз backend setup в schemaext.* - Feathers — монтирует
registerServiceroutes - Hotplug — reload/unload отдельных расширений без полного рестарта (API events)
Bootstrap (AI)
AI-agent-service загружает ai/index.js расширений и регистрирует:
ai.artifactTypes— метаданные генерации (schema, prompts)ai.artifactDrivers— session content, tools, validate/finalize
См. AI: artifact drivers.
Platform Core (backend)
После bootstrap backend extensions могут регистрировать:
backend.spaceAbilities/backend.spaceRolesbackend.entityFieldsbackend.entityHooks
Подробно: Platform Core.
Implied dependencies
Если расширение B в manifest указывает:
json
"extendsRegistries": [{ "registryId": "@owner/custom.actions", "keys": ["x"] }]и реестр @owner/custom.actions объявлен расширением A (declaresRegistries), то B автоматически получает зависимость A: '*'. Setup A выполнится раньше B.
Реестры из KNOWN_HOST_REGISTRY_IDS (например app.sidebar, app.widgets) не создают implied dependency — их объявляет хост.
Expose между расширениями
Расширение может опубликовать API для других:
ts
export default defineExtension((ctx) => {
ctx.defineExpose({ doSomething: () => {} });
});Другие расширения: getExtensionExpose('@owner/ext-id').
Сборка frontend bundle
Frontend target собирается как ES lib с host-shims:
vue,primevue,axiosи др. не попадают в bundle- Subpath imports (
primevue/tag) — catch-all shims через@artiroute/extension-build
Подробнее: Host-модули.
Версионирование
extensionApi: "1"— major API SDK; несовместимость блокирует загрузкуengines.host— semver-диапазон версии хостаextensionDependencies— semver между расширениями
См. Манифест.