Skip to content

Edge Structure

Every item in a workflow’s edges array is a WorkflowEdge. It represents a connection between an output port on one node and an input port on another.

interface WorkflowEdge {
id: string;
source: string;
target: string;
sourceHandle?: string;
targetHandle?: string;
type?: ConnectionLineType;
selectable?: boolean;
deletable?: boolean;
data?: {
label?: string;
condition?: string;
metadata?: {
edgeType?: EdgeCategory;
sourcePortDataType?: string;
};
};
}
FieldTypeRequiredDescription
idstringYesUnique edge identifier (e.g., "e-loader-analyzer").
sourcestringYesID of the source node.
targetstringYesID of the target node.
sourceHandlestringNoID of the specific output port. See Handle IDs.
targetHandlestringNoID of the specific input port. See Handle IDs.
selectablebooleanNoWhether the edge can be selected in the editor.
deletablebooleanNoWhether the edge can be deleted by the user.
data.labelstringNoDisplay label on the edge.
data.conditionstringNoCondition expression (used with gateway branches).
data.metadata.edgeTypeEdgeCategoryNoVisual styling category.
data.metadata.sourcePortDataTypestringNoData type of the source output port.

Port handles follow a deterministic naming pattern:

{nodeId}-{direction}-{portId}

For example:

  • content_loader.1-output-items — the “items” output port on node content_loader.1
  • analyzer.1-input-content — the “content” input port on node analyzer.1
  • router.1-output-high — the “high” branch output on a gateway node

This format lets FlowDrop map edges back to specific ports during rendering and execution.

The edgeType field controls the visual style of the edge on the canvas:

CategoryVisual StyleWhen Used
dataSolid gray lineDefault — general data flow between nodes.
triggerSolid line with trigger colorControl flow connections (port dataType: "trigger").
toolDashed amber lineTool interface connections (port dataType: "tool").
loopbackDashed gray lineLoop iteration connections (targets a loop_back port).

The editor sets edgeType automatically based on the source port’s data type. You generally don’t need to set it manually in JSON.

A simple data connection between two ports:

{
"id": "e-loader-analyzer",
"source": "content_loader.1",
"target": "analyzer.1",
"sourceHandle": "content_loader.1-output-items",
"targetHandle": "analyzer.1-input-content"
}

A control-flow connection that triggers execution:

{
"id": "e-start-loader",
"source": "start.1",
"target": "content_loader.1",
"sourceHandle": "start.1-output-trigger",
"targetHandle": "content_loader.1-input-trigger",
"data": {
"metadata": {
"edgeType": "trigger",
"sourcePortDataType": "trigger"
}
}
}

A dashed connection linking an agent to a tool:

{
"id": "e-agent-tool",
"source": "search_tool.1",
"target": "agent.1",
"sourceHandle": "search_tool.1-output-tool",
"targetHandle": "agent.1-input-tool",
"data": {
"metadata": {
"edgeType": "tool",
"sourcePortDataType": "tool"
}
}
}

A conditional edge from a gateway branch:

{
"id": "e-router-high",
"source": "router.1",
"target": "urgent_handler.1",
"sourceHandle": "router.1-output-high",
"targetHandle": "urgent_handler.1-input-input",
"data": {
"condition": "priority > 8",
"metadata": {
"edgeType": "data"
}
}
}

The editor validates connections automatically before creating edges:

  • Type compatibility — only compatible port data types can connect
  • Cycle detection — prevents circular dependencies (O(V+E) algorithm)
  • Loopback prevention — nodes cannot connect to themselves

For more on data type compatibility rules, see Port System & Data Types.