
{
    "$schema": "https://json-schema.org/draft-04/schema#",
    "title": "Canvas Info",
    "description": "Canvas Info Flow Schema - for internal Common Canvas use.",
    "type": "object",
    "id": "https://api.dataplatform.ibm.com/schemas/common-canvas/canvas-info/canvas-info-v3-schema.json",
    "properties": {
      "doc_type": {
        "description": "Document type",
        "type": "string"
      },
      "version": {
        "description": "Canvas info flow schema version",
        "enum": [
          "3.0"
        ]
      },
      "json_schema": {
        "description": "Refers to the JSON schema used to validate documents of this type",
        "enum": [
          "http://api.dataplatform.ibm.com/schemas/common-canvas/canvas-info/canvas-info-v3-schema.json",
          "https://api.dataplatform.ibm.com/schemas/common-canvas/canvas-info/canvas-info-v3-schema.json"
        ]
      },
      "open_with_tool": {
        "description": "Preferred authoring application",
        "type": "string"
      },
      "id": {
        "description": "Document identifier, GUID recommended",
        "type": "string"
      },
      "name": {
        "description": "User-defined name",
        "type": "string"
      },
      "description": {
        "description": "User-defined description",
        "type": "string"
      },
      "class_name": {
        "description": "CSS class name",
        "type": "string"
      },
      "parameters": {
        "description": "Parameters for the flow document",
        "type": "object",
        "properties": {},
        "additionalProperties": true
      },
      "primary_pipeline": {
        "description": "Reference to the primary (main) pipeline flow within the document",
        "type": "string"
      },
      "pipelines": {
        "description": "Array of pipelines",
        "type": "array",
        "minItems": 1,
        "items": {
          "$ref": "#/definitions/canvas_pipeline"
        },
        "uniqueItems": true
      },
      "schemas": {
        "description": "Array of data record schemas used in the document",
        "type": "array",
        "minItems": 0,
        "items": {
          "$ref": "https://api.dataplatform.ibm.com/schemas/common-pipeline/datarecord-metadata/datarecord-metadata-v3-schema.json#/definitions/record_schema"
        },
        "uniqueItems": true
      },
      "runtimes": {
        "description": "Array of runtime objects referred to in the document",
        "type": "array",
        "minItems": 0,
        "items": {
          "$ref": "./pipeline-flow-v3-schema.json#/definitions/runtime_def"
        },
        "uniqueItems": true
      },
      "external_paramsets": {
        "description": "Array of parameter set references",
        "type": "array",
        "minItems": 0,
        "items": {
          "$ref": "https://api.dataplatform.ibm.com/schemas/common-pipeline/parameters/parametersets-v3-schema.json#/definitions/paramset_ref"
        },
        "uniqueItems": true
      },
      "app_data": {
        "description": "Object containing app-specific data",
        "type": "object",
        "additionalProperties": true
      }
    },
    "required": [
      "id",
      "doc_type",
      "version",
      "primary_pipeline",
      "pipelines"
    ],
    "additionalProperties": false,
    "definitions": {
      "canvas_pipeline": {
        "description": "Definition of a single canvas-info pipeline",
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique identifier for this canvas-info pipeline",
            "type": "string"
          },
          "description": {
            "description": "Description for this canvas-info pipeline",
            "type": "string"
          },
          "name": {
            "description": "User-readable for this canvas-info pipeline",
            "type": "string"
          },
          "runtime_ref": {
            "description": "Reference to the id of the runtime associated with the operations in the current pipeline",
            "type": "string"
          },
          "nodes": {
            "description": "Array of canvas nodes for this canvas pipeline",
            "type": "array",
            "minItems": 0,
            "items": {
              "$ref": "#/definitions/canvas_node"
            },
            "uniqueItems": true
          },
          "comments": {
            "description": "Array of canvas comments for this canvas pipeline",
            "type": "array",
            "minItems": 0,
            "items": {
              "$ref": "#/definitions/canvas_comment"
            },
            "uniqueItems": true
          },
          "links": {
            "description": "Array of canvas links for this canvas pipeline",
            "type": "array",
            "minItems": 0,
            "items": {
              "$ref": "#/definitions/canvas_link"
            },
            "uniqueItems": true
          },
          "parameters": {
            "description": "Parameters for this canvas-info pipeline",
            "type": "object",
            "properties": {},
            "additionalProperties": true
          },
          "zoom": {
            "description": "X/Y pan and scale amounts for the canvas.",
            "type": "object",
             "$ref": "./pipeline-flow-ui-v3-schema.json#/definitions/zoom_object_def"
          },
          "app_data": {
            "description": "Object containing app-specific data",
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "id",
          "nodes"
        ],
        "additionalProperties": false
      },
      "canvas_node": {
        "oneOf": [
          {
            "$ref": "#/definitions/canvas_execution_node"
          },
          {
            "$ref": "#/definitions/canvas_supernode"
          },
          {
            "$ref": "#/definitions/canvas_binding_entry_node"
          },
          {
            "$ref": "#/definitions/canvas_binding_exit_node"
          },
          {
            "$ref": "#/definitions/canvas_model_node"
          }
        ]
      },
      "canvas_node_shared_properties": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique identifier for canvas node within the current pipeline",
            "type": "string"
          },
          "label": {
            "description": "Label of this canvas node.",
            "type": "string"
          },
          "description": {
            "description": "Description of this canvas node.",
            "type": "string"
          },
          "class_name": {
            "description": "CSS class name - can be a space separated list of classes",
            "type": "string"
          },
          "style": {
            "description": "A 'style spec' object containing CSS strings to be applied to the SVG objects of the node.",
            "type": ["string", "object"]
          },
          "image": {
            "description": "URL to image source. Although a data URL can be used to embed an image inline, it is not recommended. The 'image' property can also be a JSX object that displays an image using an <svg> element however, JSX images must be set programmatically and cannot be stringified into JSON.",
            "type": ["string", "object"]
          },
          "x_pos": {
            "description": "X coordinate position of the node on the canvas. Calculated by Common Canvas for automatically positioned nodes.",
            "type": "number"
          },
          "y_pos": {
            "description": "Y coordinate position of the node on the canvas. Calculated by Common Canvas for automatically positioned nodes.",
            "type": "number"
          },
          "height": {
            "description": "@readonly Height of the node calculated by Common Canvas based on what customization options are enabled.",
            "type": "number",
            "readOnly": true
          },
          "width": {
            "description": "@readonly Width of the node calculated by Common Canvas based on what customization options are enabled.",
            "type": "number",
            "readOnly": true
          },
          "isResized": {
            "description": "Indicates whether a node has been resized or not. If true, resizeWidth and resizeHeight are used for node display. If false, the default width and height are used.",
            "type": "boolean"
          },
          "resizeHeight": {
            "description": "Height of resized node. The node will be displayed with this height, when isResized is true, in preference to its default height.",
            "type": "number"
          },
          "resizeWidth": {
            "description": "Width of resized node. The node will be displayed with this width, when isResized is true, in preference to its default width.",
            "type": "number"
          },
          "attributes": {
            "description": "additional attributes",
            "type": "string"
          },
          "messages": {
            "description": "An array of messages for the node",
            "type": "array",
            "minItems": 0,
            "items": {
              "$ref": "./pipeline-flow-ui-v3-schema.json#/definitions/message_def"
            },
            "uniqueItems": true
          },
          "palette_image": {
            "description": "Image name for the node displayed in palette. If omitted the image from 'image' field will be used.",
            "type": "string"
          },
          "palette_class_name": {
            "description": "CSS class name applied to the <div> shown in palette for the node",
            "type": "string"
          },
          "palette_disabled": {
            "description": "Indicates whether the node in the palette is disabled. If true, prevents the node being dragged or double-clicked from palette.",
            "type": "boolean"
          },
          "decorations": {
            "description": "Array of decorations used to decorate nodes",
            "type": "array",
            "minItems": 0,
            "items": {
              "$ref": "./pipeline-flow-ui-v3-schema.json#/definitions/node_decoration_def"
            },
            "uniqueItems": true
          },
          "app_data": {
            "description": "Object containing app-specific data",
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": false,
        "required": [
          "id"
        ]
      },
      "canvas_execution_node": {
        "allOf": [
          {
            "description": "Definition of a single canvas execution node",
            "type": "object",
            "properties": {
              "type": {
                "description": "Node type - always 'execution_node'",
                "enum": [
                  "execution_node"
                ]
              },
              "op": {
                "description": "Operator type identifier",
                "type": "string"
              },
              "ui_parameters": {
                "description": "UI only parameter values for the node",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "inputs": {
                "$ref": "#/definitions/canvas_ports"
              },
              "outputs": {
                "$ref": "#/definitions/canvas_ports"
              },
              "parameters": {
                "description": "Input parameters for the operator",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "runtime_ref": {
                "description": "Optional reference to the id of the runtime associated with the current node",
                "type": "string"
              }
            },
            "required": [
              "type",
              "op"
            ],
            "additionalProperties": false
          },
          { "$ref": "#/definitions/canvas_node_shared_properties" }
        ]
      },
      "canvas_supernode": {
        "allOf": [
          {
            "description": "Definition of a supernode which serves as the entry point for a sub-pipeline",
            "type": "object",
            "properties": {
              "type": {
                "description": "Node type - always 'super_node' for supernode elements",
                "enum": [
                  "super_node"
                ]
              },
              "open_with_tool": {
                "description": "Name of the tool which can be used to view or edit the sub-flow for this supernode. The default is 'canvas'",
                "type": "string"
              },
              "subflow_ref": {
                "description": "Refers to the sub-flow associated with this supernode",
                "type": "object",
                "properties": {
                  "url": {
                    "description": "Reference to an external sub-flow. When not present the sub-flow is assumed to be in the current document. A value of 'app_defined' indicates a sub-flow identifier is present, but the controlling application will serve up the sub-pipeline in the form of a new pipeline-flow document (no sub-flow is present in the document).",
                    "type": "string"
                  },
                  "pipeline_id_ref": {
                    "description": "Sub-flow identifier reference",
                    "type": "string"
                  }
                },
                "required": [
                  "pipeline_id_ref"
                ]
              },
              "is_expanded": {
                "description": "Indicates whether a supernode is shown in expanded state or as a regular node.",
                "type": "boolean"
              },
              "expanded_height": {
                "description": "Height of expanded supernode. If not provided an appropriate height is calculated.",
                "type": "number"
              },
              "expanded_width": {
                "description": "Width of expanded supernode. If not provided an appropriate width is calculated.",
                "type": "number"
              },
              "sub_pipelines": {
                "description": "An array of pipelines referenced when this node is a supernode. This field is only used when the supernode is in a palette or on the clipboard. It will be an empty array when the supernode references an external pipeline.",
                "type": "array",
                "minItems": 0,
                "uniqueItems": true
              },
              "ui_parameters": {
                "description": "UI only parameter values for the node",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "inputs": {
                "$ref": "#/definitions/canvas_bound_ports"
              },
              "outputs": {
                "$ref": "#/definitions/canvas_bound_ports"
              },
              "parameters": {
                "description": "Input parameters for the supernode",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              }
            },
            "required": [
              "type",
              "subflow_ref"
            ],
            "additionalProperties": false
          },
          { "$ref": "#/definitions/canvas_node_shared_properties" }
        ]
      },
      "canvas_binding_entry_node": {
        "allOf": [
          {
            "description": "Defines an entry point (source) for a pipeline. Bindings can be concrete: the concrete_binding element is present on the port; or bindings can be abstract: bindings are performed externally via configuration or a wrapper document.",
            "type": "object",
            "properties": {
              "type": {
                "description": "Node type - always 'binding' for binding elements",
                "enum": [
                  "binding"
                ]
              },
              "outputs": {
                "$ref": "#/definitions/canvas_ports"
              },
              "connection": {
                "$ref": "./pipeline-connection-v3-schema.json#/definitions/common_pipeline_connection_def"
              },
              "data_asset": {
                "$ref": "./pipeline-connection-v3-schema.json#/definitions/common_pipeline_data_asset_def"
              },
              "op": {
                "description": "Binding node type identifier",
                "type": "string"
              },
              "ui_parameters": {
                "description": "UI only parameter values for the node",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "parameters": {
                "description": "Parameters for the binding entry node",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              }
            },
            "required": [
              "type",
              "outputs"
            ],
            "additionalProperties": false
          },
          { "$ref": "#/definitions/canvas_node_shared_properties" }
        ]
      },
      "canvas_binding_exit_node": {
        "allOf": [
          {
            "description": "Defines an exit point (sink) for a pipeline. Bindings can be concrete: the concrete_binding element is present on the port; or bindings can be abstract: bindings are performed externally via configuration or a wrapper document.",
            "type": "object",
            "properties": {
              "type": {
                "description": "Node type - always 'binding' for binding elements",
                "enum": [
                  "binding"
                ]
              },
              "inputs": {
                "$ref": "#/definitions/canvas_ports"
              },
              "outputs": {
                "$ref": "#/definitions/canvas_ports"
              },
              "app_data": {
                "description": "Object containing app-specific data",
                "type": "object",
                "additionalProperties": true
              },
              "connection": {
                "$ref": "./pipeline-connection-v3-schema.json#/definitions/common_pipeline_connection_def"
              },
              "data_asset": {
                "$ref": "./pipeline-connection-v3-schema.json#/definitions/common_pipeline_data_asset_def"
              },
              "op": {
                "description": "Binding node type identifier",
                "type": "string"
              },
              "parameters": {
                "description": "Parameters for the binding exit node",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              }
            },
            "required": [
              "type",
              "inputs"
            ],
            "additionalProperties": false
          },
          { "$ref": "#/definitions/canvas_node_shared_properties" }
        ]
      },
      "canvas_model_node": {
        "allOf": [
          {
            "description": "Definition of a single predictive model node",
            "type": "object",
            "properties": {
              "type": {
                "description": "Node type - always 'model_node' for model pipeline elements",
                "enum": [
                  "model_node"
                ]
              },
              "model_ref": {
                "description": "Reference to the binary model",
                "type": "string"
              },
              "inputs": {
                "$ref": "#/definitions/canvas_ports"
              },
              "outputs": {
                "$ref": "#/definitions/canvas_ports"
              },
              "op": {
                "description": "Node type identifier of modeling node that created this model.",
                "type": "string"
              },
              "parameters": {
                "description": "Input parameters for the operator",
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "runtime_ref": {
                "description": "Reference to the runtime associated with the current node",
                "type": "string"
              }
            },
            "required": [
              "type",
              "inputs"
            ],
            "additionalProperties": false
          },
          { "$ref": "#/definitions/canvas_node_shared_properties" }
        ]
      },
      "canvas_ports": {
        "type": "array",
        "minItems": 0,
        "items": {
          "$ref": "#/definitions/canvas_port"
        },
        "uniqueItems": true
      },
      "canvas_port": {
        "description": "Port definition (input/output) on a node",
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique identifier for the port",
            "type": "string"
          },
          "schema_ref": {
            "description": "Optional data record schema reference associated with the port",
            "type": "string"
          },
          "parameters": {
            "description": "Parameters for the port",
            "type": "object",
            "properties": {},
            "additionalProperties": true
          },
          "cardinality": {
            "description": "Property to capture how many data assets are allowed for this port, e.g., min: 1, max:1 implies you must supply 1 and only 1; min:0, max:1 implies it is optional and a max of one, min:0, max:-1 means it is optional and you can may have any number of data assets. The default value is 1:1 for inputs and 1:-1 for outputs.",
            "type": "object",
            "properties": {
              "min": {
                "description": "Minimum data sets that are required for this port",
                "type": "integer",
                "default": 1
              },
              "max": {
                "description": "Maximum data sets that are allowed on this port. A negative value indicates unlimited. The default value is 1 for inputs and -1 for outputs.",
                "type": "integer"
              }
            },
            "additionalProperties": false
          },
          "class_name": {
            "description": "CSS class name",
            "type": "string"
          },
          "style": {
            "description": "A 'style spec' object containing CSS strings to be applied to the SVG objects of the port.",
            "type": ["string", "object"]
          },
          "label": {
            "description": "Port name",
            "type": "string"
          },
          "app_data": {
            "description": "Object containing app-specific data",
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "canvas_bound_ports": {
        "type": "array",
        "minItems": 0,
        "items": {
          "$ref": "#/definitions/canvas_bound_port"
        },
        "uniqueItems": true
      },
      "canvas_bound_port": {
        "description": "Port definition (input/output) on a node with optional pipeline port binding for supernodes",
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique identifier for this port",
            "type": "string"
          },
          "schema_ref": {
            "description": "Optional data record schema associated with the port",
            "type": "string"
          },
          "subflow_node_ref": {
            "description": "Optional node id binding within the current document.",
            "type": "string"
          },
          "parameters": {
            "description": "Parameters for the binding port",
            "type": "object",
            "properties": {},
            "additionalProperties": true
          },
          "cardinality": {
            "description": "Property to capture how many data assets are allowed for this port, e.g., min: 1, max:1 implies you must supply 1 and only 1; min:0, max:1 implies it is optional and a max of one, min:0, max:-1 means it is optional and you can may have any number of data assets. The default value is 1:1 for inputs and 1:-1 for outputs.",
            "type": "object",
            "properties": {
              "min": {
                "description": "Minimum data sets that are required for this port",
                "type": "integer",
                "default": 1
              },
              "max": {
                "description": "Maximum data sets that are allowed on this port. A negative value indicates unlimited. The default value is 1 for inputs and -1 for outputs.",
                "type": "integer"
              }
            },
            "additionalProperties": false
          },
          "class_name": {
            "description": "CSS class name",
            "type": "string"
          },
          "style": {
            "description": "A 'style spec' object containing CSS strings to be applied to the SVG objects of the port.",
            "type": ["string", "object"]
          },
          "label": {
            "description": "Port name",
            "type": "string"
          },
          "app_data": {
            "description": "Object containing app-specific data",
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "canvas_comment": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Comment identifier. Must be unique.",
            "type": "string"
          },
          "x_pos": {
            "description": "Horizontal comment position",
            "type": "number"
          },
          "y_pos": {
            "description": "Vertical comment position",
            "type": "number"
          },
          "width": {
            "description": "Comment width",
            "type": "number",
            "minimum": 10
          },
          "height": {
            "description": "Comment height",
            "type": "number",
            "minimum": 10
          },
          "content": {
            "description": "Comment content",
            "type": "string"
          },
          "class_name": {
            "description": "CSS class(es) to apply to the comment",
            "type": "string"
          },
          "contentType": {
            "description": "The type of content either regular or markdown or WYSIWYG",
            "type": "string"
          },
          "formats": {
            "description": "An array of format objects that describe the comment appearance.",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "field": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                }
              },
              "additionalProperties": false,
              "required": [
                "field"
              ]
            }
          },
          "style": {
            "description": "A 'style spec' object containing CSS strings to be applied to the SVG objects of the comment.",
            "type": ["string", "object"],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "x_pos",
          "y_pos",
          "width",
          "height"
        ],
        "additionalProperties": true
      },
      "canvas_link": {
        "oneOf": [
          {
            "$ref": "#/definitions/canvas_comment_link"
          },
          {
            "$ref": "#/definitions/canvas_node_link"
          },
          {
            "$ref": "#/definitions/canvas_association_link"
          }
        ]
      },
      "canvas_comment_link": {
        "description": "Comment link definition",
        "type": "object",
        "properties": {
            "id": {
            "description": "Unique id of this comment link.",
            "type": "string"
          },
          "type": {
            "description": "Link type - always 'commentLink' for links from comments to nodes",
            "enum": [
              "commentLink"
            ]
          },
          "srcNodeId": {
            "description": "ID of the comment this link connects from.",
            "type": "string"
          },
          "trgNodeId": {
            "description": "ID of the node this link connects to.",
            "type": "string"
          },
          "class_name": {
            "description": "CSS class name for link styling",
            "type": "string"
          },
          "style": {
            "description": "A 'style spec' object containing CSS strings to be applied to the SVG objects of the comment link.",
            "type": ["string", "object"]
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": true
      },
      "canvas_node_link": {
        "description": "Node link definition",
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique id of this link within the pipelineFlow.",
            "type": "string"
          },
          "type": {
            "description": "Link type - always 'nodeLink' for directional links from nodes to nodes",
            "enum": [
              "nodeLink"
            ]
          },
          "srcNodeId": {
            "description": "ID of the source node this link connects from.",
            "type": "string"
          },
          "srcNodePortId": {
            "description": "Optional ID of the port on the source node this link connects from. Defaults to the first port if omitted.",
            "type": "string"
          },
          "trgNodeId": {
            "description": "ID of the target node this link connects to.",
            "type": "string"
          },
          "trgNodePortId": {
            "description": "Optional ID of the port on the target node this link connects from. Defaults to the first port if omitted.",
            "type": "string"
          },
          "srcPos": {
            "description": "The coordinate position on the canvas of the source of the link, when this source end of the link is detached",
            "type": "object",
            "properties": {
                "x_pos": {
                    "type": "number"
                },
                "y_pos": {
                    "type": "number"
                }
            },
            "required": [
                "x_pos",
                "y_pos"
            ],
            "additionalProperties": false
          },
          "trgPos": {
            "description": "The coordinate position on the canvas of the target of the link, when this target end of the  this link is detached",
            "type": "object",
            "properties": {
                "x_pos": {
                    "type": "number"
                },
                "y_pos": {
                    "type": "number"
                }
            },
            "required": [
                "x_pos",
                "y_pos"
            ],
            "additionalProperties": false
          },
          "srcObj": {
            "description": "@readonly The source object for the link. This property is added by Common Canvas during processing of links.",
            "$ref": "#/definitions/canvas_node",
            "readOnly": true
          },
          "trgNode": {
            "description": "@readonly The target object for the link. This property is added by Common Canvas during processing of links.",
            "$ref": "#/definitions/canvas_node",
            "readOnly": true
          },
          "linkName": {
            "description": "optional link name (used in parameter sets when there are multiple input sources)",
            "type": "string"
          },
          "typeAttr": {
            "description": "Optional type attribute for the link. This can store optional atribute info.",
            "type": "string"
          },
          "description": {
            "description": "User-defined description",
            "type": "string"
          },
          "class_name": {
            "description": "CSS class name",
            "type": "string"
          },
          "style": {
            "description": "A 'style spec' object containing CSS strings to be applied to the SVG objects of the node to node link.",
            "type": ["string", "object"]
          },
          "decorations": {
            "description": "Array of decorations used to decorate node links",
            "type": "array",
            "minItems": 0,
            "items": {
              "$ref": "./pipeline-flow-ui-v3-schema.json#/definitions/link_decoration_def"
            },
            "uniqueItems": true
          },
          "app_data": {
            "description": "Object containing app-specific data",
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "canvas_association_link": {
        "description": "Association link definition",
        "type": "object",
        "properties": {
          "id": {
            "description": "Unique id of this link within the pipelineFlow.",
            "type": "string"
          },
          "type": {
            "description": "Link type - always 'associationLink' for associations between two nodes",
            "enum": [
              "associationLink"
            ]
          },
          "srcNodeId": {
            "description": "ID of the source node of the association.",
            "type": "string"
          },
          "trgNodeId": {
            "description": "ID of the target node of the association.",
            "type": "string"
          },
          "class_name": {
            "description": "CSS class name",
            "type": "string"
          },
          "decorations": {
            "description": "Array of decorations used to decorate node links",
            "type": "array",
            "minItems": 0,
            "items": {
              "$ref": "./pipeline-flow-ui-v3-schema.json#/definitions/link_decoration_def"
            },
            "uniqueItems": true
          },
          "app_data": {
            "description": "Object containing app-specific data",
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      }
    }
  }
