ObjectStackObjectStack

Metadata Plugin

Metadata Plugin protocol schemas

Metadata Plugin Protocol

Defines the specification for the Metadata Plugin — the central authority

responsible for managing ALL metadata across the ObjectStack platform.

Architecture

The Metadata Plugin consolidates all scattered metadata operations into a single,

cohesive plugin that "takes over" the entire platform's metadata management:


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

│                     Metadata Plugin                             │

│                                                                  │

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

│  │ Type Registry │  │  Loader      │  │ Customization Layer  │  │

│  │ (all types)   │  │  (file/db/s3)│  │ (overlay / merge)    │  │

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

│                                                                  │

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

│  │ Persistence  │  │  Query       │  │ Lifecycle            │  │

│  │ (db records) │  │  (search)    │  │ (validate/deploy)    │  │

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

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

Alignment

  • Salesforce: Metadata API (deploy, retrieve, describe)

  • ServiceNow: System Dictionary + Metadata API

  • Kubernetes: API Server + CRD Registry

References

Source: packages/spec/src/kernel/metadata-plugin.zod.ts

TypeScript Usage

import { MetadataBulkResultSchema, MetadataDependencySchema, MetadataPluginConfigSchema, MetadataPluginManifestSchema, MetadataQuerySchema, MetadataQueryResultSchema, MetadataTypeSchema, MetadataTypeRegistryEntrySchema, MetadataValidationResultSchema } from '@objectstack/spec/kernel';
import type { MetadataBulkResult, MetadataDependency, MetadataPluginConfig, MetadataPluginManifest, MetadataQuery, MetadataQueryResult, MetadataType, MetadataTypeRegistryEntry, MetadataValidationResult } from '@objectstack/spec/kernel';

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

MetadataBulkResult

Properties

PropertyTypeRequiredDescription
totalintegerTotal items processed
succeededintegerSuccessfully processed
failedintegerFailed items
errors{ type: string; name: string; error: string }[]optionalPer-item errors

MetadataDependency

Properties

PropertyTypeRequiredDescription
sourceTypestringDependent metadata type
sourceNamestringDependent metadata name
targetTypestringReferenced metadata type
targetNamestringReferenced metadata name
kindEnum<'reference' | 'extends' | 'includes' | 'triggers'>How the dependency is formed

MetadataPluginConfig

Properties

PropertyTypeRequiredDescription
storage{ datasource?: string; tableName?: string; fallback?: Enum<'filesystem' | 'memory' | 'none'>; rootDir?: string; … }Storage backend configuration
customizationPolicies{ metadataType: string; allowCustomization?: boolean; lockedFields?: string[]; customizableFields?: string[]; … }[]optionalDefault customization policies per type
mergeStrategy{ defaultStrategy?: Enum<'keep-custom' | 'accept-incoming' | 'three-way-merge'>; alwaysAcceptIncoming?: string[]; alwaysKeepCustom?: string[]; autoResolveNonConflicting?: boolean }optionalMerge strategy for package upgrades
additionalTypes{ label: string; description?: string; filePatterns: string[]; supportsOverlay?: boolean; … }[]optionalAdditional custom metadata types
enableEventsbooleanoptionalEmit metadata change events
validateOnWritebooleanoptionalValidate metadata on write
enableVersioningbooleanoptionalTrack metadata version history
cacheMaxItemsintegeroptionalMax items in memory cache
bootstrapEnum<'eager' | 'lazy' | 'artifact-only'>optionalHow metadata is primed at plugin start (eager / lazy / artifact-only)

MetadataPluginManifest

Properties

PropertyTypeRequiredDescription
id'com.objectstack.metadata'Metadata plugin ID
name'ObjectStack Metadata Service'Plugin name
versionstringPlugin version
type'standard'Plugin type
descriptionstringoptionalPlugin description
capabilities{ crud?: boolean; query?: boolean; overlay?: boolean; watch?: boolean; … }Plugin capabilities
config{ storage: object; customizationPolicies?: { metadataType: string; allowCustomization?: boolean; lockedFields?: string[]; customizableFields?: string[]; … }[]; mergeStrategy?: object; additionalTypes?: { label: string; description?: string; filePatterns: string[]; supportsOverlay?: boolean; … }[]; … }optionalPlugin configuration

MetadataQuery

Properties

PropertyTypeRequiredDescription
typesEnum<'object' | 'field' | 'hook' | 'seed' | 'mapping' | 'view' | 'page' | 'dashboard' | 'app' | 'action' | 'report' | 'dataset' | 'flow' | 'job' | 'datasource' | 'external_catalog' | 'translation' | 'email_template' | 'doc' | 'book' | 'permission' | 'position' | 'agent' | 'tool' | 'skill'>[]optionalFilter by metadata types
namespacesstring[]optionalFilter by namespaces
packageIdstringoptionalFilter by owning package
searchstringoptionalFull-text search query
scopeEnum<'system' | 'platform' | 'user'>optionalFilter by scope
stateEnum<'draft' | 'active' | 'archived' | 'deprecated'>optionalFilter by lifecycle state
tagsstring[]optionalFilter by tags
sortByEnum<'name' | 'type' | 'updatedAt' | 'createdAt'>Sort field
sortOrderEnum<'asc' | 'desc'>Sort direction
pageintegerPage number
pageSizeintegerItems per page

MetadataQueryResult

Properties

PropertyTypeRequiredDescription
items{ type: string; name: string; namespace?: string; label?: string; … }[]Matched metadata items
totalintegerTotal matching items
pageintegerCurrent page
pageSizeintegerPage size

MetadataType

Allowed Values

  • object
  • field
  • hook
  • seed
  • mapping
  • view
  • page
  • dashboard
  • app
  • action
  • report
  • dataset
  • flow
  • job
  • datasource
  • external_catalog
  • translation
  • email_template
  • doc
  • book
  • permission
  • position
  • agent
  • tool
  • skill

MetadataTypeRegistryEntry

Properties

PropertyTypeRequiredDescription
typeEnum<'object' | 'field' | 'hook' | 'seed' | 'mapping' | 'view' | 'page' | 'dashboard' | 'app' | 'action' | 'report' | 'dataset' | 'flow' | 'job' | 'datasource' | 'external_catalog' | 'translation' | 'email_template' | 'doc' | 'book' | 'permission' | 'position' | 'agent' | 'tool' | 'skill'>Metadata type identifier
labelstringDisplay label for the metadata type
descriptionstringoptionalDescription of the metadata type
filePatternsstring[]Glob patterns to discover files of this type
supportsOverlaybooleanoptionalWhether overlay customization is supported
allowOrgOverridebooleanoptionalAllow per-org overlay writes via runtime metadata API
allowRuntimeCreatebooleanoptionalAllow runtime creation via API
supportsVersioningbooleanoptionalWhether version history is tracked
executionPinnedbooleanoptionalTransaction rows reference a specific version_hash; history GC is disabled and getByHash() MUST resolve old hashes (ADR-0009)
loadOrderintegeroptionalLoading priority (lower = earlier)
domainEnum<'data' | 'ui' | 'automation' | 'system' | 'security' | 'ai'>Protocol domain
actions{ name: string; label: string; objectName?: string; icon?: string; … }[]optionalDeclarative type-level actions (e.g. datasource "Test connection"), reusing ActionSchema; merged with plugin-registered actions when emitted

MetadataValidationResult

Properties

PropertyTypeRequiredDescription
validbooleanWhether the metadata is valid
errors{ path: string; message: string; code?: string }[]optionalValidation errors
warnings{ path: string; message: string }[]optionalValidation warnings

On this page