Skip to content

Extension points

Core plugins expose extension points that third-party plugins contribute to declaratively through the manifest’s extensions[] array. Each entry names a qualified extension point id and carries the contribution payload:

plugin.json (excerpt)
{
"extensions": [
{
"extensionPoint": "space.appos.core.notifications:channel",
"...": "contribution payload fields (schema owned by the core plugin)"
}
]
}

From the manifest schema (schemas/plugin-v1.json):

Extension contributions (fn-12 typed array) — the manifest-declarative delivery vehicle for core-plugin extension points (actions.definition, views.savedView, surfaces.contribution, sidecars.definition, notifications., input., ledger., llm., recipes/sequences definitions, clipboard EPs, scheduler.triggerKind/condition, entities.*)

Only extensionPoint is required per entry; the remaining fields are validated by the owning core plugin at replay time. Contributions are re-ingested on plugin activation, so manifest-declarative contributions behave identically to runtime-registered ones once bound.

Plugins can also declare their own extension points (extensionPoints manifest field + context.extensionPoints API) for other plugins to contribute to — see ExtensionPointsAPI in the API Reference.

Contributing to an extension point requires the matching contributor permission scope. The scope catalog is the machine-readable signal for which contribution surfaces exist, grouped here by family:

FamilyContributor scopes
clipboardclipboard.contentType.register, clipboard.source.register, clipboard.transform.register, clipboard.destination.register, clipboard.rule.register, clipboard.retention.predicate.register
interPlugininterPlugin.contribute
eventsevents.serializer.register, events.sink.register
storestore.backend.register, store.migrator.register, store.indexer.register
vaultvault.type.register, vault.bridge.register, vault.rotator.register, vault.policy.contribute
actionsactions.register
palettepalette.contribute.scope
schedulerscheduler.trigger.register, scheduler.condition.register, scheduler.action.register
resourcesresources.provider.register
tokenstokens.provider.register
entitiesentities.type.register, entities.computedField.provide
viewsviews.register, views.layoutRenderer.register
surfacessurfaces.contribute.sidebar.top, surfaces.contribute.sidebar.bottom, surfaces.contribute.pane.dashboard, surfaces.contribute.status.left
sidecarssidecars.definition.register
notificationsnotifications.channel.register, notifications.filter.register, notifications.action.register
inputinput.channel.register, input.parser.register, input.intent.register, input.auth.register
webhookwebhook.route.register, webhook.route.register.unsigned, webhook.tunnel.register, webhook.signer.register
llmllm.provider.register, llm.preprocessor.register, llm.postprocessor.register, llm.router.register
recipesrecipes.register
sequencessequences.register