{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://dsp.dev/schemas/ops.schema.json",
    "title": "Diagram Scene Protocol Operations Schema",
    "description": "Draft JSON Schema for DSP operation envelopes and operation payloads.",
    "type": "object",
    "additionalProperties": false,
    "required": ["schemaVersion", "sceneId", "baseRevision", "ops"],
    "properties": {
      "schemaVersion": {
        "type": "string",
        "const": "0.1"
      },
      "sceneId": {
        "$ref": "#/$defs/id"
      },
      "baseRevision": {
        "type": "integer",
        "minimum": 0
      },
      "transactionMode": {
        "type": "string",
        "enum": ["allOrNothing", "bestEffort"],
        "default": "allOrNothing"
      },
      "ops": {
        "type": "array",
        "items": {
          "$ref": "#/$defs/op"
        }
      },
      "extensions": {
        "type": "object",
        "additionalProperties": true,
        "default": {}
      },
      "message": {
        "type": "string",
        "description": "Optional revision message describing what this operation batch does (like a git commit message)"
      }
    },
    "$defs": {
      "id": {
        "type": "string",
        "minLength": 1,
        "maxLength": 256,
        "pattern": "^[A-Za-z0-9._:-]+$"
      },
      "nonNegativeNumber": {
        "type": "number",
        "minimum": 0
      },
      "metadata": {
        "type": "object",
        "additionalProperties": true,
        "default": {}
      },
      "extensions": {
        "type": "object",
        "additionalProperties": true,
        "default": {}
      },
      "size": {
        "type": "object",
        "additionalProperties": false,
        "required": ["width", "height"],
        "properties": {
          "width": {
            "$ref": "#/$defs/nonNegativeNumber"
          },
          "height": {
            "$ref": "#/$defs/nonNegativeNumber"
          }
        }
      },
      "point": {
        "type": "object",
        "additionalProperties": false,
        "required": ["x", "y"],
        "properties": {
          "x": {
            "type": "number"
          },
          "y": {
            "type": "number"
          }
        }
      },
      "rotation": {
        "type": "number"
      },
      "router": {
        "type": "string",
        "enum": ["straight", "orthogonal", "curved", "polyline"]
      },
      "side": {
        "type": "string",
        "enum": ["top", "right", "bottom", "left"]
      },
      "arrowhead": {
        "type": "string",
        "enum": ["none", "triangle", "diamond", "circle", "bar"]
      },
      "fitMode": {
        "type": "string",
        "enum": ["contain", "cover", "stretch", "original"]
      },
      "nodeType": {
        "type": "string",
        "enum": [
          "generic",
          "service",
          "database",
          "queue",
          "actor",
          "note",
          "decision",
          "document",
          "process",
          "container",
          "externalSystem",
          "storage",
          "event",
          "iconNode",
          "workflow.start",
          "workflow.end",
          "workflow.task",
          "workflow.decision",
          "workflow.gateway",
          "workflow.gatewayParallel",
          "workflow.gatewayInclusive",
          "workflow.subprocess",
          "workflow.timer",
          "workflow.error",
          "er.entity",
          "er.weakEntity",
          "er.attribute",
          "er.relationship",
          "sequence.lifeline",
          "sequence.activation",
          "sequence.actor",
          "sequence.note",
          "network.server",
          "network.router",
          "network.switch",
          "network.firewall",
          "network.cloud",
          "network.client",
          "org.person",
          "org.role",
          "org.department"
        ]
      },
      "shape": {
        "type": "string",
        "enum": [
          "rect",
          "roundedRect",
          "ellipse",
          "diamond",
          "cylinder",
          "pill",
          "hexagon",
          "parallelogram",
          "cloud",
          "box3d",
          "textBox",
          "iconBox"
        ]
      },
      "axis": {
        "type": "string",
        "enum": ["x", "y"]
      },
      "centerAxis": {
        "type": "string",
        "enum": ["x", "y", "both"]
      },
      "alignX": {
        "type": "string",
        "enum": ["left", "center", "right"]
      },
      "alignY": {
        "type": "string",
        "enum": ["top", "center", "bottom"]
      },
      "textWrap": {
        "type": "string",
        "enum": ["none", "word", "character"]
      },
      "textAlign": {
        "type": "string",
        "enum": ["left", "center", "right"]
      },
      "verticalAlign": {
        "type": "string",
        "enum": ["top", "middle", "bottom"]
      },
      "sameSizeDimension": {
        "type": "string",
        "enum": ["width", "height", "both"]
      },
      "port": {
        "type": "object",
        "additionalProperties": false,
        "required": ["id", "side"],
        "properties": {
          "id": {
            "$ref": "#/$defs/id"
          },
          "side": {
            "$ref": "#/$defs/side"
          },
          "offset": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "label": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/$defs/metadata"
          }
        }
      },
      "absoluteLayout": {
        "type": "object",
        "additionalProperties": false,
        "required": ["mode", "x", "y", "width", "height"],
        "properties": {
          "mode": {
            "type": "string",
            "const": "absolute"
          },
          "x": {
            "type": "number"
          },
          "y": {
            "type": "number"
          },
          "width": {
            "$ref": "#/$defs/nonNegativeNumber"
          },
          "height": {
            "$ref": "#/$defs/nonNegativeNumber"
          },
          "rotation": {
            "$ref": "#/$defs/rotation"
          }
        }
      },
      "placeClause": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "above": {
            "$ref": "#/$defs/id"
          },
          "below": {
            "$ref": "#/$defs/id"
          },
          "leftOf": {
            "$ref": "#/$defs/id"
          },
          "rightOf": {
            "$ref": "#/$defs/id"
          },
          "inside": {
            "$ref": "#/$defs/id"
          },
          "gap": {
            "$ref": "#/$defs/nonNegativeNumber"
          },
          "alignX": {
            "$ref": "#/$defs/alignX"
          },
          "alignY": {
            "$ref": "#/$defs/alignY"
          }
        },
        "allOf": [
          {
            "oneOf": [
              { "required": ["above"] },
              { "required": ["below"] },
              { "required": ["leftOf"] },
              { "required": ["rightOf"] },
              { "required": ["inside"] }
            ]
          }
        ]
      },
      "relativeLayout": {
        "type": "object",
        "additionalProperties": false,
        "required": ["mode", "place"],
        "properties": {
          "mode": {
            "type": "string",
            "const": "relative"
          },
          "place": {
            "$ref": "#/$defs/placeClause"
          },
          "preferredSize": {
            "$ref": "#/$defs/size"
          },
          "rotation": {
            "$ref": "#/$defs/rotation"
          }
        }
      },
      "layout": {
        "oneOf": [
          {
            "$ref": "#/$defs/absoluteLayout"
          },
          {
            "$ref": "#/$defs/relativeLayout"
          }
        ]
      },
      "anchor": {
        "type": "object",
        "additionalProperties": false,
        "required": ["side", "offset"],
        "properties": {
          "side": {
            "$ref": "#/$defs/side"
          },
          "offset": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        }
      },
      "endpoint": {
        "type": "object",
        "additionalProperties": false,
        "required": ["elementId"],
        "properties": {
          "elementId": {
            "$ref": "#/$defs/id"
          },
          "portId": {
            "$ref": "#/$defs/id"
          },
          "anchor": {
            "$ref": "#/$defs/anchor"
          }
        },
        "allOf": [
          {
            "not": {
              "required": ["portId", "anchor"]
            }
          }
        ]
      },
      "edgeEndpoints": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "startArrow": {
            "$ref": "#/$defs/arrowhead"
          },
          "endArrow": {
            "$ref": "#/$defs/arrowhead"
          }
        }
      },
      "textStyle": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "wrap": {
            "$ref": "#/$defs/textWrap"
          },
          "align": {
            "$ref": "#/$defs/textAlign"
          },
          "verticalAlign": {
            "$ref": "#/$defs/verticalAlign"
          }
        }
      },
      "styleValue": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "fill": {
            "type": "string",
            "minLength": 1
          },
          "stroke": {
            "type": "string",
            "minLength": 1
          },
          "strokeWidth": {
            "$ref": "#/$defs/nonNegativeNumber"
          },
          "cornerRadius": {
            "$ref": "#/$defs/nonNegativeNumber"
          },
          "fontFamily": {
            "type": "string"
          },
          "fontSize": {
            "$ref": "#/$defs/nonNegativeNumber"
          },
          "fontWeight": {
            "oneOf": [
              {
                "type": "integer",
                "minimum": 100,
                "maximum": 900,
                "multipleOf": 100
              },
              {
                "type": "string",
                "enum": ["normal", "bold", "lighter", "bolder"]
              }
            ]
          },
          "textColor": {
            "type": "string",
            "minLength": 1
          },
          "dash": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/nonNegativeNumber"
            }
          },
          "labelBackground": {
            "type": "string",
            "minLength": 1
          },
          "opacity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "color": {
            "type": "string",
            "minLength": 1,
            "description": "Alias for textColor (normalized to textColor at runtime)"
          }
        }
      },
      "constraint": {
        "oneOf": [
          {
            "$ref": "#/$defs/alignConstraint"
          },
          {
            "$ref": "#/$defs/distributeConstraint"
          },
          {
            "$ref": "#/$defs/containConstraint"
          },
          {
            "$ref": "#/$defs/stackConstraint"
          },
          {
            "$ref": "#/$defs/gridConstraint"
          },
          {
            "$ref": "#/$defs/sameSizeConstraint"
          },
          {
            "$ref": "#/$defs/minGapConstraint"
          },
          {
            "$ref": "#/$defs/noOverlapConstraint"
          },
          {
            "$ref": "#/$defs/centerInConstraint"
          }
        ]
      },
      "constraintBase": {
        "type": "object",
        "required": ["type"],
        "properties": {
          "type": {
            "type": "string"
          },
          "id": {
            "$ref": "#/$defs/id"
          },
          "required": {
            "type": "boolean"
          },
          "metadata": {
            "$ref": "#/$defs/metadata"
          }
        }
      },
      "elementIdList": {
        "type": "array",
        "items": {
          "$ref": "#/$defs/id"
        },
        "minItems": 1
      },
      "alignConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "axis", "elements"],
            "properties": {
              "type": {
                "const": "align"
              },
              "axis": {
                "$ref": "#/$defs/axis"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              }
            }
          }
        ]
      },
      "distributeConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "axis", "elements"],
            "properties": {
              "type": {
                "const": "distribute"
              },
              "axis": {
                "$ref": "#/$defs/axis"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "gap": {
                "$ref": "#/$defs/nonNegativeNumber"
              }
            }
          }
        ]
      },
      "containConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "containerId", "elements"],
            "properties": {
              "type": {
                "const": "contain"
              },
              "containerId": {
                "$ref": "#/$defs/id"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "padding": {
                "$ref": "#/$defs/nonNegativeNumber"
              }
            }
          }
        ]
      },
      "stackConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "axis", "elements"],
            "properties": {
              "type": {
                "const": "stack"
              },
              "axis": {
                "$ref": "#/$defs/axis"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "gap": {
                "$ref": "#/$defs/nonNegativeNumber"
              }
            }
          }
        ]
      },
      "gridConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "elements"],
            "properties": {
              "type": {
                "const": "grid"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "columns": {
                "type": "integer",
                "minimum": 1
              },
              "rows": {
                "type": "integer",
                "minimum": 1
              },
              "columnGap": {
                "$ref": "#/$defs/nonNegativeNumber"
              },
              "rowGap": {
                "$ref": "#/$defs/nonNegativeNumber"
              }
            }
          }
        ]
      },
      "sameSizeConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "elements"],
            "properties": {
              "type": {
                "const": "sameSize"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "dimension": {
                "$ref": "#/$defs/sameSizeDimension"
              }
            }
          }
        ]
      },
      "minGapConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "axis", "elements", "gap"],
            "properties": {
              "type": {
                "const": "minGap"
              },
              "axis": {
                "$ref": "#/$defs/axis"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "gap": {
                "$ref": "#/$defs/nonNegativeNumber"
              }
            }
          }
        ]
      },
      "noOverlapConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "elements"],
            "properties": {
              "type": {
                "const": "noOverlap"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              }
            }
          }
        ]
      },
      "centerInConstraint": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/constraintBase"
          },
          {
            "type": "object",
            "required": ["type", "containerId", "elements"],
            "properties": {
              "type": {
                "const": "centerIn"
              },
              "containerId": {
                "$ref": "#/$defs/id"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "axis": {
                "$ref": "#/$defs/centerAxis"
              }
            }
          }
        ]
      },
      "opBase": {
        "type": "object",
        "required": ["op"],
        "properties": {
          "op": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/$defs/metadata"
          },
          "extensions": {
            "$ref": "#/$defs/extensions"
          }
        }
      },
      "op": {
        "oneOf": [
          {
            "$ref": "#/$defs/createNodeOp"
          },
          {
            "$ref": "#/$defs/updateNodeOp"
          },
          {
            "$ref": "#/$defs/deleteElementOp"
          },
          {
            "$ref": "#/$defs/createEdgeOp"
          },
          {
            "$ref": "#/$defs/updateEdgeOp"
          },
          {
            "$ref": "#/$defs/groupElementsOp"
          },
          {
            "$ref": "#/$defs/ungroupElementsOp"
          },
          {
            "$ref": "#/$defs/createFrameOp"
          },
          {
            "$ref": "#/$defs/moveElementOp"
          },
          {
            "$ref": "#/$defs/resizeElementOp"
          },
          {
            "$ref": "#/$defs/setStyleOp"
          },
          {
            "$ref": "#/$defs/setTextOp"
          },
          {
            "$ref": "#/$defs/addConstraintOp"
          },
          {
            "$ref": "#/$defs/removeConstraintOp"
          },
          {
            "$ref": "#/$defs/autoLayoutOp"
          },
          {
            "$ref": "#/$defs/normalizeSceneOp"
          },
          {
            "$ref": "#/$defs/updateSceneOp"
          }
        ]
      },
      "createNodeOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id", "nodeType", "shape"],
            "properties": {
              "op": {
                "const": "createNode"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "name": {
                "type": "string"
              },
              "zIndex": {
                "type": "integer"
              },
              "locked": {
                "type": "boolean"
              },
              "visible": {
                "type": "boolean"
              },
              "style": {
                "oneOf": [
                  { "type": "string", "description": "Reference to a named style in scene.styles" },
                  { "$ref": "#/$defs/styleValue", "description": "Inline style object" }
                ],
                "description": "Element style: either a named-style string key (resolved against scene.styles) or an inline StyleValue object"
              },
              "nodeType": {
                "$ref": "#/$defs/nodeType"
              },
              "shape": {
                "$ref": "#/$defs/shape"
              },
              "label": {
                "type": "string"
              },
              "layout": {
                "$ref": "#/$defs/layout"
              },
              "ports": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/port"
                }
              },
              "icon": {
                "type": "string"
              },
              "x": {
                "type": "number",
                "description": "Position shorthand: x-coordinate (equivalent to layout.x)"
              },
              "y": {
                "type": "number",
                "description": "Position shorthand: y-coordinate (equivalent to layout.y)"
              },
              "width": {
                "type": "number",
                "minimum": 0,
                "description": "Position shorthand: width (equivalent to layout.width)"
              },
              "height": {
                "type": "number",
                "minimum": 0,
                "description": "Position shorthand: height (equivalent to layout.height)"
              }
            }
          }
        ]
      },
      "updateNodeOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id"],
            "properties": {
              "op": {
                "const": "updateNode"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "name": {
                "type": "string"
              },
              "zIndex": {
                "type": "integer"
              },
              "locked": {
                "type": "boolean"
              },
              "visible": {
                "type": "boolean"
              },
              "style": {
                "oneOf": [
                  { "type": "string", "description": "Reference to a named style in scene.styles" },
                  { "$ref": "#/$defs/styleValue", "description": "Inline style object" }
                ],
                "description": "Element style: either a named-style string key (resolved against scene.styles) or an inline StyleValue object"
              },
              "nodeType": {
                "$ref": "#/$defs/nodeType"
              },
              "shape": {
                "$ref": "#/$defs/shape"
              },
              "label": {
                "type": "string"
              },
              "layout": {
                "$ref": "#/$defs/layout"
              },
              "ports": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/port"
                }
              },
              "icon": {
                "type": "string"
              }
            },
            "anyOf": [
              { "required": ["name"] },
              { "required": ["zIndex"] },
              { "required": ["locked"] },
              { "required": ["visible"] },
              { "required": ["style"] },
              { "required": ["nodeType"] },
              { "required": ["shape"] },
              { "required": ["label"] },
              { "required": ["layout"] },
              { "required": ["ports"] },
              { "required": ["icon"] },
              { "required": ["metadata"] },
              { "required": ["extensions"] }
            ]
          }
        ]
      },
      "deleteElementOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id"],
            "properties": {
              "op": {
                "const": "deleteElement"
              },
              "id": {
                "$ref": "#/$defs/id"
              }
            }
          }
        ]
      },
      "createEdgeOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id", "from", "to"],
            "properties": {
              "op": {
                "const": "createEdge"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "name": {
                "type": "string"
              },
              "zIndex": {
                "type": "integer"
              },
              "locked": {
                "type": "boolean"
              },
              "visible": {
                "type": "boolean"
              },
              "style": {
                "oneOf": [
                  { "type": "string", "description": "Reference to a named style in scene.styles" },
                  { "$ref": "#/$defs/styleValue", "description": "Inline style object" }
                ],
                "description": "Element style: either a named-style string key (resolved against scene.styles) or an inline StyleValue object"
              },
              "from": {
                "$ref": "#/$defs/endpoint"
              },
              "to": {
                "$ref": "#/$defs/endpoint"
              },
              "router": {
                "$ref": "#/$defs/router"
              },
              "label": {
                "type": "string"
              },
              "endpoints": {
                "$ref": "#/$defs/edgeEndpoints"
              },
              "waypoints": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/point"
                }
              },
              "edgeType": {
                "type": "string",
                "enum": ["default", "workflow.sequenceFlow", "workflow.messageFlow", "er.relationship", "er.identifying", "sequence.message", "sequence.reply", "sequence.create", "network.dataFlow", "network.controlFlow", "org.directReport", "org.dottedLine"]
              }
            }
          }
        ]
      },
      "updateEdgeOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id"],
            "properties": {
              "op": {
                "const": "updateEdge"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "name": {
                "type": "string"
              },
              "zIndex": {
                "type": "integer"
              },
              "locked": {
                "type": "boolean"
              },
              "visible": {
                "type": "boolean"
              },
              "style": {
                "oneOf": [
                  { "type": "string", "description": "Reference to a named style in scene.styles" },
                  { "$ref": "#/$defs/styleValue", "description": "Inline style object" }
                ],
                "description": "Element style: either a named-style string key (resolved against scene.styles) or an inline StyleValue object"
              },
              "from": {
                "$ref": "#/$defs/endpoint"
              },
              "to": {
                "$ref": "#/$defs/endpoint"
              },
              "router": {
                "$ref": "#/$defs/router"
              },
              "label": {
                "type": "string"
              },
              "endpoints": {
                "$ref": "#/$defs/edgeEndpoints"
              },
              "waypoints": {
                "type": "array",
                "items": {
                  "$ref": "#/$defs/point"
                }
              },
              "edgeType": {
                "type": "string",
                "enum": ["default", "workflow.sequenceFlow", "workflow.messageFlow", "er.relationship", "er.identifying", "sequence.message", "sequence.reply", "sequence.create", "network.dataFlow", "network.controlFlow", "org.directReport", "org.dottedLine"]
              }
            },
            "anyOf": [
              { "required": ["name"] },
              { "required": ["zIndex"] },
              { "required": ["locked"] },
              { "required": ["visible"] },
              { "required": ["style"] },
              { "required": ["from"] },
              { "required": ["to"] },
              { "required": ["router"] },
              { "required": ["label"] },
              { "required": ["endpoints"] },
              { "required": ["waypoints"] },
              { "required": ["metadata"] },
              { "required": ["extensions"] }
            ]
          }
        ]
      },
      "groupElementsOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id", "children"],
            "properties": {
              "op": {
                "const": "groupElements"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "name": {
                "type": "string"
              },
              "zIndex": {
                "type": "integer"
              },
              "locked": {
                "type": "boolean"
              },
              "visible": {
                "type": "boolean"
              },
              "style": {
                "oneOf": [
                  { "type": "string", "description": "Reference to a named style in scene.styles" },
                  { "$ref": "#/$defs/styleValue", "description": "Inline style object" }
                ],
                "description": "Element style: either a named-style string key (resolved against scene.styles) or an inline StyleValue object"
              },
              "title": {
                "type": "string"
              },
              "children": {
                "$ref": "#/$defs/elementIdList"
              },
              "layout": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "padding": {
                    "$ref": "#/$defs/nonNegativeNumber"
                  },
                  "titleBar": {
                    "$ref": "#/$defs/nonNegativeNumber"
                  },
                  "autoResize": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        ]
      },
      "ungroupElementsOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id"],
            "properties": {
              "op": {
                "const": "ungroupElements"
              },
              "id": {
                "$ref": "#/$defs/id"
              }
            }
          }
        ]
      },
      "createFrameOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id", "children", "layout"],
            "properties": {
              "op": {
                "const": "createFrame"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "name": {
                "type": "string"
              },
              "zIndex": {
                "type": "integer"
              },
              "locked": {
                "type": "boolean"
              },
              "visible": {
                "type": "boolean"
              },
              "style": {
                "oneOf": [
                  { "type": "string", "description": "Reference to a named style in scene.styles" },
                  { "$ref": "#/$defs/styleValue", "description": "Inline style object" }
                ],
                "description": "Element style: either a named-style string key (resolved against scene.styles) or an inline StyleValue object"
              },
              "title": {
                "type": "string"
              },
              "children": {
                "$ref": "#/$defs/elementIdList"
              },
              "layout": {
                "$ref": "#/$defs/layout"
              },
              "containerType": {
                "type": "string",
                "enum": ["generic", "pool", "lane", "subprocess", "partition", "package", "boundary"]
              },
              "laneDirection": {
                "type": "string",
                "enum": ["horizontal", "vertical"]
              }
            }
          }
        ]
      },
      "moveElementOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id", "delta"],
            "properties": {
              "op": {
                "const": "moveElement"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "delta": {
                "type": "object",
                "additionalProperties": false,
                "required": ["dx", "dy"],
                "properties": {
                  "dx": {
                    "type": "number"
                  },
                  "dy": {
                    "type": "number"
                  }
                }
              }
            }
          }
        ]
      },
      "resizeElementOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id", "size"],
            "properties": {
              "op": {
                "const": "resizeElement"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "size": {
                "$ref": "#/$defs/size"
              },
              "anchor": {
                "$ref": "#/$defs/side"
              }
            }
          }
        ]
      },
      "setStyleOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id"],
            "properties": {
              "op": {
                "const": "setStyle"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "style": {
                "oneOf": [
                  { "type": "string", "description": "Reference to a named style in scene.styles" },
                  { "$ref": "#/$defs/styleValue", "description": "Inline style object" }
                ],
                "description": "Element style: either a named-style string key (resolved against scene.styles) or an inline StyleValue object"
              },
              "styleOverride": {
                "$ref": "#/$defs/styleValue"
              }
            },
            "oneOf": [
              { "required": ["style"] },
              { "required": ["styleOverride"] }
            ]
          }
        ]
      },
      "setTextOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id", "text"],
            "properties": {
              "op": {
                "const": "setText"
              },
              "id": {
                "$ref": "#/$defs/id"
              },
              "text": {
                "type": "string"
              },
              "textStyle": {
                "$ref": "#/$defs/textStyle"
              }
            }
          }
        ]
      },
      "addConstraintOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "constraint"],
            "properties": {
              "op": {
                "const": "addConstraint"
              },
              "constraint": {
                "$ref": "#/$defs/constraint"
              }
            }
          }
        ]
      },
      "removeConstraintOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op", "id"],
            "properties": {
              "op": {
                "const": "removeConstraint"
              },
              "id": {
                "$ref": "#/$defs/id"
              }
            }
          }
        ]
      },
      "autoLayoutStrategy": {
        "type": "string",
        "enum": ["constraintAware", "grid", "hierarchical", "flow", "forceDirected"]
      },
      "autoLayoutOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op"],
            "properties": {
              "op": {
                "const": "autoLayout"
              },
              "strategy": {
                "$ref": "#/$defs/autoLayoutStrategy"
              },
              "scope": {
                "type": "string",
                "enum": ["scene", "selection"],
                "default": "scene"
              },
              "elements": {
                "$ref": "#/$defs/elementIdList"
              },
              "writeBack": {
                "type": "boolean",
                "default": true
              }
            }
          }
        ]
      },
      "normalizeSceneOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op"],
            "properties": {
              "op": {
                "const": "normalizeScene"
              },
              "recomputeLayout": {
                "type": "boolean",
                "default": true
              },
              "recomputeEdgePaths": {
                "type": "boolean",
                "default": true
              },
              "applyDefaults": {
                "type": "boolean",
                "default": true
              },
              "generateDiagnostics": {
                "type": "boolean",
                "default": true
              }
            }
          }
        ]
      },
      "updateSceneOp": {
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/$defs/opBase"
          },
          {
            "type": "object",
            "required": ["op"],
            "properties": {
              "op": {
                "const": "updateScene"
              },
              "title": {
                "type": "string",
                "description": "Update the scene title"
              },
              "palette": {
                "type": "object",
                "description": "Scene-level color palette overrides. Pass null to remove.",
                "properties": {
                  "background": { "type": "string" },
                  "foreground": { "type": "string" },
                  "nodeFill": { "type": "string" },
                  "nodeStroke": { "type": "string" },
                  "edgeStroke": { "type": "string" },
                  "accentPrimary": { "type": "string" },
                  "accentSecondary": { "type": "string" },
                  "mutedForeground": { "type": "string" },
                  "containerFill": { "type": "string" },
                  "containerStroke": { "type": "string" }
                }
              },
              "styles": {
                "type": "object",
                "description": "Merge entries into the named styles registry (additive, not replacement)",
                "additionalProperties": {
                  "$ref": "#/$defs/styleValue"
                }
              },
              "layoutStrategy": {
                "type": "object",
                "description": "Update the auto-layout strategy. Pass null to remove.",
                "properties": {
                  "algorithm": {
                    "type": "string",
                    "enum": ["hierarchical", "flow", "grid", "forceDirected"]
                  },
                  "direction": {
                    "type": "string",
                    "enum": ["TB", "BT", "LR", "RL"]
                  },
                  "nodeSpacing": { "type": "number" },
                  "rankSpacing": { "type": "number" },
                  "nodeWidth": { "type": "number" },
                  "nodeHeight": { "type": "number" }
                },
                "required": ["algorithm"]
              },
              "diagramFamily": {
                "type": "string",
                "enum": ["architecture", "workflow", "entityRelationship", "sequence", "network", "orgchart", "uiflow"],
                "description": "Update the diagram family declaration"
              },
              "canvas": {
                "type": "object",
                "description": "Partial merge into canvas dimensions and background",
                "properties": {
                  "width": { "type": "number", "minimum": 0 },
                  "height": { "type": "number", "minimum": 0 },
                  "background": { "type": "string" }
                }
              }
            }
          }
        ]
      }
    }
  }
  