whipped 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/cli.js +1294 -259
  2. package/dist/mcp-server.js +150 -2
  3. package/dist/migrations/014_companion_sessions.sql +34 -0
  4. package/dist/migrations/015_companion_worktree_mode.sql +45 -0
  5. package/dist/migrations/016_companion_plans.sql +22 -0
  6. package/dist/migrations/017_companion_saved_plans.sql +23 -0
  7. package/dist/migrations/018_generalize_plan_session_ref.sql +29 -0
  8. package/dist/migrations/019_rename_plan_to_canvas.sql +20 -0
  9. package/dist/web-ui/assets/abnfDiagram-VRR7QNED-RwOyl_Kz.js +119 -0
  10. package/dist/web-ui/assets/arc-DmDBHE0H.js +131 -0
  11. package/dist/web-ui/assets/architectureDiagram-ZJ3FMSHR-RTwadm6J.js +8821 -0
  12. package/dist/web-ui/assets/blockDiagram-677ZJIJ3-Dvv5uMUE.js +3801 -0
  13. package/dist/web-ui/assets/c4Diagram-LMCZKHZV-bvr9R9cD.js +2479 -0
  14. package/dist/web-ui/assets/channel-BGhlETgZ.js +7 -0
  15. package/dist/web-ui/assets/chunk-2Q5K7J3B-BRq-Qbau.js +17 -0
  16. package/dist/web-ui/assets/chunk-32BRIVSS-Dy1BUZGx.js +116 -0
  17. package/dist/web-ui/assets/chunk-5VM5RSS4-DCUiIwIc.js +19 -0
  18. package/dist/web-ui/assets/chunk-EX3LRPZG-Cg_Vtzwz.js +1996 -0
  19. package/dist/web-ui/assets/chunk-JWPE2WC7-BW4n_ZhH.js +17 -0
  20. package/dist/web-ui/assets/chunk-MOJQB5TN-BykRa615.js +855 -0
  21. package/dist/web-ui/assets/chunk-RYQCIY6F-D4F7oV1d.js +476 -0
  22. package/dist/web-ui/assets/chunk-V7JOEXUC-DD4mm30h.js +2022 -0
  23. package/dist/web-ui/assets/chunk-VR4S4FIN-Fgvcluvk.js +25 -0
  24. package/dist/web-ui/assets/chunk-XXDRQBXY-C4FVmO5r.js +13 -0
  25. package/dist/web-ui/assets/classDiagram-OUVF2IWQ-DD4KIYF1.js +24 -0
  26. package/dist/web-ui/assets/classDiagram-v2-EOCWNBFH-DD4KIYF1.js +24 -0
  27. package/dist/web-ui/assets/cose-bilkent-JH36ORCC-ekFwvYt9.js +4943 -0
  28. package/dist/web-ui/assets/cynefin-VYW2F7L2-DTNV7gvQ.js +31527 -0
  29. package/dist/web-ui/assets/cynefinDiagram-TSTJHNR4-koYialeC.js +454 -0
  30. package/dist/web-ui/assets/cytoscape.esm-CaQ7Fomf.js +30346 -0
  31. package/dist/web-ui/assets/dagre-VKFMJZFB-Do43FV3o.js +526 -0
  32. package/dist/web-ui/assets/defaultLocale-B2RvLBDe.js +206 -0
  33. package/dist/web-ui/assets/diagram-FQU43EPY-D0STdny6.js +636 -0
  34. package/dist/web-ui/assets/diagram-G47NLZAW-D9g6BdZT.js +858 -0
  35. package/dist/web-ui/assets/diagram-NH7WQ7WH-zLW6CAmi.js +212 -0
  36. package/dist/web-ui/assets/diagram-OA4YK3LP-CA5tvsYw.js +492 -0
  37. package/dist/web-ui/assets/diagram-WEI45ONY-CLmYUHR0.js +309 -0
  38. package/dist/web-ui/assets/ebnfDiagram-CCIWWBDH-KkHubBI6.js +139 -0
  39. package/dist/web-ui/assets/erDiagram-Q63AITRT-BJna2u1n.js +1238 -0
  40. package/dist/web-ui/assets/flowDiagram-23GEKE2U-DVJKalah.js +2353 -0
  41. package/dist/web-ui/assets/ganttDiagram-NO4QXBWP-D9HwNV4u.js +3733 -0
  42. package/dist/web-ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  43. package/dist/web-ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  44. package/dist/web-ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  45. package/dist/web-ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  46. package/dist/web-ui/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
  47. package/dist/web-ui/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
  48. package/dist/web-ui/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
  49. package/dist/web-ui/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
  50. package/dist/web-ui/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
  51. package/dist/web-ui/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
  52. package/dist/web-ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  53. package/dist/web-ui/assets/gitGraphDiagram-IHSO6WYX-B7wnoO0J.js +1385 -0
  54. package/dist/web-ui/assets/graph-BMLV0goG.js +2042 -0
  55. package/dist/web-ui/assets/{index-CRXPsGTP.css → index-DPjATOCj.css} +800 -1207
  56. package/dist/web-ui/assets/{index-CuGz83Sg.js → index-DZ7I8r_C.js} +41629 -39831
  57. package/dist/web-ui/assets/infoDiagram-FWYZ7A6U-BY6XoiF8.js +32 -0
  58. package/dist/web-ui/assets/init-ZxktEp_H.js +16 -0
  59. package/dist/web-ui/assets/ishikawaDiagram-FXEZZL3T-BaZVnO8j.js +967 -0
  60. package/dist/web-ui/assets/journeyDiagram-5HDEW3XC-CUA6DUAQ.js +1256 -0
  61. package/dist/web-ui/assets/kanban-definition-HUTT4EX6-5W5tiWrd.js +1055 -0
  62. package/dist/web-ui/assets/katex-CqNtglxf.js +14499 -0
  63. package/dist/web-ui/assets/layout-BNmRhaUB.js +2359 -0
  64. package/dist/web-ui/assets/linear-CfvGIyDE.js +340 -0
  65. package/dist/web-ui/assets/map-BEO0Bu8q.js +298 -0
  66. package/dist/web-ui/assets/mermaid.core-BRk3IzY2.js +26639 -0
  67. package/dist/web-ui/assets/mindmap-definition-LN4V7U3C-2GmLg6ou.js +1183 -0
  68. package/dist/web-ui/assets/ordinal-DSZU4PqD.js +76 -0
  69. package/dist/web-ui/assets/pegDiagram-2B236MQR-gTEdrkJg.js +127 -0
  70. package/dist/web-ui/assets/pieDiagram-ENE6RG2P-CYXjIhqC.js +318 -0
  71. package/dist/web-ui/assets/quadrantDiagram-ABIIQ3AL-BStRZxwf.js +1341 -0
  72. package/dist/web-ui/assets/railroadDiagram-RFXS5EU6-btveDRG2.js +93 -0
  73. package/dist/web-ui/assets/requirementDiagram-TGXJPOKE-Cy_155rE.js +1205 -0
  74. package/dist/web-ui/assets/sankeyDiagram-HTMAVEWB-Chtvw3_G.js +1264 -0
  75. package/dist/web-ui/assets/sequenceDiagram-DBY2YBRQ-DDuMVEX1.js +4523 -0
  76. package/dist/web-ui/assets/sizeCapture-X5ZJPWSS-Bylf0o6J.js +64 -0
  77. package/dist/web-ui/assets/stateDiagram-2N3HPSRC-DIzLeR5G.js +453 -0
  78. package/dist/web-ui/assets/stateDiagram-v2-6OUMAXLB-zG_WjT1-.js +23 -0
  79. package/dist/web-ui/assets/swimlanes-5IMT3BWC-TKaCmVta.js +8575 -0
  80. package/dist/web-ui/assets/swimlanesDiagram-G3AALYLV-C5eB3qqS.js +21 -0
  81. package/dist/web-ui/assets/timeline-definition-FHXFAJF6-CC5Ujpcu.js +1606 -0
  82. package/dist/web-ui/assets/vennDiagram-L72KCM5P-DUSVXSYT.js +2523 -0
  83. package/dist/web-ui/assets/wardleyDiagram-EHGQE667-CoP9xn89.js +978 -0
  84. package/dist/web-ui/assets/xychartDiagram-FW5EYKEG-B9FqP_kk.js +1972 -0
  85. package/dist/web-ui/index.html +2 -2
  86. package/package.json +14 -16
@@ -0,0 +1,526 @@
1
+ import { c as clear$2, w as write, a as adjustClustersAndEdges, f as findNonClusterChild, b as clusterDb, s as sortNodesByHierarchy } from "./chunk-RYQCIY6F-D4F7oV1d.js";
2
+ import { _ as __name, am as markers_default, an as clear2, ao as clear, ap as clear$1, l as log, c as getConfig2, aq as updateNodeBounds, ar as setNodeElem, ae as insertNode, as as getSubGraphTitleMargins, af as positionNode, ad as insertCluster, at as insertEdge, au as positionEdgeLabel, av as insertEdgeLabel } from "./mermaid.core-BRk3IzY2.js";
3
+ import { G as Graph } from "./graph-BMLV0goG.js";
4
+ import { l as layout } from "./layout-BNmRhaUB.js";
5
+ import "./map-BEO0Bu8q.js";
6
+ import "./index-DZ7I8r_C.js";
7
+ var clamp = /* @__PURE__ */ __name((value, min, max) => Math.max(min, Math.min(max, value)), "clamp");
8
+ var getDefaultSelfLoopSide = /* @__PURE__ */ __name((rankdir = "TB") => {
9
+ switch (rankdir) {
10
+ case "BT":
11
+ return "bottom";
12
+ case "LR":
13
+ return "right";
14
+ case "RL":
15
+ return "left";
16
+ case "TB":
17
+ default:
18
+ return "top";
19
+ }
20
+ }, "getDefaultSelfLoopSide");
21
+ var shouldMergeSelfLoopSegments = /* @__PURE__ */ __name((diagramType) => diagramType === "flowchart" || diagramType === "flowchart-v2" || diagramType === "stateDiagram", "shouldMergeSelfLoopSegments");
22
+ var getSelfLoopSide = /* @__PURE__ */ __name((graph, node, segments, originalNodeId, rankdir) => {
23
+ const layoutHints = [];
24
+ const dummyNodeIds = /* @__PURE__ */ new Set();
25
+ segments.forEach(({ start, end }) => {
26
+ if (start !== originalNodeId) {
27
+ dummyNodeIds.add(start);
28
+ }
29
+ if (end !== originalNodeId) {
30
+ dummyNodeIds.add(end);
31
+ }
32
+ });
33
+ dummyNodeIds.forEach((id) => {
34
+ const dummyNode = graph.node(id);
35
+ if (typeof (dummyNode == null ? void 0 : dummyNode.x) === "number" && typeof (dummyNode == null ? void 0 : dummyNode.y) === "number") {
36
+ layoutHints.push(dummyNode);
37
+ }
38
+ });
39
+ if (layoutHints.length === 0) {
40
+ segments.forEach(({ edge }) => {
41
+ (edge.points ?? []).forEach((point) => {
42
+ if (typeof (point == null ? void 0 : point.x) === "number" && typeof (point == null ? void 0 : point.y) === "number") {
43
+ layoutHints.push(point);
44
+ }
45
+ });
46
+ });
47
+ }
48
+ if (layoutHints.length === 0) {
49
+ return getDefaultSelfLoopSide(rankdir);
50
+ }
51
+ const center = layoutHints.reduce(
52
+ (acc, point) => ({
53
+ x: acc.x + point.x / layoutHints.length,
54
+ y: acc.y + point.y / layoutHints.length
55
+ }),
56
+ { x: 0, y: 0 }
57
+ );
58
+ const dx = center.x - node.x;
59
+ const dy = center.y - node.y;
60
+ if (Math.abs(dx) > Math.abs(dy)) {
61
+ return dx > 0 ? "right" : "left";
62
+ }
63
+ if (Math.abs(dy) > 0) {
64
+ return dy > 0 ? "bottom" : "top";
65
+ }
66
+ return getDefaultSelfLoopSide(rankdir);
67
+ }, "getSelfLoopSide");
68
+ var getSelfLoopPoints = /* @__PURE__ */ __name((node, side = "top", yOffset = 0, labelWidth = 0) => {
69
+ const x = node.x;
70
+ const y = node.y - yOffset;
71
+ const halfWidth = node.width / 2;
72
+ const halfHeight = node.height / 2;
73
+ const maxSpan = Math.max(36, Math.min(100, node.width * 0.8));
74
+ const span = clamp(Math.max(labelWidth, node.width * 0.35), 36, maxSpan);
75
+ const depth = clamp(Math.min(node.width, node.height) * 0.45, 24, 48);
76
+ switch (side) {
77
+ case "bottom": {
78
+ const bottom = y + halfHeight;
79
+ return [
80
+ { x: x - span / 2, y: bottom },
81
+ { x: x - span / 2, y: bottom + depth },
82
+ { x: x + span / 2, y: bottom + depth },
83
+ { x: x + span / 2, y: bottom }
84
+ ];
85
+ }
86
+ case "right": {
87
+ const right = x + halfWidth;
88
+ return [
89
+ { x: right, y: y - span / 2 },
90
+ { x: right + depth, y: y - span / 2 },
91
+ { x: right + depth, y: y + span / 2 },
92
+ { x: right, y: y + span / 2 }
93
+ ];
94
+ }
95
+ case "left": {
96
+ const left = x - halfWidth;
97
+ return [
98
+ { x: left, y: y - span / 2 },
99
+ { x: left - depth, y: y - span / 2 },
100
+ { x: left - depth, y: y + span / 2 },
101
+ { x: left, y: y + span / 2 }
102
+ ];
103
+ }
104
+ case "top":
105
+ default: {
106
+ const top = y - halfHeight;
107
+ return [
108
+ { x: x - span / 2, y: top },
109
+ { x: x - span / 2, y: top - depth },
110
+ { x: x + span / 2, y: top - depth },
111
+ { x: x + span / 2, y: top }
112
+ ];
113
+ }
114
+ }
115
+ }, "getSelfLoopPoints");
116
+ var getSelfLoopLabelPosition = /* @__PURE__ */ __name((node, points, side = "top", yOffset = 0, label = {}) => {
117
+ const gap = 4;
118
+ const x = node.x;
119
+ const y = node.y - yOffset;
120
+ const labelWidth = label.width ?? 0;
121
+ const labelHeight = label.height ?? 0;
122
+ switch (side) {
123
+ case "bottom":
124
+ return { x, y: Math.max(...points.map((point) => point.y)) + labelHeight / 2 + gap };
125
+ case "right":
126
+ return { x: Math.max(...points.map((point) => point.x)) + labelWidth / 2 + gap, y };
127
+ case "left":
128
+ return { x: Math.min(...points.map((point) => point.x)) - labelWidth / 2 - gap, y };
129
+ case "top":
130
+ default:
131
+ return { x, y: Math.min(...points.map((point) => point.y)) - labelHeight / 2 - gap };
132
+ }
133
+ }, "getSelfLoopLabelPosition");
134
+ var getEdgesToRender = /* @__PURE__ */ __name((graph, yOffset = 0, { mergeSelfLoops = true } = {}) => {
135
+ var _a;
136
+ const selfLoopEdgeGroups = /* @__PURE__ */ new Map();
137
+ const edgesToRender = [];
138
+ const rankdir = (_a = graph.graph()) == null ? void 0 : _a.rankdir;
139
+ graph.edges().forEach((e) => {
140
+ const edge = graph.edge(e);
141
+ if (mergeSelfLoops && edge.selfLoop) {
142
+ const key = edge.selfLoop.id;
143
+ if (!selfLoopEdgeGroups.has(key)) {
144
+ selfLoopEdgeGroups.set(key, []);
145
+ }
146
+ selfLoopEdgeGroups.get(key).push({ edge, start: e.v, end: e.w });
147
+ } else {
148
+ edgesToRender.push({ edge, start: e.v, end: e.w });
149
+ }
150
+ });
151
+ selfLoopEdgeGroups.forEach((segments) => {
152
+ if (segments.length !== 3) {
153
+ segments.forEach((segment) => edgesToRender.push(segment));
154
+ return;
155
+ }
156
+ segments.sort((a, b) => a.edge.selfLoop.order - b.edge.selfLoop.order);
157
+ const [firstSegment, middleSegment, lastSegment] = segments;
158
+ const originalEdge = firstSegment.edge.originalEdge ?? middleSegment.edge.originalEdge ?? lastSegment.edge.originalEdge ?? middleSegment.edge;
159
+ const node = graph.node(originalEdge.start);
160
+ if (!node) {
161
+ segments.forEach((segment) => edgesToRender.push(segment));
162
+ return;
163
+ }
164
+ const label = {
165
+ width: middleSegment.edge.width,
166
+ height: middleSegment.edge.height
167
+ };
168
+ const side = getSelfLoopSide(graph, node, segments, originalEdge.start, rankdir);
169
+ const points = getSelfLoopPoints(node, side, yOffset, label.width ?? 0);
170
+ const labelPosition = getSelfLoopLabelPosition(node, points, side, yOffset, label);
171
+ const mergedEdge = {
172
+ ...middleSegment.edge,
173
+ ...originalEdge,
174
+ id: originalEdge.id,
175
+ points,
176
+ start: originalEdge.start,
177
+ end: originalEdge.end,
178
+ x: labelPosition.x,
179
+ y: labelPosition.y,
180
+ width: label.width,
181
+ height: label.height,
182
+ labelStyle: middleSegment.edge.labelStyle,
183
+ fromCluster: firstSegment.edge.fromCluster ?? middleSegment.edge.fromCluster ?? lastSegment.edge.fromCluster,
184
+ toCluster: firstSegment.edge.toCluster ?? middleSegment.edge.toCluster ?? lastSegment.edge.toCluster
185
+ };
186
+ delete mergedEdge.selfLoop;
187
+ delete mergedEdge.originalEdge;
188
+ edgesToRender.push({ edge: mergedEdge, start: mergedEdge.start, end: mergedEdge.end });
189
+ });
190
+ return edgesToRender;
191
+ }, "getEdgesToRender");
192
+ var recursiveRender = /* @__PURE__ */ __name(async (_elem, graph, diagramType, id, parentCluster, siteConfig) => {
193
+ log.warn("Graph in recursive render:XAX", write(graph), parentCluster);
194
+ const dir = graph.graph().rankdir;
195
+ log.trace("Dir in recursive render - dir:", dir);
196
+ const elem = _elem.insert("g").attr("class", "root");
197
+ if (!graph.nodes()) {
198
+ log.info("No nodes found for", graph);
199
+ } else {
200
+ log.info("Recursive render XXX", graph.nodes());
201
+ }
202
+ if (graph.edges().length > 0) {
203
+ log.info("Recursive edges", graph.edge(graph.edges()[0]));
204
+ }
205
+ const clusters = elem.insert("g").attr("class", "clusters");
206
+ const edgePaths = elem.insert("g").attr("class", "edgePaths");
207
+ const edgeLabels = elem.insert("g").attr("class", "edgeLabels");
208
+ const nodes = elem.insert("g").attr("class", "nodes");
209
+ const mergeSelfLoops = shouldMergeSelfLoopSegments(diagramType);
210
+ await Promise.all(
211
+ graph.nodes().map(async function(v) {
212
+ const node = graph.node(v);
213
+ if (parentCluster !== void 0) {
214
+ const data = JSON.parse(JSON.stringify(parentCluster.clusterData));
215
+ log.trace(
216
+ "Setting data for parent cluster XXX\n Node.id = ",
217
+ v,
218
+ "\n data=",
219
+ data.height,
220
+ "\nParent cluster",
221
+ parentCluster.height
222
+ );
223
+ graph.setNode(parentCluster.id, data);
224
+ if (!graph.parent(v)) {
225
+ log.trace("Setting parent", v, parentCluster.id);
226
+ graph.setParent(v, parentCluster.id, data);
227
+ }
228
+ }
229
+ log.info("(Insert) Node XXX" + v + ": " + JSON.stringify(graph.node(v)));
230
+ if (node == null ? void 0 : node.clusterNode) {
231
+ log.info("Cluster identified XBX", v, node.width, graph.node(v));
232
+ const { ranksep, nodesep } = graph.graph();
233
+ node.graph.setGraph({
234
+ ...node.graph.graph(),
235
+ ranksep: ranksep + 25,
236
+ nodesep
237
+ });
238
+ const o = await recursiveRender(
239
+ nodes,
240
+ node.graph,
241
+ diagramType,
242
+ id,
243
+ graph.node(v),
244
+ siteConfig
245
+ );
246
+ const newEl = o.elem;
247
+ updateNodeBounds(node, newEl);
248
+ node.diff = o.diff || 0;
249
+ log.info(
250
+ "New compound node after recursive render XAX",
251
+ v,
252
+ "width",
253
+ // node,
254
+ node.width,
255
+ "height",
256
+ node.height
257
+ // node.x,
258
+ // node.y
259
+ );
260
+ setNodeElem(newEl, node);
261
+ } else {
262
+ if (graph.children(v).length > 0) {
263
+ log.trace(
264
+ "Cluster - the non recursive path XBX",
265
+ v,
266
+ node.id,
267
+ node,
268
+ node.width,
269
+ "Graph:",
270
+ graph
271
+ );
272
+ log.trace(findNonClusterChild(node.id, graph));
273
+ clusterDb.set(node.id, { id: findNonClusterChild(node.id, graph), node });
274
+ } else {
275
+ log.trace("Node - the non recursive path XAX", v, nodes, graph.node(v), dir);
276
+ await insertNode(nodes, graph.node(v), { config: siteConfig, dir });
277
+ }
278
+ }
279
+ })
280
+ );
281
+ const processEdges = /* @__PURE__ */ __name(async () => {
282
+ const edgePromises = graph.edges().map(async function(e) {
283
+ const edge = graph.edge(e.v, e.w, e.name);
284
+ log.info("Edge " + e.v + " -> " + e.w + ": " + JSON.stringify(e));
285
+ log.info("Edge " + e.v + " -> " + e.w + ": ", e, " ", JSON.stringify(graph.edge(e)));
286
+ log.info(
287
+ "Fix",
288
+ clusterDb,
289
+ "ids:",
290
+ e.v,
291
+ e.w,
292
+ "Translating: ",
293
+ clusterDb.get(e.v),
294
+ clusterDb.get(e.w)
295
+ );
296
+ if (mergeSelfLoops && edge.selfLoop) {
297
+ if (edge.selfLoop.order !== 1) {
298
+ return;
299
+ }
300
+ const segmentId = edge.id;
301
+ edge.id = edge.selfLoop.id;
302
+ await insertEdgeLabel(edgeLabels, edge);
303
+ edge.id = segmentId;
304
+ return;
305
+ }
306
+ await insertEdgeLabel(edgeLabels, edge);
307
+ });
308
+ await Promise.all(edgePromises);
309
+ }, "processEdges");
310
+ await processEdges();
311
+ log.info("Graph before layout:", JSON.stringify(write(graph)));
312
+ log.info("############################################# XXX");
313
+ log.info("### Layout ### XXX");
314
+ log.info("############################################# XXX");
315
+ layout(graph);
316
+ log.info("Graph after layout:", JSON.stringify(write(graph)));
317
+ let diff = 0;
318
+ let { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);
319
+ await Promise.all(
320
+ sortNodesByHierarchy(graph).map(async function(v) {
321
+ var _a;
322
+ const node = graph.node(v);
323
+ log.info(
324
+ "Position XBX => " + v + ": (" + node.x,
325
+ "," + node.y,
326
+ ") width: ",
327
+ node.width,
328
+ " height: ",
329
+ node.height
330
+ );
331
+ if (node == null ? void 0 : node.clusterNode) {
332
+ node.y += subGraphTitleTotalMargin;
333
+ log.info(
334
+ "A tainted cluster node XBX1",
335
+ v,
336
+ node.id,
337
+ node.width,
338
+ node.height,
339
+ node.x,
340
+ node.y,
341
+ graph.parent(v)
342
+ );
343
+ clusterDb.get(node.id).node = node;
344
+ positionNode(node);
345
+ } else {
346
+ if (graph.children(v).length > 0) {
347
+ log.info(
348
+ "A pure cluster node XBX1",
349
+ v,
350
+ node.id,
351
+ node.x,
352
+ node.y,
353
+ node.width,
354
+ node.height,
355
+ graph.parent(v)
356
+ );
357
+ node.height += subGraphTitleTotalMargin;
358
+ graph.node(node.parentId);
359
+ const halfPadding = (node == null ? void 0 : node.padding) / 2 || 0;
360
+ const labelHeight = ((_a = node == null ? void 0 : node.labelBBox) == null ? void 0 : _a.height) || 0;
361
+ const offsetY = labelHeight - halfPadding || 0;
362
+ log.debug("OffsetY", offsetY, "labelHeight", labelHeight, "halfPadding", halfPadding);
363
+ await insertCluster(clusters, node);
364
+ clusterDb.get(node.id).node = node;
365
+ } else {
366
+ const parent = graph.node(node.parentId);
367
+ node.y += subGraphTitleTotalMargin / 2;
368
+ log.info(
369
+ "A regular node XBX1 - using the padding",
370
+ node.id,
371
+ "parent",
372
+ node.parentId,
373
+ node.width,
374
+ node.height,
375
+ node.x,
376
+ node.y,
377
+ "offsetY",
378
+ node.offsetY,
379
+ "parent",
380
+ parent,
381
+ parent == null ? void 0 : parent.offsetY,
382
+ node
383
+ );
384
+ positionNode(node);
385
+ }
386
+ }
387
+ })
388
+ );
389
+ const edgeOffsetY = subGraphTitleTotalMargin / 2;
390
+ const edgesToRender = getEdgesToRender(graph, edgeOffsetY, { mergeSelfLoops });
391
+ edgesToRender.forEach(function({ edge, start, end }) {
392
+ log.info("Edge " + start + " -> " + end + ": " + JSON.stringify(edge), edge);
393
+ edge.points.forEach((point) => point.y += edgeOffsetY);
394
+ const startNode = graph.node(start);
395
+ const endNode = graph.node(end);
396
+ const paths = insertEdge(edgePaths, edge, clusterDb, diagramType, startNode, endNode, id);
397
+ positionEdgeLabel(edge, paths);
398
+ });
399
+ graph.nodes().forEach(function(v) {
400
+ const n = graph.node(v);
401
+ log.info(v, n.type, n.diff);
402
+ if (n.isGroup) {
403
+ diff = n.diff;
404
+ }
405
+ });
406
+ log.warn("Returning from recursive render XAX", elem, diff);
407
+ return { elem, diff };
408
+ }, "recursiveRender");
409
+ var render = /* @__PURE__ */ __name(async (data4Layout, svg) => {
410
+ var _a, _b, _c, _d, _e, _f;
411
+ const graph = new Graph({
412
+ multigraph: true,
413
+ compound: true
414
+ }).setGraph({
415
+ rankdir: data4Layout.direction,
416
+ nodesep: ((_a = data4Layout.config) == null ? void 0 : _a.nodeSpacing) || ((_c = (_b = data4Layout.config) == null ? void 0 : _b.flowchart) == null ? void 0 : _c.nodeSpacing) || data4Layout.nodeSpacing,
417
+ ranksep: ((_d = data4Layout.config) == null ? void 0 : _d.rankSpacing) || ((_f = (_e = data4Layout.config) == null ? void 0 : _e.flowchart) == null ? void 0 : _f.rankSpacing) || data4Layout.rankSpacing,
418
+ marginx: 8,
419
+ marginy: 8
420
+ }).setDefaultEdgeLabel(function() {
421
+ return {};
422
+ });
423
+ const element = svg.select("g");
424
+ markers_default(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);
425
+ clear2();
426
+ clear();
427
+ clear$1();
428
+ clear$2();
429
+ data4Layout.nodes.forEach((node) => {
430
+ graph.setNode(node.id, { ...node });
431
+ if (node.parentId) {
432
+ graph.setParent(node.id, node.parentId);
433
+ }
434
+ });
435
+ log.debug("Edges:", data4Layout.edges);
436
+ data4Layout.edges.forEach((edge) => {
437
+ if (edge.start === edge.end) {
438
+ const nodeId = edge.start;
439
+ const specialId1 = nodeId + "---" + nodeId + "---1";
440
+ const specialId2 = nodeId + "---" + nodeId + "---2";
441
+ const node = graph.node(nodeId);
442
+ graph.setNode(specialId1, {
443
+ domId: specialId1,
444
+ id: specialId1,
445
+ parentId: node.parentId,
446
+ labelStyle: "",
447
+ label: "",
448
+ padding: 0,
449
+ shape: "labelRect",
450
+ // shape: 'rect',
451
+ style: "",
452
+ width: 10,
453
+ height: 10
454
+ });
455
+ graph.setParent(specialId1, node.parentId);
456
+ graph.setNode(specialId2, {
457
+ domId: specialId2,
458
+ id: specialId2,
459
+ parentId: node.parentId,
460
+ labelStyle: "",
461
+ padding: 0,
462
+ // shape: 'rect',
463
+ shape: "labelRect",
464
+ label: "",
465
+ style: "",
466
+ width: 10,
467
+ height: 10
468
+ });
469
+ graph.setParent(specialId2, node.parentId);
470
+ const originalEdge = structuredClone(edge);
471
+ const edge1 = structuredClone(edge);
472
+ const edgeMid = structuredClone(edge);
473
+ const edge2 = structuredClone(edge);
474
+ edge1.originalEdge = originalEdge;
475
+ edge1.selfLoop = { id: originalEdge.id, order: 0 };
476
+ edgeMid.originalEdge = originalEdge;
477
+ edgeMid.selfLoop = { id: originalEdge.id, order: 1 };
478
+ edge2.originalEdge = originalEdge;
479
+ edge2.selfLoop = { id: originalEdge.id, order: 2 };
480
+ edge1.label = "";
481
+ edge1.arrowTypeEnd = "none";
482
+ edge1.endLabelLeft = "";
483
+ edge1.endLabelRight = "";
484
+ edge1.startLabelLeft = "";
485
+ edge1.id = nodeId + "-cyclic-special-1";
486
+ edgeMid.startLabelRight = "";
487
+ edgeMid.startLabelLeft = "";
488
+ edgeMid.endLabelLeft = "";
489
+ edgeMid.endLabelRight = "";
490
+ edgeMid.arrowTypeStart = "none";
491
+ edgeMid.arrowTypeEnd = "none";
492
+ edgeMid.id = nodeId + "-cyclic-special-mid";
493
+ edge2.label = "";
494
+ edge2.startLabelRight = "";
495
+ edge2.startLabelLeft = "";
496
+ edge2.arrowTypeStart = "none";
497
+ if (node.isGroup) {
498
+ edge1.fromCluster = nodeId;
499
+ edge2.toCluster = nodeId;
500
+ }
501
+ edge2.id = nodeId + "-cyclic-special-2";
502
+ edge2.arrowTypeStart = "none";
503
+ graph.setEdge(nodeId, specialId1, edge1, nodeId + "-cyclic-special-0");
504
+ graph.setEdge(specialId1, specialId2, edgeMid, nodeId + "-cyclic-special-1");
505
+ graph.setEdge(specialId2, nodeId, edge2, nodeId + "-cyclic-special-2");
506
+ } else {
507
+ graph.setEdge(edge.start, edge.end, { ...edge }, edge.id);
508
+ }
509
+ });
510
+ log.warn("Graph at first:", JSON.stringify(write(graph)));
511
+ adjustClustersAndEdges(graph);
512
+ log.warn("Graph after XAX:", JSON.stringify(write(graph)));
513
+ const siteConfig = getConfig2();
514
+ await recursiveRender(
515
+ element,
516
+ graph,
517
+ data4Layout.type,
518
+ data4Layout.diagramId,
519
+ void 0,
520
+ siteConfig
521
+ );
522
+ }, "render");
523
+ export {
524
+ getEdgesToRender,
525
+ render
526
+ };