feat(ui): gate Gateways and Profiles from host bootstrap

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-08-22 19:38:17 +00:00
1 parent 89358f38bf
commit f7f21e585e
23 files changed
+429 -52

No files matched your search

+2
View File
@@ -6,6 +6,8 @@ It is intentionally narrower than [PLUGIN_SPEC.md](./PLUGIN_SPEC.md). The spec i
> **New to plugins?** Start with the short [Local Plugin Development guide](./LOCAL_PLUGIN_DEVELOPMENT.md) — it walks the CLI happy path (`plugin init` → `pnpm dev` → `plugin install <path>`) end to end. Come back here for the full manifest surface, worker capabilities, and UI components.
> **Host features are reserved.** The optional versioned `hostFeatures` manifest field is not an extension point for third-party plugins. Core accepts its closed Gateways and Profiles keys only from the canonical `paperclipai.paperclip-ee` plugin, and enables them only while that plugin is ready. Other plugins must use capabilities, API routes, tools, and UI slots for their integrations.
## Current reality
- Treat plugin workers and plugin UI as trusted code.
+10
View File
@@ -346,6 +346,10 @@ export interface PaperclipPluginManifestV1 {
routines?: PluginManagedRoutineDeclaration[];
skills?: PluginManagedSkillDeclaration[];
localFolders?: PluginLocalFolderDeclaration[];
hostFeatures?: {
schemaVersion: 1;
features: Array<"apps.named_mcp_gateways" | "apps.access_profiles">;
};
/** Legacy top-level launcher declarations. Prefer `ui.launchers` for new manifests. */
launchers?: PluginLauncherDeclaration[];
ui?: {
@@ -387,6 +391,12 @@ Rules:
- `minimumHostVersion` is preferred, with `minimumPaperclipVersion` retained for
backwards compatibility
- `capabilities` must be static and install-time visible
- `hostFeatures` is a closed host-product contract, not a general extension
mechanism. Only the canonical `paperclipai.paperclip-ee` manifest may declare
it. Unknown keys, duplicates, unsupported schema versions, and declarations
from any other plugin are rejected. The host enables a valid declaration only
while that plugin's stored lifecycle status is `ready`; every other state
fails closed.
- config schema must be JSON Schema compatible
- `entrypoints.ui` points to the directory containing the built UI bundle
- `ui.slots` declares which extension slots the plugin fills, so the host knows what to mount without loading the bundle eagerly; each slot references an `exportName` from the UI bundle