ObjectStackObjectStack

Plugin

Plugin protocol schemas

@module studio/plugin

Studio Plugin Protocol

Defines the specification for Studio plugins — a VS Code-like extension model

that allows each metadata type to contribute custom viewers, designers,

sidebar groups, actions, and commands.

Architecture

Like VS Code extensions, Studio plugins have two layers:

  1. Manifest (Declarative) — JSON-serializable contribution points

  2. Activation (Imperative) — Runtime registration of React components & handlers


┌─────────────────────────────────────────────────────────┐

│                    Studio Host                          │

│  ┌───────────────────────────────────────────────────┐  │

│  │              Plugin Registry                      │  │

│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐         │  │

│  │  │ Object   │ │  Flow    │ │  Agent   │  ...     │  │

│  │  │ Plugin   │ │  Plugin  │ │  Plugin  │         │  │

│  │  └──────────┘ └──────────┘ └──────────┘         │  │

│  └───────────────────────────────────────────────────┘  │

│                                                         │

│  ┌─── Sidebar ───┐  ┌──── Main Panel ────────────────┐ │

│  │ [plugin icons] │  │  PluginHost renders viewer     │ │

│  │ [plugin groups]│  │  from highest-priority plugin  │ │

│  └────────────────┘  └────────────────────────────────┘ │

└─────────────────────────────────────────────────────────┘

@example


import \{ StudioPluginManifestSchema \} from '@objectstack/spec/studio';

const manifest = StudioPluginManifestSchema.parse(\{

id: 'objectstack.object-designer',

name: 'Object Designer',

version: '1.0.0',

contributes: \{

metadataViewers: [\{

id: 'object-explorer',

metadataTypes: ['object', 'objects'],

label: 'Object Explorer',

priority: 100,

modes: ['preview', 'design', 'data'],

\}],

\},

\});

Source: packages/spec/src/studio/plugin.zod.ts

TypeScript Usage

import { ActionContribution, ActionLocation, ActivationEvent, CommandContribution, MetadataIconContribution, MetadataViewerContribution, PanelContribution, PanelLocation, SidebarGroupContribution, StudioPluginContributions, StudioPluginManifest, ViewMode } from '@objectstack/spec/studio';
import type { ActionContribution, ActionLocation, ActivationEvent, CommandContribution, MetadataIconContribution, MetadataViewerContribution, PanelContribution, PanelLocation, SidebarGroupContribution, StudioPluginContributions, StudioPluginManifest, ViewMode } from '@objectstack/spec/studio';

// Validate data
const result = ActionContribution.parse(data);

ActionContribution

Properties

PropertyTypeRequiredDescription
idstringUnique action identifier
labelstringAction display label
iconstringoptionalLucide icon name
locationEnum<'toolbar' | 'contextMenu' | 'commandPalette'>UI location
metadataTypesstring[]Applicable metadata types

ActionLocation

Allowed Values

  • toolbar
  • contextMenu
  • commandPalette


CommandContribution

Properties

PropertyTypeRequiredDescription
idstringUnique command identifier
labelstringCommand display label
shortcutstringoptionalKeyboard shortcut
iconstringoptionalLucide icon name

MetadataIconContribution

Properties

PropertyTypeRequiredDescription
metadataTypestringMetadata type
labelstringDisplay label
iconstringLucide icon name

MetadataViewerContribution

Properties

PropertyTypeRequiredDescription
idstringUnique viewer identifier
metadataTypesstring[]Metadata types this viewer can handle
labelstringViewer display label
prioritynumberViewer priority (higher wins)
modesEnum<'preview' | 'design' | 'code' | 'data'>[]Supported view modes

PanelContribution

Properties

PropertyTypeRequiredDescription
idstringUnique panel identifier
labelstringPanel display label
iconstringoptionalLucide icon name
locationEnum<'bottom' | 'right' | 'modal'>Panel location

PanelLocation

Allowed Values

  • bottom
  • right
  • modal

SidebarGroupContribution

Properties

PropertyTypeRequiredDescription
keystringUnique group key
labelstringGroup display label
iconstringoptionalLucide icon name
metadataTypesstring[]Metadata types in this group
ordernumberSort order (lower = higher)

StudioPluginContributions

Properties

PropertyTypeRequiredDescription
metadataViewersObject[]
sidebarGroupsObject[]
actionsObject[]
metadataIconsObject[]
panelsObject[]
commandsObject[]

StudioPluginManifest

Properties

PropertyTypeRequiredDescription
idstringPlugin ID (dot-separated lowercase)
namestringPlugin display name
versionstringPlugin version
descriptionstringoptionalPlugin description
authorstringoptionalAuthor
contributesObject
activationEventsstring[]

ViewMode

Allowed Values

  • preview
  • design
  • code
  • data

On this page