AI-connectorHoe het werkt (technisch)

Ops Grid: richting van verbindingen

Welk veld de bron van waarheid is voor de richting van een pijl in Ops Grid, hoe die wordt opgeslagen en wat je leest als je op de volgorde van stappen bouwt.

Technische achtergrond. Voor gewoon gebruik heb je dit niet nodig.

Dit is de ene geschreven afspraak over de richting van een verbinding (een pijl tussen twee stappen) in een Ops Grid-grid. Ze geldt voor verbindingen die je met de hand in de app tekent en voor verbindingen die via deze connector worden geschreven: beide slaan precies dezelfde rij op.

Het korte antwoord

Heb je de volgorde van stappen nodig (funnelcijfers per stap, een timer voor de volgende stap, alles wat de keten afloopt)? Lees die dan als from → to via de connector of via getConnectionFlow() in de app. Lees nooit rechtstreeks edges[].source / edges[].target uit het opgeslagen grid: die staan andersom opgeslagen.

Waar de richting staat

Er zijn geen kolommen voor verbindingen in de database. Een grid is één JSON-document, operations.grids.data, met twee lijsten:

StructuurRol
nodes[].connections[]Leidend. Elke verbinding staat op één knooppunt.
edges[]Een kopie voor de canvasbibliotheek (React Flow). De app bouwt hem bij elke opslag opnieuw op uit connections[], en de connector schrijft beide in dezelfde vorm. Zijn ze het ooit oneens, dan wint connections[]: de volgende opslag in de app overschrijft edges[].

De omkering

Een verbinding staat op het knooppunt waar de pijl naartoe wijst. Haar targetNodeId is het knooppunt waar de pijl begint. De stap Lead in → Intake staat dus op Intake als { "targetNodeId": "Lead in" }.

De afgeleide rij in edges[] volgt dezelfde oriëntatie: source is de pijlpunt en target is waar de lijn begint, andersom dan React Flow ze normaal noemt. Het canvas draait de eindpunten om bij het tekenen, zodat de pijlpunt op source landt. Dat is zo bedoeld. Het is ouder dan de connector en elk met de hand getekend grid gebruikt het al. Omdraaien zou elk bestaand grid opnieuw omkeren, dus het blijft zo.

Je bedoeltOpgeslagen optargetNodeIdedges[].sourceedges[].target
Lead in → IntakeIntakeLead inIntakeLead in
Offerte → Intake (terugkoppeling)IntakeOfferteIntakeOfferte

Aansluitpunten

fromSide is het aansluitpunt op het knooppunt dat de verbinding bevat (de kant van de pijlpunt), toSide dat op het beginknooppunt. In edges[] worden ze sourceHandle: "<fromSide>-out" en targetHandle: "<toSide>-in".

  • Een stap vooruit, van links naar rechts getekend: fromSide: "left", toSide: "right".
  • Een terugkoppeling (een herstellus naar een eerdere stap): fromSide: "bottom", toSide: "bottom".

Aansluitpunten bepalen alleen waar de lijn vastzit. De richting volgt volledig uit het knooppunt dat de verbinding bevat en haar targetNodeId. Leid de richting dus nooit af uit de aansluitpunten.

Waar de omzetting gebeurt

De omkering is een opslagdetail. Alles wat je aanroept spreekt de natuurlijke richting en zet om aan de grens:

  • Schrijven via de connector (ops_grid_create_value_chain, ops_grid_add_to_grid, ops_grid_connect_nodes) neemt { "from": …, "to": … } aan en slaat het op in de oriëntatie hierboven.
  • Lezen via de connector (ops_grid_get_grid) geeft elke verbinding terug in de natuurlijke richting: source = waar de pijl begint, target = waar hij naartoe wijst. Die leest edges[], dat elke schrijver gelijk houdt aan connections[].
  • Code in de app leest de richting via één hulpfunctie, getConnectionFlow(nodeId, connection) → { fromId, toId } (operations-grid src/components/canvas/utils/connectionUtils.ts).

Id's van verbindingen zijn ondoorzichtige sleutels. Een met de hand getekende verbinding krijgt een willekeurig id (conn-<tijd>-<willekeurig>). De connector bouwt een vast id, zodat een herhaalde aanroep idempotent blijft. Lees nooit de richting uit een id.

Gecontroleerd: met de hand getekend = connector

We hebben Lead in → Intake → Offerte plus de terugkoppeling Offerte → Intake met de hand in de app getekend. Daarna hebben we het opgeslagen document uit de database gelezen en veld voor veld vergeleken met dezelfde keten, aangemaakt via ops_grid_create_value_chain. Knooppunt, targetNodeId, beide aansluitpunten en source, target en aansluitpunten in edges[] zijn voor alle drie de verbindingen gelijk. Alleen de ondoorzichtige id's verschillen. De met de hand getekende rijen staan als testfixture in de connector, dus een wijziging die dit breekt, laat de tests falen.

Met de hand getekend Lead in → Intake, zoals de app het opsloeg:

{ "on": "s2",
  "connection": { "id": "conn-1791191742379-e7d392j", "targetNodeId": "s1", "fromSide": "left", "toSide": "right" },
  "edge": { "source": "s2", "target": "s1", "sourceHandle": "left-out", "targetHandle": "right-in" } }

Dezelfde stap, aangemaakt via de connector:

{ "on": "s2",
  "connection": { "id": "s2-s1-left-right-0", "targetNodeId": "s1", "fromSide": "left", "toSide": "right" },
  "edge": { "source": "s2", "target": "s1", "sourceHandle": "left-out", "targetHandle": "right-in" } }

Grids van oudere connectorversies

  • Connector 0.1.14 – 0.1.15: de richting staat goed opgeslagen. Alleen de posities van de knooppunten en de aansluitpunten verschillen (right/left, geen lussen onderlangs). Een nieuwe indeling is cosmetisch.
  • Connector 0.1.13 en ouder (vóór de richtingfix van 9 september 2026): deze versies sloegen source = from op. Hun pijlen wijzen op het canvas achteruit en ops_grid_get_grid geeft ze achterstevoren terug. Verbindingen die je met de hand opnieuw hebt getekend, zijn niet geraakt. Bouw niet op de volgorde in die grids totdat ze hersteld zijn.

On this page