callman-core 1.26.0 → 1.28.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.
- package/ai-packs/db-queries.md +10 -1
- package/ai-packs/diagram-components.md +373 -0
- package/dist/curl/bodyFormat.d.ts +4 -0
- package/dist/curl/bodyFormat.d.ts.map +1 -0
- package/dist/curl/bodyFormat.js +80 -0
- package/dist/curl/bodyFormat.js.map +1 -0
- package/dist/curl/index.d.ts +5 -0
- package/dist/curl/index.d.ts.map +1 -0
- package/dist/curl/index.js +4 -0
- package/dist/curl/index.js.map +1 -0
- package/dist/curl/parseCurl.d.ts +4 -0
- package/dist/curl/parseCurl.d.ts.map +1 -0
- package/dist/curl/parseCurl.js +288 -0
- package/dist/curl/parseCurl.js.map +1 -0
- package/dist/curl/rows.d.ts +6 -0
- package/dist/curl/rows.d.ts.map +1 -0
- package/dist/curl/rows.js +23 -0
- package/dist/curl/rows.js.map +1 -0
- package/dist/curl/types.d.ts +21 -0
- package/dist/curl/types.d.ts.map +1 -0
- package/dist/curl/types.js +6 -0
- package/dist/curl/types.js.map +1 -0
- package/dist/diagram/componentCatalog.d.ts +31 -0
- package/dist/diagram/componentCatalog.d.ts.map +1 -0
- package/dist/diagram/componentCatalog.data.d.ts +3 -0
- package/dist/diagram/componentCatalog.data.d.ts.map +1 -0
- package/dist/diagram/componentCatalog.data.js +287 -0
- package/dist/diagram/componentCatalog.data.js.map +1 -0
- package/dist/diagram/componentCatalog.js +71 -0
- package/dist/diagram/componentCatalog.js.map +1 -0
- package/dist/diagram/edgeSemantics.d.ts +28 -0
- package/dist/diagram/edgeSemantics.d.ts.map +1 -0
- package/dist/diagram/edgeSemantics.js +78 -0
- package/dist/diagram/edgeSemantics.js.map +1 -0
- package/dist/diagram/elkGraph.d.ts +80 -0
- package/dist/diagram/elkGraph.d.ts.map +1 -0
- package/dist/diagram/elkGraph.js +283 -0
- package/dist/diagram/elkGraph.js.map +1 -0
- package/dist/diagram/index.d.ts +7 -0
- package/dist/diagram/index.d.ts.map +1 -0
- package/dist/diagram/index.js +13 -0
- package/dist/diagram/index.js.map +1 -0
- package/dist/diagram/migrations.d.ts +3 -0
- package/dist/diagram/migrations.d.ts.map +1 -0
- package/dist/diagram/migrations.js +33 -0
- package/dist/diagram/migrations.js.map +1 -0
- package/dist/diagram/normalize.d.ts +4 -0
- package/dist/diagram/normalize.d.ts.map +1 -0
- package/dist/diagram/normalize.js +68 -0
- package/dist/diagram/normalize.js.map +1 -0
- package/dist/diagram/schema.d.ts +116 -0
- package/dist/diagram/schema.d.ts.map +1 -0
- package/dist/diagram/schema.js +135 -0
- package/dist/diagram/schema.js.map +1 -0
- package/dist/http-file/detect.d.ts +12 -0
- package/dist/http-file/detect.d.ts.map +1 -0
- package/dist/http-file/detect.js +108 -0
- package/dist/http-file/detect.js.map +1 -0
- package/dist/http-file/flatImport.d.ts +32 -0
- package/dist/http-file/flatImport.d.ts.map +1 -0
- package/dist/http-file/flatImport.js +102 -0
- package/dist/http-file/flatImport.js.map +1 -0
- package/dist/http-file/index.d.ts +4 -0
- package/dist/http-file/index.d.ts.map +1 -0
- package/dist/http-file/index.js +7 -0
- package/dist/http-file/index.js.map +1 -0
- package/dist/http-file/parseHttpFile.d.ts +12 -0
- package/dist/http-file/parseHttpFile.d.ts.map +1 -0
- package/dist/http-file/parseHttpFile.js +122 -0
- package/dist/http-file/parseHttpFile.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -1
- package/dist/scenario-runner/adapters/request-executor.js +41 -0
- package/dist/scenario-runner/adapters/request-executor.js.map +1 -1
- package/dist/scenario-runner/runScenario.d.ts.map +1 -1
- package/dist/scenario-runner/runScenario.js +112 -0
- package/dist/scenario-runner/runScenario.js.map +1 -1
- package/dist/scenario-runner/types.d.ts +17 -0
- package/dist/scenario-runner/types.d.ts.map +1 -1
- package/dist-cjs/curl/bodyFormat.js +85 -0
- package/dist-cjs/curl/bodyFormat.js.map +1 -0
- package/dist-cjs/curl/index.js +15 -0
- package/dist-cjs/curl/index.js.map +1 -0
- package/dist-cjs/curl/parseCurl.js +293 -0
- package/dist-cjs/curl/parseCurl.js.map +1 -0
- package/dist-cjs/curl/rows.js +30 -0
- package/dist-cjs/curl/rows.js.map +1 -0
- package/dist-cjs/curl/types.js +7 -0
- package/dist-cjs/curl/types.js.map +1 -0
- package/dist-cjs/diagram/componentCatalog.data.js +290 -0
- package/dist-cjs/diagram/componentCatalog.data.js.map +1 -0
- package/dist-cjs/diagram/componentCatalog.js +79 -0
- package/dist-cjs/diagram/componentCatalog.js.map +1 -0
- package/dist-cjs/diagram/edgeSemantics.js +86 -0
- package/dist-cjs/diagram/edgeSemantics.js.map +1 -0
- package/dist-cjs/diagram/elkGraph.js +293 -0
- package/dist-cjs/diagram/elkGraph.js.map +1 -0
- package/dist-cjs/diagram/index.js +33 -0
- package/dist-cjs/diagram/index.js.map +1 -0
- package/dist-cjs/diagram/migrations.js +37 -0
- package/dist-cjs/diagram/migrations.js.map +1 -0
- package/dist-cjs/diagram/normalize.js +73 -0
- package/dist-cjs/diagram/normalize.js.map +1 -0
- package/dist-cjs/diagram/schema.js +144 -0
- package/dist-cjs/diagram/schema.js.map +1 -0
- package/dist-cjs/http-file/detect.js +113 -0
- package/dist-cjs/http-file/detect.js.map +1 -0
- package/dist-cjs/http-file/flatImport.js +109 -0
- package/dist-cjs/http-file/flatImport.js.map +1 -0
- package/dist-cjs/http-file/index.js +20 -0
- package/dist-cjs/http-file/index.js.map +1 -0
- package/dist-cjs/http-file/parseHttpFile.js +127 -0
- package/dist-cjs/http-file/parseHttpFile.js.map +1 -0
- package/dist-cjs/index.js +5 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/scenario-runner/adapters/request-executor.js +41 -0
- package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -1
- package/dist-cjs/scenario-runner/runScenario.js +112 -0
- package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isDefaultEdgeStyle = exports.isBusComponentType = exports.isEdgeSemantic = exports.semanticStyle = exports.semanticFromStyle = exports.EDGE_SEMANTIC_ORDER = exports.EDGE_SEMANTICS = exports.BUS_STROKE_WIDTH = exports.EDGE_STROKE_WIDTH = exports.DASH_PATTERNS = void 0;
|
|
4
|
+
// The edge NOTATION: a diagram's edges carry ~60% of its meaning, so the four
|
|
5
|
+
// connection kinds get a fixed visual language instead of ad-hoc dashes.
|
|
6
|
+
//
|
|
7
|
+
// sync solid, normal weight — request/response call
|
|
8
|
+
// async long dash — fire-and-forget / event
|
|
9
|
+
// fallback dotted, thinner — retry, fallback or optional path
|
|
10
|
+
// bus solid, heavy — message bus / stream (Kafka, queues)
|
|
11
|
+
//
|
|
12
|
+
// The semantic is DERIVED from the style tuple (dashed + dashPattern +
|
|
13
|
+
// strokeWidth) rather than stored as a field: every existing diagram gains the
|
|
14
|
+
// notation for free and the document schema does not move.
|
|
15
|
+
const componentCatalog_js_1 = require("./componentCatalog.js");
|
|
16
|
+
// Dash patterns are SVG stroke-dasharray strings.
|
|
17
|
+
exports.DASH_PATTERNS = { dashed: "6 4", dotted: "1 3" };
|
|
18
|
+
exports.EDGE_STROKE_WIDTH = 1.5;
|
|
19
|
+
exports.BUS_STROKE_WIDTH = 3;
|
|
20
|
+
// Anything at least this heavy reads as a bus line.
|
|
21
|
+
const BUS_MIN_WIDTH = 2.5;
|
|
22
|
+
exports.EDGE_SEMANTICS = {
|
|
23
|
+
sync: {
|
|
24
|
+
label: "Sync",
|
|
25
|
+
hint: "Request / response call",
|
|
26
|
+
dashed: false,
|
|
27
|
+
dashPattern: null,
|
|
28
|
+
strokeWidth: exports.EDGE_STROKE_WIDTH,
|
|
29
|
+
},
|
|
30
|
+
async: {
|
|
31
|
+
label: "Async",
|
|
32
|
+
hint: "Fire-and-forget, event or callback",
|
|
33
|
+
dashed: true,
|
|
34
|
+
dashPattern: exports.DASH_PATTERNS.dashed,
|
|
35
|
+
strokeWidth: exports.EDGE_STROKE_WIDTH,
|
|
36
|
+
},
|
|
37
|
+
fallback: {
|
|
38
|
+
label: "Fallback",
|
|
39
|
+
hint: "Retry, fallback or optional path",
|
|
40
|
+
dashed: true,
|
|
41
|
+
dashPattern: exports.DASH_PATTERNS.dotted,
|
|
42
|
+
strokeWidth: 1.25,
|
|
43
|
+
},
|
|
44
|
+
bus: {
|
|
45
|
+
label: "Bus",
|
|
46
|
+
hint: "Message bus or stream",
|
|
47
|
+
dashed: false,
|
|
48
|
+
dashPattern: null,
|
|
49
|
+
strokeWidth: exports.BUS_STROKE_WIDTH,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
exports.EDGE_SEMANTIC_ORDER = ["sync", "async", "fallback", "bus"];
|
|
53
|
+
const semanticFromStyle = (style) => {
|
|
54
|
+
if (style?.dashed) {
|
|
55
|
+
return style.dashPattern === exports.DASH_PATTERNS.dotted ? "fallback" : "async";
|
|
56
|
+
}
|
|
57
|
+
return (style?.strokeWidth ?? exports.EDGE_STROKE_WIDTH) >= BUS_MIN_WIDTH ? "bus" : "sync";
|
|
58
|
+
};
|
|
59
|
+
exports.semanticFromStyle = semanticFromStyle;
|
|
60
|
+
const semanticStyle = (semantic) => {
|
|
61
|
+
const spec = exports.EDGE_SEMANTICS[semantic];
|
|
62
|
+
return {
|
|
63
|
+
dashed: spec.dashed,
|
|
64
|
+
dashPattern: spec.dashPattern ?? undefined,
|
|
65
|
+
strokeWidth: spec.strokeWidth,
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
exports.semanticStyle = semanticStyle;
|
|
69
|
+
const isEdgeSemantic = (value) => typeof value === "string" && exports.EDGE_SEMANTIC_ORDER.includes(value);
|
|
70
|
+
exports.isEdgeSemantic = isEdgeSemantic;
|
|
71
|
+
// Message-broker-ish components: connecting to one of these is what turns an
|
|
72
|
+
// edge into a bus line automatically.
|
|
73
|
+
const isBusComponentType = (type) => {
|
|
74
|
+
if (!type)
|
|
75
|
+
return false;
|
|
76
|
+
const def = (0, componentCatalog_js_1.getDiagramComponent)(type);
|
|
77
|
+
if (!def)
|
|
78
|
+
return false;
|
|
79
|
+
return def.category === "messaging" || type === "net.queue" || type === "mq.kafka";
|
|
80
|
+
};
|
|
81
|
+
exports.isBusComponentType = isBusComponentType;
|
|
82
|
+
// True when the edge still carries the default look — nothing the user chose.
|
|
83
|
+
// Auto-notation only ever upgrades an untouched edge.
|
|
84
|
+
const isDefaultEdgeStyle = (style) => !style?.dashed && (style?.strokeWidth === undefined || style.strokeWidth === exports.EDGE_STROKE_WIDTH);
|
|
85
|
+
exports.isDefaultEdgeStyle = isDefaultEdgeStyle;
|
|
86
|
+
//# sourceMappingURL=edgeSemantics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edgeSemantics.js","sourceRoot":"","sources":["../../src/diagram/edgeSemantics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gridLayout = exports.applyDetailedLayout = exports.applyHierarchicalElkResult = exports.buildHierarchicalElkGraph = exports.applyElkPositions = exports.buildElkGraph = exports.layoutOptionsFor = void 0;
|
|
4
|
+
const layoutOptionsFor = (algorithm, direction) => {
|
|
5
|
+
switch (algorithm) {
|
|
6
|
+
case "force":
|
|
7
|
+
return { "elk.algorithm": "force", "elk.spacing.nodeNode": "70" };
|
|
8
|
+
case "radial":
|
|
9
|
+
return { "elk.algorithm": "radial", "elk.spacing.nodeNode": "60" };
|
|
10
|
+
case "tree":
|
|
11
|
+
return { "elk.algorithm": "mrtree", "elk.direction": direction, "elk.spacing.nodeNode": "45" };
|
|
12
|
+
case "layered":
|
|
13
|
+
default:
|
|
14
|
+
return {
|
|
15
|
+
"elk.algorithm": "layered",
|
|
16
|
+
"elk.direction": direction,
|
|
17
|
+
"elk.layered.spacing.nodeNodeBetweenLayers": "70",
|
|
18
|
+
"elk.spacing.nodeNode": "45",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.layoutOptionsFor = layoutOptionsFor;
|
|
23
|
+
// Only top-level nodes are laid out; children ride with their container.
|
|
24
|
+
const buildElkGraph = (doc, algorithm, options = {}) => {
|
|
25
|
+
const direction = options.direction ?? "DOWN";
|
|
26
|
+
const topLevel = doc.nodes.filter((node) => !node.parentId);
|
|
27
|
+
const subset = options.nodeIds && options.nodeIds.length > 1 ? new Set(options.nodeIds) : undefined;
|
|
28
|
+
const layoutNodes = subset ? topLevel.filter((node) => subset.has(node.id)) : topLevel;
|
|
29
|
+
const layoutIds = new Set(layoutNodes.map((node) => node.id));
|
|
30
|
+
return {
|
|
31
|
+
layoutNodes,
|
|
32
|
+
graph: {
|
|
33
|
+
id: "root",
|
|
34
|
+
layoutOptions: (0, exports.layoutOptionsFor)(algorithm, direction),
|
|
35
|
+
children: layoutNodes.map((node) => ({
|
|
36
|
+
id: node.id,
|
|
37
|
+
width: node.size.width,
|
|
38
|
+
height: node.size.height,
|
|
39
|
+
})),
|
|
40
|
+
// Only edges whose BOTH ends are laid-out nodes participate; free "Line"
|
|
41
|
+
// components (point endpoints) are skipped.
|
|
42
|
+
edges: doc.edges
|
|
43
|
+
.filter((edge) => edge.source && edge.target && layoutIds.has(edge.source) && layoutIds.has(edge.target))
|
|
44
|
+
.map((edge) => ({ id: edge.id, sources: [edge.source], targets: [edge.target] })),
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
exports.buildElkGraph = buildElkGraph;
|
|
49
|
+
// Positions keyed by node id. A selection-only layout stays anchored where the
|
|
50
|
+
// selection already was so it doesn't jump to the ELK origin.
|
|
51
|
+
const applyElkPositions = (built, result, options = {}) => {
|
|
52
|
+
const positions = {};
|
|
53
|
+
for (const child of result.children ?? []) {
|
|
54
|
+
if (typeof child.x === "number" && typeof child.y === "number") {
|
|
55
|
+
positions[child.id] = { x: Math.round(child.x), y: Math.round(child.y) };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const subset = options.nodeIds && options.nodeIds.length > 1;
|
|
59
|
+
if (subset) {
|
|
60
|
+
const laidOut = built.layoutNodes.filter((node) => positions[node.id]);
|
|
61
|
+
if (laidOut.length > 0) {
|
|
62
|
+
const origMinX = Math.min(...laidOut.map((node) => node.position.x));
|
|
63
|
+
const origMinY = Math.min(...laidOut.map((node) => node.position.y));
|
|
64
|
+
const resMinX = Math.min(...laidOut.map((node) => positions[node.id].x));
|
|
65
|
+
const resMinY = Math.min(...laidOut.map((node) => positions[node.id].y));
|
|
66
|
+
const dx = origMinX - resMinX;
|
|
67
|
+
const dy = origMinY - resMinY;
|
|
68
|
+
for (const id of Object.keys(positions)) {
|
|
69
|
+
positions[id] = { x: positions[id].x + dx, y: positions[id].y + dy };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return positions;
|
|
74
|
+
};
|
|
75
|
+
exports.applyElkPositions = applyElkPositions;
|
|
76
|
+
// Full HIERARCHICAL graph for an AI/MCP-generated diagram: children are nested
|
|
77
|
+
// under their container (`parentId`) so ELK lays them out INSIDE and SIZES the
|
|
78
|
+
// container to fit; edges are routed orthogonally around nodes.
|
|
79
|
+
const buildHierarchicalElkGraph = (doc, algorithm, options = {}) => {
|
|
80
|
+
const direction = options.direction ?? "DOWN";
|
|
81
|
+
const nodeById = new Map(doc.nodes.map((node) => [node.id, node]));
|
|
82
|
+
const childrenOf = new Map();
|
|
83
|
+
const roots = [];
|
|
84
|
+
for (const node of doc.nodes) {
|
|
85
|
+
if (node.parentId && nodeById.has(node.parentId)) {
|
|
86
|
+
const list = childrenOf.get(node.parentId) ?? [];
|
|
87
|
+
list.push(node);
|
|
88
|
+
childrenOf.set(node.parentId, list);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
roots.push(node);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Inner layout for a container: lay children out and pad (top pad leaves
|
|
95
|
+
// room for the container's title so children don't sit under it).
|
|
96
|
+
const containerOptions = {
|
|
97
|
+
"elk.algorithm": "layered",
|
|
98
|
+
"elk.direction": direction,
|
|
99
|
+
"elk.layered.spacing.nodeNodeBetweenLayers": "60",
|
|
100
|
+
"elk.spacing.nodeNode": "45",
|
|
101
|
+
"elk.padding": "[top=48,left=28,bottom=28,right=28]",
|
|
102
|
+
};
|
|
103
|
+
const toElk = (node) => {
|
|
104
|
+
const kids = childrenOf.get(node.id) ?? [];
|
|
105
|
+
if (kids.length > 0) {
|
|
106
|
+
// Omit width/height so ELK sizes the container to fit its children.
|
|
107
|
+
return { id: node.id, layoutOptions: containerOptions, children: kids.map(toElk) };
|
|
108
|
+
}
|
|
109
|
+
return { id: node.id, width: node.size.width, height: node.size.height };
|
|
110
|
+
};
|
|
111
|
+
return {
|
|
112
|
+
id: "root",
|
|
113
|
+
layoutOptions: {
|
|
114
|
+
...(0, exports.layoutOptionsFor)(algorithm, direction),
|
|
115
|
+
"elk.edgeRouting": "ORTHOGONAL",
|
|
116
|
+
"elk.spacing.nodeNode": "60",
|
|
117
|
+
"elk.layered.spacing.nodeNodeBetweenLayers": "90",
|
|
118
|
+
"elk.layered.spacing.edgeNodeBetweenLayers": "30",
|
|
119
|
+
// Let edges cross container boundaries and be routed together.
|
|
120
|
+
"elk.hierarchyHandling": "INCLUDE_CHILDREN",
|
|
121
|
+
},
|
|
122
|
+
children: roots.map(toElk),
|
|
123
|
+
edges: doc.edges
|
|
124
|
+
.filter((edge) => edge.source && edge.target && nodeById.has(edge.source) && nodeById.has(edge.target))
|
|
125
|
+
.map((edge) => ({ id: edge.id, sources: [edge.source], targets: [edge.target] })),
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
exports.buildHierarchicalElkGraph = buildHierarchicalElkGraph;
|
|
129
|
+
// Walk the ELK result tree, accumulating each node's ABSOLUTE offset: node
|
|
130
|
+
// positions/edges from ELK are relative to their container, so the
|
|
131
|
+
// container's absolute origin is added back to recover absolute coordinates
|
|
132
|
+
// for anchors and waypoints. Positions stay relative to the parent.
|
|
133
|
+
const applyHierarchicalElkResult = (result) => {
|
|
134
|
+
const positions = {};
|
|
135
|
+
const sizes = {};
|
|
136
|
+
const absBounds = new Map();
|
|
137
|
+
const rawEdges = [];
|
|
138
|
+
const walk = (node, absX, absY) => {
|
|
139
|
+
for (const edge of node.edges ?? []) {
|
|
140
|
+
const section = edge.sections?.[0];
|
|
141
|
+
if (!section)
|
|
142
|
+
continue;
|
|
143
|
+
const toAbs = (p) => ({
|
|
144
|
+
x: Math.round(absX + p.x),
|
|
145
|
+
y: Math.round(absY + p.y),
|
|
146
|
+
});
|
|
147
|
+
rawEdges.push({
|
|
148
|
+
id: edge.id,
|
|
149
|
+
sourceId: edge.sources?.[0],
|
|
150
|
+
targetId: edge.targets?.[0],
|
|
151
|
+
waypoints: (section.bendPoints ?? []).map(toAbs),
|
|
152
|
+
start: section.startPoint ? toAbs(section.startPoint) : undefined,
|
|
153
|
+
end: section.endPoint ? toAbs(section.endPoint) : undefined,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
for (const child of node.children ?? []) {
|
|
157
|
+
const rx = child.x ?? 0;
|
|
158
|
+
const ry = child.y ?? 0;
|
|
159
|
+
const cx = absX + rx;
|
|
160
|
+
const cy = absY + ry;
|
|
161
|
+
positions[child.id] = { x: Math.round(rx), y: Math.round(ry) };
|
|
162
|
+
if (typeof child.width === "number" && typeof child.height === "number") {
|
|
163
|
+
sizes[child.id] = { width: Math.round(child.width), height: Math.round(child.height) };
|
|
164
|
+
absBounds.set(child.id, { x: cx, y: cy, w: child.width, h: child.height });
|
|
165
|
+
}
|
|
166
|
+
walk(child, cx, cy);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
walk(result, 0, 0);
|
|
170
|
+
const clamp01 = (n) => Math.min(1, Math.max(0, n));
|
|
171
|
+
const toAnchor = (point, id) => {
|
|
172
|
+
const bounds = id ? absBounds.get(id) : undefined;
|
|
173
|
+
if (!point || !bounds || bounds.w <= 0 || bounds.h <= 0)
|
|
174
|
+
return undefined;
|
|
175
|
+
return {
|
|
176
|
+
x: Math.round(clamp01((point.x - bounds.x) / bounds.w) * 1000) / 1000,
|
|
177
|
+
y: Math.round(clamp01((point.y - bounds.y) / bounds.h) * 1000) / 1000,
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
const edges = {};
|
|
181
|
+
for (const edge of rawEdges) {
|
|
182
|
+
edges[edge.id] = {
|
|
183
|
+
waypoints: edge.waypoints,
|
|
184
|
+
sourceAnchor: toAnchor(edge.start, edge.sourceId),
|
|
185
|
+
targetAnchor: toAnchor(edge.end, edge.targetId),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return { positions, sizes, edges };
|
|
189
|
+
};
|
|
190
|
+
exports.applyHierarchicalElkResult = applyHierarchicalElkResult;
|
|
191
|
+
// Bake a detailed layout onto the document: ELK positions + container sizes
|
|
192
|
+
// on nodes; STRAIGHT routing through ELK's bend points with both ends PINNED
|
|
193
|
+
// to ELK's exact connection points on edges, so the whole path is fixed,
|
|
194
|
+
// axis-aligned geometry (identical at every zoom — the desktop's floating
|
|
195
|
+
// router would otherwise re-route on every view revalidate).
|
|
196
|
+
const applyDetailedLayout = (doc, layout) => {
|
|
197
|
+
if (Object.keys(layout.positions).length === 0)
|
|
198
|
+
return doc;
|
|
199
|
+
return {
|
|
200
|
+
...doc,
|
|
201
|
+
nodes: doc.nodes.map((node) => {
|
|
202
|
+
const position = layout.positions[node.id];
|
|
203
|
+
const size = layout.sizes[node.id];
|
|
204
|
+
let next = node;
|
|
205
|
+
if (position)
|
|
206
|
+
next = { ...next, position };
|
|
207
|
+
if (size)
|
|
208
|
+
next = { ...next, size };
|
|
209
|
+
return next;
|
|
210
|
+
}),
|
|
211
|
+
edges: doc.edges.map((edge) => {
|
|
212
|
+
const routed = layout.edges[edge.id];
|
|
213
|
+
// Only re-route edges ELK actually laid out (both ends are nodes).
|
|
214
|
+
if (!routed || !edge.source || !edge.target)
|
|
215
|
+
return edge;
|
|
216
|
+
return {
|
|
217
|
+
...edge,
|
|
218
|
+
routing: "straight",
|
|
219
|
+
waypoints: routed.waypoints.length > 0 ? routed.waypoints : undefined,
|
|
220
|
+
sourceAnchor: routed.sourceAnchor,
|
|
221
|
+
targetAnchor: routed.targetAnchor,
|
|
222
|
+
};
|
|
223
|
+
}),
|
|
224
|
+
};
|
|
225
|
+
};
|
|
226
|
+
exports.applyDetailedLayout = applyDetailedLayout;
|
|
227
|
+
// Deterministic grid for hosts without elkjs: top-level nodes in reading
|
|
228
|
+
// order, cell size = the largest node, children of a container placed inside
|
|
229
|
+
// it in a sub-grid and the container sized to fit.
|
|
230
|
+
const gridLayout = (doc, options = {}) => {
|
|
231
|
+
const gap = options.gap ?? 48;
|
|
232
|
+
const origin = options.origin ?? { x: 80, y: 80 };
|
|
233
|
+
const nodeById = new Map(doc.nodes.map((node) => [node.id, node]));
|
|
234
|
+
const childrenOf = new Map();
|
|
235
|
+
const roots = [];
|
|
236
|
+
for (const node of doc.nodes) {
|
|
237
|
+
if (node.parentId && nodeById.has(node.parentId)) {
|
|
238
|
+
const list = childrenOf.get(node.parentId) ?? [];
|
|
239
|
+
list.push(node);
|
|
240
|
+
childrenOf.set(node.parentId, list);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
roots.push(node);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const placed = new Map();
|
|
247
|
+
// Lays `nodes` out in a grid starting at (0,0) relative to their parent and
|
|
248
|
+
// returns the bounding size. Containers are laid out recursively first so
|
|
249
|
+
// their size is known when they take a grid cell.
|
|
250
|
+
const layoutGroup = (nodes, padTop, padSide) => {
|
|
251
|
+
const sized = nodes.map((node) => {
|
|
252
|
+
const kids = childrenOf.get(node.id) ?? [];
|
|
253
|
+
if (kids.length === 0)
|
|
254
|
+
return { node, width: node.size.width, height: node.size.height };
|
|
255
|
+
const inner = layoutGroup(kids, 48, 28);
|
|
256
|
+
return { node, width: inner.width, height: inner.height };
|
|
257
|
+
});
|
|
258
|
+
const columns = options.columns ?? Math.max(1, Math.ceil(Math.sqrt(sized.length)));
|
|
259
|
+
const cellW = Math.max(...sized.map((entry) => entry.width));
|
|
260
|
+
const cellH = Math.max(...sized.map((entry) => entry.height));
|
|
261
|
+
sized.forEach((entry, index) => {
|
|
262
|
+
const col = index % columns;
|
|
263
|
+
const row = Math.floor(index / columns);
|
|
264
|
+
placed.set(entry.node.id, {
|
|
265
|
+
...entry.node,
|
|
266
|
+
position: { x: padSide + col * (cellW + gap), y: padTop + row * (cellH + gap) },
|
|
267
|
+
size: { width: entry.width, height: entry.height },
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
const rows = Math.ceil(sized.length / columns);
|
|
271
|
+
return {
|
|
272
|
+
width: padSide * 2 + columns * cellW + (columns - 1) * gap,
|
|
273
|
+
height: padTop + padSide + rows * cellH + (rows - 1) * gap,
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
if (roots.length > 0)
|
|
277
|
+
layoutGroup(roots, 0, 0);
|
|
278
|
+
return {
|
|
279
|
+
...doc,
|
|
280
|
+
nodes: doc.nodes.map((node) => {
|
|
281
|
+
const next = placed.get(node.id) ?? node;
|
|
282
|
+
if (next.parentId)
|
|
283
|
+
return next;
|
|
284
|
+
return { ...next, position: { x: next.position.x + origin.x, y: next.position.y + origin.y } };
|
|
285
|
+
}),
|
|
286
|
+
// Drop stale routing — positions changed.
|
|
287
|
+
edges: doc.edges.map((edge) => edge.source && edge.target
|
|
288
|
+
? { ...edge, waypoints: undefined, sourceAnchor: undefined, targetAnchor: undefined }
|
|
289
|
+
: edge),
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
exports.gridLayout = gridLayout;
|
|
293
|
+
//# sourceMappingURL=elkGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elkGraph.js","sourceRoot":"","sources":["../../src/diagram/elkGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.normalizeDiagramStyles = exports.normalizeDiagramStyle = exports.migrateDocument = void 0;
|
|
18
|
+
// The diagram document contract — schema + validator + migrations, the
|
|
19
|
+
// serialisable component catalog, edge notation, style normalisation and the
|
|
20
|
+
// pure ELK layout builder/applier. One source for the desktop studio, the
|
|
21
|
+
// MCP server and the backend. CSP-safe throughout: no zod, no ajv, no
|
|
22
|
+
// `new Function`, no Node built-ins, no elkjs (this code runs in the Electron
|
|
23
|
+
// renderer; hosts bring their own elkjs).
|
|
24
|
+
__exportStar(require("./schema.js"), exports);
|
|
25
|
+
var migrations_js_1 = require("./migrations.js");
|
|
26
|
+
Object.defineProperty(exports, "migrateDocument", { enumerable: true, get: function () { return migrations_js_1.migrateDocument; } });
|
|
27
|
+
__exportStar(require("./componentCatalog.js"), exports);
|
|
28
|
+
__exportStar(require("./edgeSemantics.js"), exports);
|
|
29
|
+
var normalize_js_1 = require("./normalize.js");
|
|
30
|
+
Object.defineProperty(exports, "normalizeDiagramStyle", { enumerable: true, get: function () { return normalize_js_1.normalizeDiagramStyle; } });
|
|
31
|
+
Object.defineProperty(exports, "normalizeDiagramStyles", { enumerable: true, get: function () { return normalize_js_1.normalizeDiagramStyles; } });
|
|
32
|
+
__exportStar(require("./elkGraph.js"), exports);
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diagram/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,0EAA0E;AAC1E,sEAAsE;AACtE,8EAA8E;AAC9E,0CAA0C;AAC1C,8CAA4B;AAC5B,iDAAkD;AAAzC,gHAAA,eAAe,OAAA;AACxB,wDAAsC;AACtC,qDAAmC;AACnC,+CAA+E;AAAtE,qHAAA,qBAAqB,OAAA;AAAE,sHAAA,sBAAsB,OAAA;AACtD,gDAA8B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migrateDocument = void 0;
|
|
4
|
+
// Forward migration of older persisted documents up to the current
|
|
5
|
+
// SCHEMA_VERSION. Empty for v1; each future schema bump registers a
|
|
6
|
+
// vN -> vN+1 step here. A schema bump therefore ships in core FIRST — every
|
|
7
|
+
// host (desktop, MCP, backend) then migrates identically.
|
|
8
|
+
const schema_js_1 = require("./schema.js");
|
|
9
|
+
// Keyed by the version a step upgrades FROM (e.g. 1 transforms v1 -> v2).
|
|
10
|
+
const MIGRATIONS = {
|
|
11
|
+
// 1: (doc) => ({ ...doc, schemaVersion: 2, /* ...transform... */ }),
|
|
12
|
+
};
|
|
13
|
+
const migrateDocument = (raw) => {
|
|
14
|
+
if (typeof raw !== "object" || raw === null) {
|
|
15
|
+
throw new Error("Cannot migrate: document is not an object");
|
|
16
|
+
}
|
|
17
|
+
let doc = raw;
|
|
18
|
+
let version = typeof doc.schemaVersion === "number" ? doc.schemaVersion : 0;
|
|
19
|
+
while (version < schema_js_1.SCHEMA_VERSION) {
|
|
20
|
+
const step = MIGRATIONS[version];
|
|
21
|
+
if (!step) {
|
|
22
|
+
throw new Error(`No migration registered to upgrade from schemaVersion ${version}`);
|
|
23
|
+
}
|
|
24
|
+
doc = step(doc);
|
|
25
|
+
const next = typeof doc.schemaVersion === "number" ? doc.schemaVersion : version + 1;
|
|
26
|
+
if (next <= version) {
|
|
27
|
+
throw new Error(`Migration from schemaVersion ${version} did not advance the version`);
|
|
28
|
+
}
|
|
29
|
+
version = next;
|
|
30
|
+
}
|
|
31
|
+
if (version > schema_js_1.SCHEMA_VERSION) {
|
|
32
|
+
throw new Error(`Document schemaVersion ${version} is newer than supported (${schema_js_1.SCHEMA_VERSION}); update the app`);
|
|
33
|
+
}
|
|
34
|
+
return (0, schema_js_1.parseDiagramDocument)(doc);
|
|
35
|
+
};
|
|
36
|
+
exports.migrateDocument = migrateDocument;
|
|
37
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/diagram/migrations.ts"],"names":[],"mappings":";;;AAAA,mEAAmE;AACnE,oEAAoE;AACpE,4EAA4E;AAC5E,0DAA0D;AAC1D,2CAAyF;AAIzF,0EAA0E;AAC1E,MAAM,UAAU,GAAkC;AAChD,qEAAqE;CACtE,CAAC;AAEK,MAAM,eAAe,GAAG,CAAC,GAAY,EAAmB,EAAE;IAC/D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,GAAG,GAAG,GAA8B,CAAC;IACzC,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,OAAO,OAAO,GAAG,0BAAc,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,yDAAyD,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QACrF,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,8BAA8B,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,GAAG,0BAAc,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,0BAA0B,OAAO,6BAA6B,0BAAc,mBAAmB,CAChG,CAAC;IACJ,CAAC;IAED,OAAO,IAAA,gCAAoB,EAAC,GAAG,CAAC,CAAC;AACnC,CAAC,CAAC;AA5BW,QAAA,eAAe,mBA4B1B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeDiagramStyles = exports.normalizeDiagramStyle = void 0;
|
|
4
|
+
const toTokenRef = (value) => {
|
|
5
|
+
if (typeof value === "string" && value.trim())
|
|
6
|
+
return { raw: value.trim() };
|
|
7
|
+
if (value && typeof value === "object") {
|
|
8
|
+
const ref = value;
|
|
9
|
+
if (typeof ref.raw === "string" && ref.raw.trim())
|
|
10
|
+
return { raw: ref.raw.trim() };
|
|
11
|
+
if (typeof ref.token === "string" && ref.token.trim())
|
|
12
|
+
return { token: ref.token.trim() };
|
|
13
|
+
}
|
|
14
|
+
return undefined;
|
|
15
|
+
};
|
|
16
|
+
const normalizeDiagramStyle = (style) => {
|
|
17
|
+
if (!style || typeof style !== "object")
|
|
18
|
+
return undefined;
|
|
19
|
+
const s = style;
|
|
20
|
+
const out = {};
|
|
21
|
+
const fill = toTokenRef(s.fill);
|
|
22
|
+
const stroke = toTokenRef(s.stroke);
|
|
23
|
+
const textColor = toTokenRef(s.textColor);
|
|
24
|
+
if (fill)
|
|
25
|
+
out.fill = fill;
|
|
26
|
+
if (stroke)
|
|
27
|
+
out.stroke = stroke;
|
|
28
|
+
if (textColor)
|
|
29
|
+
out.textColor = textColor;
|
|
30
|
+
if (typeof s.strokeWidth === "number")
|
|
31
|
+
out.strokeWidth = s.strokeWidth;
|
|
32
|
+
if (typeof s.radius === "number")
|
|
33
|
+
out.radius = s.radius;
|
|
34
|
+
if (typeof s.rounded === "boolean")
|
|
35
|
+
out.rounded = s.rounded;
|
|
36
|
+
if (typeof s.dashed === "boolean")
|
|
37
|
+
out.dashed = s.dashed;
|
|
38
|
+
if (typeof s.dashPattern === "string")
|
|
39
|
+
out.dashPattern = s.dashPattern;
|
|
40
|
+
if (typeof s.fontSize === "number")
|
|
41
|
+
out.fontSize = s.fontSize;
|
|
42
|
+
if (typeof s.fontWeight === "number")
|
|
43
|
+
out.fontWeight = s.fontWeight;
|
|
44
|
+
if (typeof s.fontFamily === "string")
|
|
45
|
+
out.fontFamily = s.fontFamily;
|
|
46
|
+
if (typeof s.fontStyle === "number")
|
|
47
|
+
out.fontStyle = s.fontStyle;
|
|
48
|
+
if (s.align === "left" || s.align === "center" || s.align === "right")
|
|
49
|
+
out.align = s.align;
|
|
50
|
+
if (s.verticalAlign === "top" || s.verticalAlign === "middle" || s.verticalAlign === "bottom")
|
|
51
|
+
out.verticalAlign = s.verticalAlign;
|
|
52
|
+
if (typeof s.shadow === "boolean")
|
|
53
|
+
out.shadow = s.shadow;
|
|
54
|
+
if (typeof s.opacity === "number")
|
|
55
|
+
out.opacity = s.opacity;
|
|
56
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
57
|
+
};
|
|
58
|
+
exports.normalizeDiagramStyle = normalizeDiagramStyle;
|
|
59
|
+
const normalizeDiagramStyles = (doc) => ({
|
|
60
|
+
...doc,
|
|
61
|
+
nodes: doc.nodes.map((node) => ({
|
|
62
|
+
...node,
|
|
63
|
+
// Coerce rotation to a number (the model may omit it or emit a string).
|
|
64
|
+
rotation: typeof node.rotation === "number" ? node.rotation : undefined,
|
|
65
|
+
style: (0, exports.normalizeDiagramStyle)(node.style),
|
|
66
|
+
})),
|
|
67
|
+
edges: doc.edges.map((edge) => ({
|
|
68
|
+
...edge,
|
|
69
|
+
style: (0, exports.normalizeDiagramStyle)(edge.style),
|
|
70
|
+
})),
|
|
71
|
+
});
|
|
72
|
+
exports.normalizeDiagramStyles = normalizeDiagramStyles;
|
|
73
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/diagram/normalize.ts"],"names":[],"mappings":"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"}
|