{
  "$defs": {
    "RichBlockField": {
      "oneOf": [
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "text",
              "type": "string"
            },
            "default": {
              "maxLength": 10000,
              "type": "string"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "validation": {
              "additionalProperties": false,
              "properties": {
                "max_length": {
                  "maximum": 10000,
                  "minimum": 1,
                  "type": "integer"
                },
                "min_length": {
                  "maximum": 10000,
                  "minimum": 0,
                  "type": "integer"
                }
              },
              "type": "object"
            }
          },
          "required": [
            "key",
            "label",
            "control"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "rich_text",
              "type": "string"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "required": {
              "type": "boolean"
            }
          },
          "required": [
            "key",
            "label",
            "control"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "textarea",
              "type": "string"
            },
            "default": {
              "maxLength": 10000,
              "type": "string"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "validation": {
              "additionalProperties": false,
              "properties": {
                "max_length": {
                  "maximum": 10000,
                  "minimum": 1,
                  "type": "integer"
                },
                "min_length": {
                  "maximum": 10000,
                  "minimum": 0,
                  "type": "integer"
                }
              },
              "type": "object"
            }
          },
          "required": [
            "key",
            "label",
            "control"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "url",
              "type": "string"
            },
            "default": {
              "maxLength": 2048,
              "type": "string"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "validation": {
              "additionalProperties": false,
              "properties": {
                "max_length": {
                  "maximum": 2048,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "type": "object"
            }
          },
          "required": [
            "key",
            "label",
            "control"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "number",
              "type": "string"
            },
            "default": {
              "type": "number"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "validation": {
              "additionalProperties": false,
              "properties": {
                "integer": {
                  "type": "boolean"
                },
                "max": {
                  "type": "number"
                },
                "min": {
                  "type": "number"
                }
              },
              "type": "object"
            }
          },
          "required": [
            "key",
            "label",
            "control"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "boolean",
              "type": "string"
            },
            "default": {
              "type": "boolean"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            }
          },
          "required": [
            "key",
            "label",
            "control"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "select",
              "type": "string"
            },
            "default": {
              "maxLength": 64,
              "type": "string"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "options": {
              "items": {
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "maxLength": 64,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "value": {
                    "maxLength": 64,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  }
                },
                "required": [
                  "value",
                  "label"
                ],
                "type": "object"
              },
              "maxItems": 50,
              "minItems": 1,
              "type": "array"
            },
            "required": {
              "type": "boolean"
            }
          },
          "required": [
            "key",
            "label",
            "control",
            "options"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "media",
              "type": "string"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "media_kind": {
              "enum": [
                "image",
                "document",
                "audio",
                "video",
                "file"
              ],
              "type": "string"
            },
            "required": {
              "type": "boolean"
            }
          },
          "required": [
            "key",
            "label",
            "control",
            "media_kind"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "relation",
              "type": "string"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "models": {
              "items": {
                "maxLength": 128,
                "minLength": 1,
                "type": "string"
              },
              "maxItems": 16,
              "minItems": 1,
              "type": "array"
            },
            "multiple": {
              "type": "boolean"
            },
            "required": {
              "type": "boolean"
            }
          },
          "required": [
            "key",
            "label",
            "control",
            "models"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "control": {
              "const": "group",
              "type": "string"
            },
            "fields": {
              "items": {
                "$ref": "#/$defs/RichBlockField"
              },
              "maxItems": 24,
              "minItems": 1,
              "type": "array"
            },
            "help_text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "key": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "label": {
              "maxLength": 40,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            },
            "max_items": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer"
            },
            "repeatable": {
              "type": "boolean"
            },
            "required": {
              "type": "boolean"
            }
          },
          "required": [
            "key",
            "label",
            "control",
            "fields"
          ],
          "type": "object"
        }
      ]
    },
    "RichBlockRenderNode": {
      "anyOf": [
        {
          "additionalProperties": false,
          "properties": {
            "children": {
              "items": {
                "$ref": "#/$defs/RichBlockRenderNode"
              },
              "type": "array"
            },
            "group": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            }
          },
          "required": [
            "group",
            "children"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "children": {
              "items": {
                "$ref": "#/$defs/RichBlockRenderNode"
              },
              "type": "array"
            },
            "each": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            }
          },
          "required": [
            "each",
            "children"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "Literal words, escaped.",
          "properties": {
            "text": {
              "maxLength": 200,
              "minLength": 1,
              "pattern": "^[^\\p{Cc}<>]+$",
              "type": "string"
            }
          },
          "required": [
            "text"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "A field’s value as escaped text; a select shows its option label.",
          "properties": {
            "field": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "property": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            }
          },
          "required": [
            "field"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "Children shown only while the field is filled (or equals `equals`).",
          "properties": {
            "children": {
              "items": {
                "$ref": "#/$defs/RichBlockRenderNode"
              },
              "type": "array"
            },
            "equals": {
              "anyOf": [
                {
                  "maxLength": 10000,
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            },
            "when": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            }
          },
          "required": [
            "when",
            "children"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "A link to a url or media field. Without a usable address only the children render.",
          "properties": {
            "children": {
              "items": {
                "$ref": "#/$defs/RichBlockRenderNode"
              },
              "type": "array"
            },
            "element": {
              "const": "a",
              "type": "string"
            },
            "href": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            }
          },
          "required": [
            "element",
            "href"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "description": "An image media field; `alt` names a text field.",
          "properties": {
            "alt": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "element": {
              "const": "img",
              "type": "string"
            },
            "src": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            }
          },
          "required": [
            "element",
            "src"
          ],
          "type": "object"
        },
        {
          "additionalProperties": false,
          "properties": {
            "children": {
              "items": {
                "$ref": "#/$defs/RichBlockRenderNode"
              },
              "type": "array"
            },
            "element": {
              "enum": [
                "div",
                "section",
                "aside",
                "p",
                "span",
                "strong",
                "em",
                "small",
                "h2",
                "h3",
                "h4",
                "blockquote",
                "ul",
                "ol",
                "li",
                "figure",
                "figcaption",
                "hr",
                "br"
              ],
              "type": "string"
            }
          },
          "required": [
            "element"
          ],
          "type": "object"
        }
      ],
      "description": "One node of a host-interpreted render tree."
    }
  },
  "$id": "https://dee-wan.dev/schemas/plugins/manifest-v1.schema.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "description": "The document a plugin serves at its manifest URL. Generated from the definition core validates every fetched manifest with.",
  "properties": {
    "activation_url": {
      "format": "uri",
      "maxLength": 2048,
      "type": "string"
    },
    "admin_views": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "capabilities": {
            "items": {
              "enum": [
                "content:read",
                "workflow:read",
                "workflow:publish",
                "workflow:unpublish",
                "workflow:locale",
                "workflow:release",
                "content:write",
                "content:create",
                "content:delete",
                "draft:write",
                "media:write",
                "media:read",
                "media:update",
                "media:delete",
                "content:restore",
                "comments:read",
                "comments:moderate",
                "redirects:read",
                "redirects:write",
                "mail:send",
                "renderer:metadata",
                "content:propose",
                "media:source"
              ],
              "type": "string"
            },
            "maxItems": 8,
            "minItems": 1,
            "type": "array"
          },
          "dashboard": {
            "default": false,
            "type": "boolean"
          },
          "frame": {
            "additionalProperties": false,
            "properties": {
              "operations": {
                "items": {
                  "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                  "type": "string"
                },
                "maxItems": 8,
                "type": "array"
              },
              "origin": {
                "format": "uri",
                "type": "string"
              },
              "url": {
                "format": "uri",
                "maxLength": 2048,
                "type": "string"
              }
            },
            "required": [
              "url",
              "origin"
            ],
            "type": "object"
          },
          "id": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "label": {
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "navigation": {
            "default": true,
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "label",
          "frame",
          "navigation",
          "dashboard",
          "capabilities"
        ],
        "type": "object"
      },
      "maxItems": 8,
      "minItems": 1,
      "type": "array"
    },
    "base_url": {
      "format": "uri",
      "maxLength": 2048,
      "type": "string"
    },
    "content_actions": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "label": {
            "maxLength": 24,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          }
        },
        "required": [
          "id",
          "label"
        ],
        "type": "object"
      },
      "maxItems": 4,
      "type": "array"
    },
    "hooks": {
      "description": "Pre-operation checks core asks before an upload is accepted or a visitor comment is stored. One per kind; off until an administrator enables each.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "endpoint": {
            "description": "HTTPS, on the manifest’s one origin. Core POSTs the invocation envelope here.",
            "format": "uri",
            "maxLength": 2048,
            "type": "string"
          },
          "id": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "kind": {
            "description": "`upload_metadata`: asked before a new library file is accepted; may refuse it or normalize its name and alt texts. `comment_moderation`: asked before a visitor comment is stored; decides approve, hold or reject. Never runs until an administrator turns it on; a failing hook refuses the upload or holds the comment, never approves.",
            "enum": [
              "upload_metadata",
              "comment_moderation"
            ],
            "type": "string"
          },
          "label": {
            "maxLength": 40,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "requires": {
            "description": "Installation capabilities this needs. Listed in requested_capabilities; unavailable while the grant lacks one.",
            "items": {
              "enum": [
                "content:read",
                "workflow:read",
                "workflow:publish",
                "workflow:unpublish",
                "workflow:locale",
                "workflow:release",
                "content:write",
                "content:create",
                "content:delete",
                "draft:write",
                "media:write",
                "media:read",
                "media:update",
                "media:delete",
                "content:restore",
                "comments:read",
                "comments:moderate",
                "redirects:read",
                "redirects:write",
                "mail:send",
                "renderer:metadata",
                "content:propose",
                "media:source"
              ],
              "type": "string"
            },
            "maxItems": 23,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "id",
          "label",
          "kind",
          "endpoint",
          "requires"
        ],
        "type": "object"
      },
      "maxItems": 2,
      "minItems": 1,
      "type": "array"
    },
    "id": {
      "maxLength": 128,
      "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*){2,}$",
      "type": "string"
    },
    "mail_templates": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "label": {
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          },
          "variables": {
            "items": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "maxItems": 16,
            "type": "array"
          }
        },
        "required": [
          "id",
          "label",
          "variables"
        ],
        "type": "object"
      },
      "maxItems": 8,
      "minItems": 1,
      "type": "array"
    },
    "manage_views": {
      "items": {
        "enum": [
          "calendar",
          "releases"
        ],
        "type": "string"
      },
      "maxItems": 2,
      "minItems": 1,
      "type": "array",
      "uniqueItems": true
    },
    "management_url": {
      "description": "Absolute navigation URL; {installation_id} is substituted before URL policy checks.",
      "format": "uri-template",
      "maxLength": 2048,
      "type": "string"
    },
    "manifest_version": {
      "const": 1,
      "type": "number"
    },
    "media_sources": {
      "description": "Libraries people browse inside the media picker. A chosen file is copied into the site or, for a source declaring `reference`, linked. Needs `media:source`.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "delivery_origins": {
            "description": "Origins (scheme and host, no path) a `delivery_url` may sit on. Required with the `reference` mode, absent without it. The manifest origin may be one of them.",
            "items": {
              "format": "uri",
              "maxLength": 2048,
              "type": "string"
            },
            "maxItems": 4,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          },
          "description": {
            "maxLength": 160,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "endpoint": {
            "description": "HTTPS, on the manifest’s one origin. Core POSTs the invocation envelope here for every page browsed and every file chosen.",
            "format": "uri",
            "maxLength": 2048,
            "type": "string"
          },
          "id": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "label": {
            "maxLength": 40,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "modes": {
            "description": "`copy`: core fetches the file from `download_url` and keeps its own copy. `reference`: core keeps only the `delivery_url` and the provider keeps the bytes. Never inferred from URLs.",
            "items": {
              "enum": [
                "copy",
                "reference"
              ],
              "type": "string"
            },
            "maxItems": 2,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "id",
          "label",
          "endpoint",
          "modes"
        ],
        "type": "object"
      },
      "maxItems": 4,
      "minItems": 1,
      "type": "array"
    },
    "name": {
      "maxLength": 64,
      "minLength": 1,
      "pattern": "^[^\\p{Cc}<>]+$",
      "type": "string"
    },
    "operations": {
      "description": "Actions core runs on the plugin and renders with its own form and result components.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "audience": {
            "description": "`interactive`: listed and run in the admin, management API, CLI and MCP. `automation`: never listed there and refused by their run routes; only a named core workflow (the planner’s Scheduling handoff) invokes it. `column`: only the content list invokes it, and only for a `page` scope operation.",
            "enum": [
              "interactive",
              "automation",
              "column"
            ],
            "type": "string"
          },
          "cell": {
            "description": "A `page` operation only, and required there: how the host draws each cell of the column. The operation’s label is the column header.",
            "enum": [
              "text",
              "badge",
              "link"
            ],
            "type": "string"
          },
          "description": {
            "maxLength": 160,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "destructive": {
            "const": true,
            "description": "Asks for the shared destructive confirmation before it runs.",
            "type": "boolean"
          },
          "endpoint": {
            "description": "HTTPS, on the manifest’s one origin. Core POSTs the invocation envelope here.",
            "format": "uri",
            "maxLength": 2048,
            "type": "string"
          },
          "id": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "input": {
            "items": {
              "oneOf": [
                {
                  "additionalProperties": false,
                  "properties": {
                    "help": {
                      "maxLength": 160,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    },
                    "key": {
                      "pattern": "^[a-z][a-z0-9_]{0,31}$",
                      "type": "string"
                    },
                    "kind": {
                      "const": "text",
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 40,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    },
                    "max_length": {
                      "maximum": 1000,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "multiline": {
                      "type": "boolean"
                    },
                    "required": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "key",
                    "label",
                    "kind",
                    "max_length"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "help": {
                      "maxLength": 160,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    },
                    "integer": {
                      "type": "boolean"
                    },
                    "key": {
                      "pattern": "^[a-z][a-z0-9_]{0,31}$",
                      "type": "string"
                    },
                    "kind": {
                      "const": "number",
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 40,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    },
                    "max": {
                      "type": "number"
                    },
                    "min": {
                      "type": "number"
                    },
                    "required": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "key",
                    "label",
                    "kind"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "help": {
                      "maxLength": 160,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    },
                    "key": {
                      "pattern": "^[a-z][a-z0-9_]{0,31}$",
                      "type": "string"
                    },
                    "kind": {
                      "const": "boolean",
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 40,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    }
                  },
                  "required": [
                    "key",
                    "label",
                    "kind"
                  ],
                  "type": "object"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "help": {
                      "maxLength": 160,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    },
                    "key": {
                      "pattern": "^[a-z][a-z0-9_]{0,31}$",
                      "type": "string"
                    },
                    "kind": {
                      "const": "select",
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 40,
                      "minLength": 1,
                      "pattern": "^[^\\p{Cc}<>]+$",
                      "type": "string"
                    },
                    "options": {
                      "items": {
                        "additionalProperties": false,
                        "properties": {
                          "label": {
                            "maxLength": 64,
                            "minLength": 1,
                            "pattern": "^[^\\p{Cc}<>]+$",
                            "type": "string"
                          },
                          "value": {
                            "maxLength": 64,
                            "minLength": 1,
                            "pattern": "^[^\\p{Cc}<>]+$",
                            "type": "string"
                          }
                        },
                        "required": [
                          "value",
                          "label"
                        ],
                        "type": "object"
                      },
                      "maxItems": 32,
                      "minItems": 1,
                      "type": "array"
                    },
                    "required": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "key",
                    "label",
                    "kind",
                    "options"
                  ],
                  "type": "object"
                }
              ]
            },
            "maxItems": 8,
            "type": "array"
          },
          "label": {
            "maxLength": 40,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "list_action": {
            "const": true,
            "description": "An interactive `entry` operation only: also offered on the content list for the rows a person selected. The host runs it once per row through the ordinary run path, so every row is authorized, audited and answered on its own.",
            "type": "boolean"
          },
          "requires": {
            "description": "Installation capabilities this needs. Listed in requested_capabilities; unavailable while the grant lacks one.",
            "items": {
              "enum": [
                "content:read",
                "workflow:read",
                "workflow:publish",
                "workflow:unpublish",
                "workflow:locale",
                "workflow:release",
                "content:write",
                "content:create",
                "content:delete",
                "draft:write",
                "media:write",
                "media:read",
                "media:update",
                "media:delete",
                "content:restore",
                "comments:read",
                "comments:moderate",
                "redirects:read",
                "redirects:write",
                "mail:send",
                "renderer:metadata",
                "content:propose",
                "media:source"
              ],
              "type": "string"
            },
            "maxItems": 23,
            "type": "array",
            "uniqueItems": true
          },
          "result": {
            "description": "The CMS components a completed result may use.",
            "items": {
              "enum": [
                "text",
                "rows",
                "links",
                "json",
                "cells"
              ],
              "type": "string"
            },
            "maxItems": 5,
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
          },
          "scope": {
            "description": "`site`: run from Settings → Plugins. `entry`: run on one entry of a granted model. `page`: a content-list column the plugin computes for a bounded page of rows of one granted model.",
            "enum": [
              "site",
              "entry",
              "page"
            ],
            "type": "string"
          }
        },
        "required": [
          "id",
          "label",
          "endpoint",
          "scope",
          "audience",
          "requires",
          "result"
        ],
        "type": "object"
      },
      "maxItems": 8,
      "minItems": 1,
      "type": "array"
    },
    "policies": {
      "description": "Checks core asks before a content save or publication.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "endpoint": {
            "description": "HTTPS, on the manifest’s one origin. Core POSTs the invocation envelope here.",
            "format": "uri",
            "maxLength": 2048,
            "type": "string"
          },
          "id": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "kind": {
            "description": "`save`: before a content save, including link, media and SEO-only changes; may transform. `restore`: before an old version is restored (may transform) or an entry leaves Trash. `delete`: before an entry or language moves to Trash or is deleted permanently. `publish`: before a publication. `unpublish`: before content is taken offline. `transition`: before every workflow move, scheduled and plugin moves included.",
            "enum": [
              "save",
              "restore",
              "delete",
              "publish",
              "unpublish",
              "transition"
            ],
            "type": "string"
          },
          "label": {
            "maxLength": 40,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "requires": {
            "description": "Installation capabilities this needs. Listed in requested_capabilities; unavailable while the grant lacks one.",
            "items": {
              "enum": [
                "content:read",
                "workflow:read",
                "workflow:publish",
                "workflow:unpublish",
                "workflow:locale",
                "workflow:release",
                "content:write",
                "content:create",
                "content:delete",
                "draft:write",
                "media:write",
                "media:read",
                "media:update",
                "media:delete",
                "content:restore",
                "comments:read",
                "comments:moderate",
                "redirects:read",
                "redirects:write",
                "mail:send",
                "renderer:metadata",
                "content:propose",
                "media:source"
              ],
              "type": "string"
            },
            "maxItems": 23,
            "type": "array",
            "uniqueItems": true
          }
        },
        "required": [
          "id",
          "label",
          "kind",
          "endpoint",
          "requires"
        ],
        "type": "object"
      },
      "maxItems": 8,
      "minItems": 1,
      "type": "array"
    },
    "protocol_versions": {
      "items": {
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991,
        "type": "integer"
      },
      "maxItems": 8,
      "minItems": 1,
      "type": "array"
    },
    "renderer_metadata": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "key": {
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "label": {
            "maxLength": 64,
            "minLength": 1,
            "pattern": "^[^<>\\p{Cc}]+$",
            "type": "string"
          },
          "link_rels": {
            "default": [],
            "items": {
              "enum": [
                "alternate",
                "related",
                "author",
                "license"
              ],
              "type": "string"
            },
            "maxItems": 4,
            "type": "array"
          },
          "meta_names": {
            "default": [],
            "items": {
              "maxLength": 64,
              "type": "string"
            },
            "maxItems": 16,
            "type": "array"
          },
          "schema_types": {
            "default": [],
            "items": {
              "pattern": "^[A-Za-z][A-Za-z0-9]{0,63}$",
              "type": "string"
            },
            "maxItems": 8,
            "type": "array"
          }
        },
        "required": [
          "key",
          "label",
          "meta_names",
          "link_rels",
          "schema_types"
        ],
        "type": "object"
      },
      "maxItems": 16,
      "minItems": 1,
      "type": "array"
    },
    "requested_capabilities": {
      "items": {
        "enum": [
          "content:read",
          "workflow:read",
          "workflow:publish",
          "workflow:unpublish",
          "workflow:locale",
          "workflow:release",
          "content:write",
          "content:create",
          "content:delete",
          "draft:write",
          "media:write",
          "media:read",
          "media:update",
          "media:delete",
          "content:restore",
          "comments:read",
          "comments:moderate",
          "redirects:read",
          "redirects:write",
          "mail:send",
          "renderer:metadata",
          "content:propose",
          "media:source"
        ],
        "type": "string"
      },
      "maxItems": 23,
      "minItems": 1,
      "type": "array",
      "uniqueItems": true
    },
    "rich_blocks": {
      "description": "Block types for rich text. Core draws their controls and renders them from the declared render tree.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "description": {
            "maxLength": 160,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "fields": {
            "items": {
              "$ref": "#/$defs/RichBlockField"
            },
            "maxItems": 24,
            "minItems": 1,
            "type": "array"
          },
          "inline": {
            "type": "boolean"
          },
          "label": {
            "maxLength": 40,
            "minLength": 1,
            "pattern": "^[^\\p{Cc}<>]+$",
            "type": "string"
          },
          "migrations": {
            "description": "Steps from one version to the next. A version without an entry carries values unchanged.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "from": {
                  "maximum": 9007199254740991,
                  "minimum": 1,
                  "type": "integer"
                },
                "steps": {
                  "items": {
                    "oneOf": [
                      {
                        "additionalProperties": false,
                        "properties": {
                          "from": {
                            "pattern": "^[a-z][a-z0-9_]{0,31}$",
                            "type": "string"
                          },
                          "op": {
                            "const": "rename",
                            "type": "string"
                          },
                          "to": {
                            "pattern": "^[a-z][a-z0-9_]{0,31}$",
                            "type": "string"
                          }
                        },
                        "required": [
                          "op",
                          "from",
                          "to"
                        ],
                        "type": "object"
                      },
                      {
                        "additionalProperties": false,
                        "properties": {
                          "field": {
                            "pattern": "^[a-z][a-z0-9_]{0,31}$",
                            "type": "string"
                          },
                          "op": {
                            "const": "set_default",
                            "type": "string"
                          },
                          "value": {
                            "anyOf": [
                              {
                                "maxLength": 10000,
                                "type": "string"
                              },
                              {
                                "type": "number"
                              },
                              {
                                "type": "boolean"
                              }
                            ]
                          }
                        },
                        "required": [
                          "op",
                          "field",
                          "value"
                        ],
                        "type": "object"
                      },
                      {
                        "additionalProperties": false,
                        "properties": {
                          "field": {
                            "pattern": "^[a-z][a-z0-9_]{0,31}$",
                            "type": "string"
                          },
                          "op": {
                            "const": "drop",
                            "type": "string"
                          }
                        },
                        "required": [
                          "op",
                          "field"
                        ],
                        "type": "object"
                      }
                    ]
                  },
                  "maxItems": 24,
                  "minItems": 1,
                  "type": "array"
                },
                "to": {
                  "maximum": 9007199254740991,
                  "minimum": 2,
                  "type": "integer"
                }
              },
              "required": [
                "from",
                "to",
                "steps"
              ],
              "type": "object"
            },
            "maxItems": 100,
            "type": "array"
          },
          "name": {
            "description": "Stored as `<plugin id>/<name>`.",
            "pattern": "^[a-z][a-z0-9_-]{0,31}$",
            "type": "string"
          },
          "preview": {
            "additionalProperties": {
              "anyOf": [
                {
                  "maxLength": 10000,
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            },
            "description": "Sample values the insert menu previews with. No media.",
            "propertyNames": {
              "pattern": "^[a-z][a-z0-9_]{0,31}$",
              "type": "string"
            },
            "type": "object"
          },
          "render": {
            "additionalProperties": false,
            "description": "Host-interpreted render tree. Without it renderers show the block as unsupported.",
            "properties": {
              "nodes": {
                "items": {
                  "$ref": "#/$defs/RichBlockRenderNode"
                },
                "minItems": 1,
                "type": "array"
              },
              "tone": {
                "description": "A select field whose value (neutral, info, success, warning, danger) tints the block.",
                "pattern": "^[a-z][a-z0-9_]{0,31}$",
                "type": "string"
              }
            },
            "required": [
              "nodes"
            ],
            "type": "object"
          },
          "version": {
            "description": "Raise it when fields change; stored blocks keep the version they were saved with.",
            "maximum": 1000,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "name",
          "version",
          "label",
          "fields"
        ],
        "type": "object"
      },
      "maxItems": 16,
      "minItems": 1,
      "type": "array"
    },
    "ui_extensions": {
      "items": {
        "oneOf": [
          {
            "additionalProperties": false,
            "properties": {
              "description": {
                "maxLength": 160,
                "minLength": 1,
                "pattern": "^[^\\p{Cc}<>]+$",
                "type": "string"
              },
              "frame": {
                "additionalProperties": false,
                "properties": {
                  "operations": {
                    "items": {
                      "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                      "type": "string"
                    },
                    "maxItems": 8,
                    "type": "array"
                  },
                  "origin": {
                    "format": "uri",
                    "type": "string"
                  },
                  "url": {
                    "format": "uri",
                    "maxLength": 2048,
                    "type": "string"
                  }
                },
                "required": [
                  "url",
                  "origin"
                ],
                "type": "object"
              },
              "id": {
                "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                "type": "string"
              },
              "launch": {
                "oneOf": [
                  {
                    "additionalProperties": false,
                    "description": "Opens one of this manifest’s content_actions for the item on screen.",
                    "properties": {
                      "action": {
                        "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                        "type": "string"
                      },
                      "kind": {
                        "const": "content_action",
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "action"
                    ],
                    "type": "object"
                  },
                  {
                    "additionalProperties": false,
                    "description": "Opens one of this manifest’s manage_views. Shown in the sidebar of an item whose model the grant includes, and always to people with site:plugins.",
                    "properties": {
                      "kind": {
                        "const": "manage_view",
                        "type": "string"
                      },
                      "view": {
                        "enum": [
                          "calendar",
                          "releases"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "view"
                    ],
                    "type": "object"
                  }
                ]
              },
              "placement": {
                "const": "entry_sidebar",
                "type": "string"
              },
              "title": {
                "maxLength": 40,
                "minLength": 1,
                "pattern": "^[^\\p{Cc}<>]+$",
                "type": "string"
              }
            },
            "required": [
              "id",
              "placement",
              "title",
              "launch"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "description": {
                "maxLength": 160,
                "minLength": 1,
                "pattern": "^[^\\p{Cc}<>]+$",
                "type": "string"
              },
              "frame": {
                "additionalProperties": false,
                "properties": {
                  "operations": {
                    "items": {
                      "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                      "type": "string"
                    },
                    "maxItems": 8,
                    "type": "array"
                  },
                  "origin": {
                    "format": "uri",
                    "type": "string"
                  },
                  "url": {
                    "format": "uri",
                    "maxLength": 2048,
                    "type": "string"
                  }
                },
                "required": [
                  "url",
                  "origin"
                ],
                "type": "object"
              },
              "id": {
                "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                "type": "string"
              },
              "launch": {
                "oneOf": [
                  {
                    "additionalProperties": false,
                    "description": "Opens one of this manifest’s content_actions for the item on screen.",
                    "properties": {
                      "action": {
                        "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                        "type": "string"
                      },
                      "kind": {
                        "const": "content_action",
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "action"
                    ],
                    "type": "object"
                  },
                  {
                    "additionalProperties": false,
                    "description": "Opens one of this manifest’s manage_views. Shown in the sidebar of an item whose model the grant includes, and always to people with site:plugins.",
                    "properties": {
                      "kind": {
                        "const": "manage_view",
                        "type": "string"
                      },
                      "view": {
                        "enum": [
                          "calendar",
                          "releases"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "view"
                    ],
                    "type": "object"
                  }
                ]
              },
              "placement": {
                "const": "page_sidebar",
                "type": "string"
              },
              "title": {
                "maxLength": 40,
                "minLength": 1,
                "pattern": "^[^\\p{Cc}<>]+$",
                "type": "string"
              }
            },
            "required": [
              "id",
              "placement",
              "title",
              "launch"
            ],
            "type": "object"
          },
          {
            "additionalProperties": false,
            "properties": {
              "description": {
                "maxLength": 160,
                "minLength": 1,
                "pattern": "^[^\\p{Cc}<>]+$",
                "type": "string"
              },
              "frame": {
                "additionalProperties": false,
                "properties": {
                  "operations": {
                    "items": {
                      "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                      "type": "string"
                    },
                    "maxItems": 8,
                    "type": "array"
                  },
                  "origin": {
                    "format": "uri",
                    "type": "string"
                  },
                  "url": {
                    "format": "uri",
                    "maxLength": 2048,
                    "type": "string"
                  }
                },
                "required": [
                  "url",
                  "origin"
                ],
                "type": "object"
              },
              "id": {
                "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                "type": "string"
              },
              "launch": {
                "additionalProperties": false,
                "description": "Opens one of this manifest’s manage_views. Shown in the sidebar of an item whose model the grant includes, and always to people with site:plugins.",
                "properties": {
                  "kind": {
                    "const": "manage_view",
                    "type": "string"
                  },
                  "view": {
                    "enum": [
                      "calendar",
                      "releases"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "kind",
                  "view"
                ],
                "type": "object"
              },
              "placement": {
                "const": "settings_row",
                "type": "string"
              },
              "title": {
                "maxLength": 40,
                "minLength": 1,
                "pattern": "^[^\\p{Cc}<>]+$",
                "type": "string"
              }
            },
            "required": [
              "id",
              "placement",
              "title",
              "launch"
            ],
            "type": "object"
          },
          {
            "oneOf": [
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "text",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  },
                  "validation": {
                    "additionalProperties": false,
                    "properties": {
                      "max_length": {
                        "maximum": 100000,
                        "minimum": 1,
                        "type": "integer"
                      },
                      "min_length": {
                        "maximum": 100000,
                        "minimum": 0,
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label"
                ],
                "type": "object"
              },
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "textarea",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  },
                  "validation": {
                    "additionalProperties": false,
                    "properties": {
                      "max_length": {
                        "maximum": 100000,
                        "minimum": 1,
                        "type": "integer"
                      },
                      "min_length": {
                        "maximum": 100000,
                        "minimum": 0,
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label"
                ],
                "type": "object"
              },
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "url",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  },
                  "validation": {
                    "additionalProperties": false,
                    "properties": {
                      "max_length": {
                        "maximum": 100000,
                        "minimum": 1,
                        "type": "integer"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label"
                ],
                "type": "object"
              },
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "number",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  },
                  "validation": {
                    "additionalProperties": false,
                    "properties": {
                      "max": {
                        "type": "number"
                      },
                      "min": {
                        "type": "number"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label"
                ],
                "type": "object"
              },
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "boolean",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label"
                ],
                "type": "object"
              },
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "date",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  },
                  "validation": {
                    "additionalProperties": false,
                    "properties": {
                      "max_date": {
                        "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                        "type": "string"
                      },
                      "min_date": {
                        "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label"
                ],
                "type": "object"
              },
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "select",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "options": {
                    "items": {
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "maxLength": 64,
                          "minLength": 1,
                          "pattern": "^[^\\p{Cc}<>]+$",
                          "type": "string"
                        },
                        "value": {
                          "maxLength": 64,
                          "minLength": 1,
                          "pattern": "^[^\\p{Cc}<>]+$",
                          "type": "string"
                        }
                      },
                      "required": [
                        "value",
                        "label"
                      ],
                      "type": "object"
                    },
                    "maxItems": 50,
                    "minItems": 1,
                    "type": "array"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label",
                  "options"
                ],
                "type": "object"
              },
              {
                "additionalProperties": false,
                "properties": {
                  "control": {
                    "const": "group",
                    "type": "string"
                  },
                  "frame": {
                    "additionalProperties": false,
                    "properties": {
                      "operations": {
                        "items": {
                          "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                          "type": "string"
                        },
                        "maxItems": 8,
                        "type": "array"
                      },
                      "origin": {
                        "format": "uri",
                        "type": "string"
                      },
                      "url": {
                        "format": "uri",
                        "maxLength": 2048,
                        "type": "string"
                      }
                    },
                    "required": [
                      "url",
                      "origin"
                    ],
                    "type": "object"
                  },
                  "help_text": {
                    "maxLength": 200,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "id": {
                    "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                    "type": "string"
                  },
                  "label": {
                    "maxLength": 40,
                    "minLength": 1,
                    "pattern": "^[^\\p{Cc}<>]+$",
                    "type": "string"
                  },
                  "members": {
                    "description": "The closed members of the structured value. The field stores one JSON object; its schema is written onto the field.",
                    "items": {
                      "oneOf": [
                        {
                          "additionalProperties": false,
                          "properties": {
                            "control": {
                              "const": "text",
                              "type": "string"
                            },
                            "key": {
                              "pattern": "^[a-z][a-z0-9_]{0,31}$",
                              "type": "string"
                            },
                            "label": {
                              "maxLength": 40,
                              "minLength": 1,
                              "pattern": "^[^\\p{Cc}<>]+$",
                              "type": "string"
                            },
                            "max_length": {
                              "maximum": 500,
                              "minimum": 1,
                              "type": "integer"
                            },
                            "required": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "key",
                            "label",
                            "control",
                            "max_length"
                          ],
                          "type": "object"
                        },
                        {
                          "additionalProperties": false,
                          "properties": {
                            "control": {
                              "const": "number",
                              "type": "string"
                            },
                            "integer": {
                              "type": "boolean"
                            },
                            "key": {
                              "pattern": "^[a-z][a-z0-9_]{0,31}$",
                              "type": "string"
                            },
                            "label": {
                              "maxLength": 40,
                              "minLength": 1,
                              "pattern": "^[^\\p{Cc}<>]+$",
                              "type": "string"
                            },
                            "max": {
                              "type": "number"
                            },
                            "min": {
                              "type": "number"
                            },
                            "required": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "key",
                            "label",
                            "control"
                          ],
                          "type": "object"
                        },
                        {
                          "additionalProperties": false,
                          "properties": {
                            "control": {
                              "const": "boolean",
                              "type": "string"
                            },
                            "key": {
                              "pattern": "^[a-z][a-z0-9_]{0,31}$",
                              "type": "string"
                            },
                            "label": {
                              "maxLength": 40,
                              "minLength": 1,
                              "pattern": "^[^\\p{Cc}<>]+$",
                              "type": "string"
                            }
                          },
                          "required": [
                            "key",
                            "label",
                            "control"
                          ],
                          "type": "object"
                        },
                        {
                          "additionalProperties": false,
                          "properties": {
                            "control": {
                              "const": "select",
                              "type": "string"
                            },
                            "key": {
                              "pattern": "^[a-z][a-z0-9_]{0,31}$",
                              "type": "string"
                            },
                            "label": {
                              "maxLength": 40,
                              "minLength": 1,
                              "pattern": "^[^\\p{Cc}<>]+$",
                              "type": "string"
                            },
                            "options": {
                              "items": {
                                "additionalProperties": false,
                                "properties": {
                                  "label": {
                                    "maxLength": 64,
                                    "minLength": 1,
                                    "pattern": "^[^\\p{Cc}<>]+$",
                                    "type": "string"
                                  },
                                  "value": {
                                    "maxLength": 64,
                                    "minLength": 1,
                                    "pattern": "^[^\\p{Cc}<>]+$",
                                    "type": "string"
                                  }
                                },
                                "required": [
                                  "value",
                                  "label"
                                ],
                                "type": "object"
                              },
                              "maxItems": 12,
                              "minItems": 1,
                              "type": "array"
                            },
                            "required": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "key",
                            "label",
                            "control",
                            "options"
                          ],
                          "type": "object"
                        }
                      ]
                    },
                    "maxItems": 8,
                    "minItems": 1,
                    "type": "array"
                  },
                  "placement": {
                    "const": "field_editor",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "placement",
                  "control",
                  "label",
                  "members"
                ],
                "type": "object"
              }
            ]
          }
        ]
      },
      "maxItems": 16,
      "minItems": 1,
      "type": "array"
    },
    "version": {
      "maxLength": 64,
      "pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$",
      "type": "string"
    }
  },
  "required": [
    "manifest_version",
    "id",
    "name",
    "version",
    "protocol_versions",
    "base_url",
    "activation_url",
    "management_url",
    "requested_capabilities"
  ],
  "title": "Dee Wan plugin manifest v1",
  "type": "object"
}
