ReadonlyidUnique capability identifier (kebab-case).
Optional ReadonlylabelHuman-readable label (used by studio UI).
Optional ReadonlydescriptionShort description (shown in studio tooltip).
Optional ReadonlygateConfig gate — how the capability is enabled/disabled by profile config.
Optional ReadonlyconfigJSON Schema description of the config block consumed by this capability. Keys match the fields under the capability's config path. Used by studio/form-builder to generate config forms.
Optional ReadonlydependenciesIDs of other capabilities that must be enabled for this one to work.
OptionalloaderOptional dynamic loader invoked on the first ensureLoaded() call.
Should import the capability's runtime bundle and register its handlers.
Called at most once — the registry tracks loaded state.
What a module or plugin passes to
CapabilityRegistry.register().Extends
ICapabilitySchemawith an optionalloaderfor dynamic import. The loader is called once byensureLoaded()— subsequent calls are no-ops.The
loaderis for plugins — a capability whose runtime lives in a separate bundle fetched on first use. In-core capabilities never declare one: they are embarked at build time by their installer appearing in a preset manifest, and left out by omitting it. (The old in-coreloader: () => import('../lazy/<cap>.js')example was removed in S5 withsrc/lazy/— those chunks were re-export shells over code that was eager anyway.)Example