Edges

Edges define connections between nodes. They can be declared inline on a node or at the top level.

Inline edges

Edges defined directly on a node infer from as that node:

nodes:
  orchestrator:
    type: agent
    edges:
      - to: inventory-agent
        label: Check stock
      - to: recipe-agent
      - to: streaming-service
        type: streaming
        animated: true

Top-level edges

Edges in the top-level edges array specify both from and to explicitly:

edges:
  - from: inventory-agent
    to: orchestrator
    type: response

Both forms produce identical results and can be mixed freely.

Properties

PropertyTypeRequiredDefaultDescription
fromstringtop-level onlySource node id (inferred when inline)
tostringyesTarget node id
typestringnorequestEdge type (see below)
labelstringnoEdge label
animatedbooleannofalseShow animated flow on connection
arrowsstringnoendArrowheads: none, start, end, both
pathstringnobezierPath rendering style
source_handlestringnoConnection point on source node (see below)
target_handlestringnoConnection point on target node (see below)
metadataobjectnoPresentation hints for the edge (see below)

Arrows

arrows controls which ends of the edge show an arrowhead. It defaults to end (an arrow at the target), matching the most common request/response direction.

ValueMeaning
noneNo arrowheads
startArrow at the source end
endArrow at the target end (default)
bothArrows at both ends (bidirectional)
edges:
  - from: service-a
    to: service-b
    label: syncs with
    arrows: both

Edge metadata

metadata carries freeform presentation hints set by the editor. Known keys are typed; unknown keys are allowed so the editor can stash additional cosmetics without a schema change.

KeyTypeDescription
label_posnumberLabel position along the edge as a fraction of its length (0 = source end, 1 = target end). Default 0.5.
edges:
  - from: gw
    to: plan
    type: data
    label: issue
    metadata:
      label_pos: 0.72 # slide the label 72 % along the edge

Edge types

TypeMeaning
requestSynchronous request (default)
responseResponse to a request
asyncAsynchronous message
streamingStreaming data flow
eventEvent-driven trigger
errorError / exception path
defaultGeneric untyped connection

Path types

ValueDescription
bezierCurved line (default)
straightStraight line
stepRight-angle steps
smooth_stepSmooth right-angle steps
simple_bezierSimple bezier curve

Handle positions

source_handle and target_handle accept two forms:

Plain side name — connects at the centre of that side:

source_handle: bottom
target_handle: top

Slot form — places the anchor at a specific percentage along the side, in 10 % increments (10–90):

source_handle: bottom-20   # 20 % from the left edge of the bottom side
target_handle: top-80-t    # 80 % from the left edge of the top side

The -t suffix on target slot IDs distinguishes them from source slots when both are present on the same side. It is added automatically on export and must be preserved when hand-editing.

When handles are omitted the editor uses direction-aware defaults (bottom/top for TB, right/left for LR, etc.).