@aetherwing/fcp-drawio 0.2.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/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/adapter.d.ts +38 -0
- package/dist/adapter.js +259 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/elk-layout.d.ts +49 -0
- package/dist/layout/elk-layout.js +144 -0
- package/dist/layout/elk-layout.js.map +1 -0
- package/dist/lib/drawio-cli.d.ts +22 -0
- package/dist/lib/drawio-cli.js +88 -0
- package/dist/lib/drawio-cli.js.map +1 -0
- package/dist/lib/node-types.d.ts +22 -0
- package/dist/lib/node-types.js +174 -0
- package/dist/lib/node-types.js.map +1 -0
- package/dist/lib/stencils/aws.d.ts +2 -0
- package/dist/lib/stencils/aws.js +69 -0
- package/dist/lib/stencils/aws.js.map +1 -0
- package/dist/lib/stencils/azure.d.ts +2 -0
- package/dist/lib/stencils/azure.js +54 -0
- package/dist/lib/stencils/azure.js.map +1 -0
- package/dist/lib/stencils/cisco.d.ts +2 -0
- package/dist/lib/stencils/cisco.js +30 -0
- package/dist/lib/stencils/cisco.js.map +1 -0
- package/dist/lib/stencils/gcp.d.ts +2 -0
- package/dist/lib/stencils/gcp.js +38 -0
- package/dist/lib/stencils/gcp.js.map +1 -0
- package/dist/lib/stencils/ibm.d.ts +2 -0
- package/dist/lib/stencils/ibm.js +32 -0
- package/dist/lib/stencils/ibm.js.map +1 -0
- package/dist/lib/stencils/index.d.ts +10 -0
- package/dist/lib/stencils/index.js +33 -0
- package/dist/lib/stencils/index.js.map +1 -0
- package/dist/lib/stencils/k8s.d.ts +2 -0
- package/dist/lib/stencils/k8s.js +32 -0
- package/dist/lib/stencils/k8s.js.map +1 -0
- package/dist/lib/stencils/types.d.ts +14 -0
- package/dist/lib/stencils/types.js +2 -0
- package/dist/lib/stencils/types.js.map +1 -0
- package/dist/lib/themes.d.ts +8 -0
- package/dist/lib/themes.js +32 -0
- package/dist/lib/themes.js.map +1 -0
- package/dist/model/defaults.d.ts +3 -0
- package/dist/model/defaults.js +26 -0
- package/dist/model/defaults.js.map +1 -0
- package/dist/model/diagram-model.d.ts +110 -0
- package/dist/model/diagram-model.js +938 -0
- package/dist/model/diagram-model.js.map +1 -0
- package/dist/model/event-log.d.ts +30 -0
- package/dist/model/event-log.js +112 -0
- package/dist/model/event-log.js.map +1 -0
- package/dist/model/id.d.ts +9 -0
- package/dist/model/id.js +35 -0
- package/dist/model/id.js.map +1 -0
- package/dist/model/reference-registry.d.ts +33 -0
- package/dist/model/reference-registry.js +143 -0
- package/dist/model/reference-registry.js.map +1 -0
- package/dist/model/spatial.d.ts +20 -0
- package/dist/model/spatial.js +59 -0
- package/dist/model/spatial.js.map +1 -0
- package/dist/parser/parse-op.d.ts +18 -0
- package/dist/parser/parse-op.js +430 -0
- package/dist/parser/parse-op.js.map +1 -0
- package/dist/parser/resolve-ref.d.ts +27 -0
- package/dist/parser/resolve-ref.js +232 -0
- package/dist/parser/resolve-ref.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +6 -0
- package/dist/parser/tokenizer.js +7 -0
- package/dist/parser/tokenizer.js.map +1 -0
- package/dist/serialization/connector-intelligence.d.ts +35 -0
- package/dist/serialization/connector-intelligence.js +336 -0
- package/dist/serialization/connector-intelligence.js.map +1 -0
- package/dist/serialization/deserialize.d.ts +6 -0
- package/dist/serialization/deserialize.js +511 -0
- package/dist/serialization/deserialize.js.map +1 -0
- package/dist/serialization/serialize.d.ts +15 -0
- package/dist/serialization/serialize.js +332 -0
- package/dist/serialization/serialize.js.map +1 -0
- package/dist/server/intent-layer.d.ts +48 -0
- package/dist/server/intent-layer.js +1322 -0
- package/dist/server/intent-layer.js.map +1 -0
- package/dist/server/mcp-server.d.ts +7 -0
- package/dist/server/mcp-server.js +26 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/server/model-map.d.ts +8 -0
- package/dist/server/model-map.js +240 -0
- package/dist/server/model-map.js.map +1 -0
- package/dist/server/query-handler.d.ts +19 -0
- package/dist/server/query-handler.js +148 -0
- package/dist/server/query-handler.js.map +1 -0
- package/dist/server/response-formatter.d.ts +56 -0
- package/dist/server/response-formatter.js +351 -0
- package/dist/server/response-formatter.js.map +1 -0
- package/dist/server/session-handler.d.ts +6 -0
- package/dist/server/session-handler.js +127 -0
- package/dist/server/session-handler.js.map +1 -0
- package/dist/types/index.d.ts +238 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/verb-specs.d.ts +6 -0
- package/dist/verb-specs.js +144 -0
- package/dist/verb-specs.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Shape, Edge, Group } from "../types/index.js";
|
|
2
|
+
import type { DiagramModel } from "../model/diagram-model.js";
|
|
3
|
+
/**
|
|
4
|
+
* Format a shape creation confirmation.
|
|
5
|
+
* Example: "+svc AuthService @(120,200 140x60) blue"
|
|
6
|
+
*/
|
|
7
|
+
export declare function formatShapeCreated(shape: Shape): string;
|
|
8
|
+
/**
|
|
9
|
+
* Format an edge creation confirmation.
|
|
10
|
+
* Example: '~AuthService->UserDB "queries" dashed'
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatEdgeCreated(edge: Edge, sourceLabel: string, targetLabel: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Format a shape modification confirmation.
|
|
15
|
+
* Example: "*styled AuthService fill:red (1 shape)"
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatShapeModified(shape: Shape, what: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format a shape deletion confirmation.
|
|
20
|
+
* Example: "-AuthService"
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatShapeDeleted(shape: Shape): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format a group creation confirmation.
|
|
25
|
+
* Example: "!group Backend (3 shapes)"
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatGroupCreated(group: Group): string;
|
|
28
|
+
/**
|
|
29
|
+
* Format a full status output (Tier 3).
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatStatus(model: DiagramModel): string;
|
|
32
|
+
/**
|
|
33
|
+
* Format a list of shapes.
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatList(shapes: Shape[]): string;
|
|
36
|
+
/**
|
|
37
|
+
* Format connections for a shape.
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatConnections(shape: Shape, incoming: Edge[], outgoing: Edge[], model: DiagramModel): string;
|
|
40
|
+
/**
|
|
41
|
+
* Format a shape description (full details).
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatDescribe(shape: Shape, model: DiagramModel): string;
|
|
44
|
+
/**
|
|
45
|
+
* Format stats summary.
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatStats(model: DiagramModel): string;
|
|
48
|
+
/**
|
|
49
|
+
* Format history events.
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatHistory(events: import("../types/index.js").DiagramEvent[]): string;
|
|
52
|
+
/**
|
|
53
|
+
* Format a spatial map of the diagram.
|
|
54
|
+
* Compact summary: canvas size, flow direction, groups with positions, ungrouped shapes.
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatMap(model: DiagramModel): string;
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { THEMES } from "../lib/themes.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reverse-lookup a theme name from a fill color.
|
|
4
|
+
*/
|
|
5
|
+
function reverseThemeLookup(fillColor) {
|
|
6
|
+
if (!fillColor)
|
|
7
|
+
return null;
|
|
8
|
+
for (const [name, colors] of Object.entries(THEMES)) {
|
|
9
|
+
if (colors.fill === fillColor)
|
|
10
|
+
return name;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Format a shape creation confirmation.
|
|
16
|
+
* Example: "+svc AuthService @(120,200 140x60) blue"
|
|
17
|
+
*/
|
|
18
|
+
export function formatShapeCreated(shape) {
|
|
19
|
+
const theme = reverseThemeLookup(shape.style.fillColor);
|
|
20
|
+
const pos = `@(${shape.bounds.x},${shape.bounds.y} ${shape.bounds.width}x${shape.bounds.height})`;
|
|
21
|
+
const parts = [`+${shape.type}`, shape.label, pos];
|
|
22
|
+
if (theme)
|
|
23
|
+
parts.push(theme);
|
|
24
|
+
return parts.join(" ");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Format an edge creation confirmation.
|
|
28
|
+
* Example: '~AuthService->UserDB "queries" dashed'
|
|
29
|
+
*/
|
|
30
|
+
export function formatEdgeCreated(edge, sourceLabel, targetLabel) {
|
|
31
|
+
const parts = [`~${sourceLabel}->${targetLabel}`];
|
|
32
|
+
if (edge.label)
|
|
33
|
+
parts.push(`"${edge.label}"`);
|
|
34
|
+
if (edge.style.dotted)
|
|
35
|
+
parts.push("dotted");
|
|
36
|
+
else if (edge.style.dashed)
|
|
37
|
+
parts.push("dashed");
|
|
38
|
+
if (edge.style.curved)
|
|
39
|
+
parts.push("curved");
|
|
40
|
+
if (edge.style.flowAnimation)
|
|
41
|
+
parts.push("animated");
|
|
42
|
+
return parts.join(" ");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Format a shape modification confirmation.
|
|
46
|
+
* Example: "*styled AuthService fill:red (1 shape)"
|
|
47
|
+
*/
|
|
48
|
+
export function formatShapeModified(shape, what) {
|
|
49
|
+
return `*${what} ${shape.label}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Format a shape deletion confirmation.
|
|
53
|
+
* Example: "-AuthService"
|
|
54
|
+
*/
|
|
55
|
+
export function formatShapeDeleted(shape) {
|
|
56
|
+
return `-${shape.label}`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format a group creation confirmation.
|
|
60
|
+
* Example: "!group Backend (3 shapes)"
|
|
61
|
+
*/
|
|
62
|
+
export function formatGroupCreated(group) {
|
|
63
|
+
return `!group ${group.name} (${group.memberIds.size} shapes)`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Format a full status output (Tier 3).
|
|
67
|
+
*/
|
|
68
|
+
export function formatStatus(model) {
|
|
69
|
+
const d = model.diagram;
|
|
70
|
+
const page = model.getActivePage();
|
|
71
|
+
const shapeCount = page.shapes.size;
|
|
72
|
+
const edgeCount = page.edges.size;
|
|
73
|
+
const groupCount = page.groups.size;
|
|
74
|
+
const opCount = model.eventLog.length;
|
|
75
|
+
const checkpointCount = model.eventLog.checkpointCount;
|
|
76
|
+
const savedState = d.filePath ? `saved: ${d.filePath}` : "unsaved";
|
|
77
|
+
const lines = [];
|
|
78
|
+
lines.push(`status: "${d.title}" (${savedState}, ${opCount} ops, ${checkpointCount} checkpoints)`);
|
|
79
|
+
lines.push(` page: ${page.name} (${shapeCount} shapes, ${edgeCount} edges, ${groupCount} groups)`);
|
|
80
|
+
// Group shapes by their group membership
|
|
81
|
+
const grouped = new Map();
|
|
82
|
+
const ungrouped = [];
|
|
83
|
+
for (const shape of page.shapes.values()) {
|
|
84
|
+
if (shape.parentGroup) {
|
|
85
|
+
const group = page.groups.get(shape.parentGroup);
|
|
86
|
+
const groupName = group?.name ?? "Unknown";
|
|
87
|
+
const list = grouped.get(groupName) ?? [];
|
|
88
|
+
list.push(shape);
|
|
89
|
+
grouped.set(groupName, list);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
ungrouped.push(shape);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const [groupName, shapes] of grouped) {
|
|
96
|
+
const shapeList = shapes.map((s) => `${s.label}(${s.type})`).join(", ");
|
|
97
|
+
lines.push(` ${groupName}: ${shapeList}`);
|
|
98
|
+
}
|
|
99
|
+
if (ungrouped.length > 0) {
|
|
100
|
+
const shapeList = ungrouped.map((s) => `${s.label}(${s.type})`).join(", ");
|
|
101
|
+
lines.push(` Ungrouped: ${shapeList}`);
|
|
102
|
+
}
|
|
103
|
+
// Checkpoints
|
|
104
|
+
if (checkpointCount > 0) {
|
|
105
|
+
const cpEntries = [];
|
|
106
|
+
for (const [name, idx] of model.eventLog.getCheckpoints()) {
|
|
107
|
+
cpEntries.push(`"${name}" @op:${idx}`);
|
|
108
|
+
}
|
|
109
|
+
lines.push(` checkpoints: ${cpEntries.join(", ")}`);
|
|
110
|
+
}
|
|
111
|
+
return lines.join("\n");
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Format a list of shapes.
|
|
115
|
+
*/
|
|
116
|
+
export function formatList(shapes) {
|
|
117
|
+
if (shapes.length === 0)
|
|
118
|
+
return "No shapes on this page.";
|
|
119
|
+
return shapes.map((s) => `${s.label}(${s.type})`).join("\n");
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Format connections for a shape.
|
|
123
|
+
*/
|
|
124
|
+
export function formatConnections(shape, incoming, outgoing, model) {
|
|
125
|
+
const page = model.getActivePage();
|
|
126
|
+
const lines = [];
|
|
127
|
+
lines.push(`connections for ${shape.label}:`);
|
|
128
|
+
if (outgoing.length > 0) {
|
|
129
|
+
const targets = outgoing.map((e) => {
|
|
130
|
+
const target = page.shapes.get(e.targetId);
|
|
131
|
+
const label = target?.label ?? e.targetId;
|
|
132
|
+
return e.label ? `${label}("${e.label}")` : label;
|
|
133
|
+
});
|
|
134
|
+
lines.push(` out: ${targets.join(", ")}`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
lines.push(" out: (none)");
|
|
138
|
+
}
|
|
139
|
+
if (incoming.length > 0) {
|
|
140
|
+
const sources = incoming.map((e) => {
|
|
141
|
+
const source = page.shapes.get(e.sourceId);
|
|
142
|
+
const label = source?.label ?? e.sourceId;
|
|
143
|
+
return e.label ? `${label}("${e.label}")` : label;
|
|
144
|
+
});
|
|
145
|
+
lines.push(` in: ${sources.join(", ")}`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
lines.push(" in: (none)");
|
|
149
|
+
}
|
|
150
|
+
return lines.join("\n");
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Format a shape description (full details).
|
|
154
|
+
*/
|
|
155
|
+
export function formatDescribe(shape, model) {
|
|
156
|
+
const page = model.getActivePage();
|
|
157
|
+
const theme = reverseThemeLookup(shape.style.fillColor);
|
|
158
|
+
const lines = [];
|
|
159
|
+
lines.push(`${shape.label} (${shape.type})`);
|
|
160
|
+
lines.push(` position: (${shape.bounds.x}, ${shape.bounds.y})`);
|
|
161
|
+
lines.push(` size: ${shape.bounds.width}x${shape.bounds.height}`);
|
|
162
|
+
if (theme)
|
|
163
|
+
lines.push(` theme: ${theme}`);
|
|
164
|
+
if (shape.style.fillColor)
|
|
165
|
+
lines.push(` fill: ${shape.style.fillColor}`);
|
|
166
|
+
if (shape.style.strokeColor)
|
|
167
|
+
lines.push(` stroke: ${shape.style.strokeColor}`);
|
|
168
|
+
if (shape.parentGroup) {
|
|
169
|
+
const group = page.groups.get(shape.parentGroup);
|
|
170
|
+
if (group)
|
|
171
|
+
lines.push(` group: ${group.name}`);
|
|
172
|
+
}
|
|
173
|
+
if (shape.metadata.badges && shape.metadata.badges.length > 0) {
|
|
174
|
+
lines.push(` badges: ${shape.metadata.badges.map((b) => b.text).join(", ")}`);
|
|
175
|
+
}
|
|
176
|
+
const layer = page.layers.find((l) => l.id === shape.layer);
|
|
177
|
+
if (layer)
|
|
178
|
+
lines.push(` layer: ${layer.name}`);
|
|
179
|
+
return lines.join("\n");
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Format stats summary.
|
|
183
|
+
*/
|
|
184
|
+
export function formatStats(model) {
|
|
185
|
+
const page = model.getActivePage();
|
|
186
|
+
const lines = [];
|
|
187
|
+
lines.push(`shapes: ${page.shapes.size}`);
|
|
188
|
+
lines.push(`edges: ${page.edges.size}`);
|
|
189
|
+
lines.push(`groups: ${page.groups.size}`);
|
|
190
|
+
lines.push(`pages: ${model.diagram.pages.length}`);
|
|
191
|
+
return lines.join(", ");
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Format history events.
|
|
195
|
+
*/
|
|
196
|
+
export function formatHistory(events) {
|
|
197
|
+
if (events.length === 0)
|
|
198
|
+
return "No history.";
|
|
199
|
+
return events.map((e) => {
|
|
200
|
+
switch (e.type) {
|
|
201
|
+
case "shape_created": return `+${e.shape.type} ${e.shape.label}`;
|
|
202
|
+
case "shape_modified": return `*modified ${e.id}`;
|
|
203
|
+
case "shape_deleted": return `-${e.shape.label}`;
|
|
204
|
+
case "edge_created": return `~edge ${e.edge.sourceId}->${e.edge.targetId}`;
|
|
205
|
+
case "edge_modified": return `~modified edge ${e.id}`;
|
|
206
|
+
case "edge_deleted": return `-edge ${e.edge.sourceId}->${e.edge.targetId}`;
|
|
207
|
+
case "group_created": return `!group ${e.group.name}`;
|
|
208
|
+
case "group_modified": return `!modified group ${e.id}`;
|
|
209
|
+
case "group_dissolved": return `!ungroup ${e.group.name}`;
|
|
210
|
+
case "page_added": return `+page ${e.page.name}`;
|
|
211
|
+
case "page_removed": return `-page ${e.page.name}`;
|
|
212
|
+
case "checkpoint": return `checkpoint "${e.name}"`;
|
|
213
|
+
}
|
|
214
|
+
}).join("\n");
|
|
215
|
+
}
|
|
216
|
+
function classifyRegion(cx, cy, canvas) {
|
|
217
|
+
const thirdW = canvas.width / 3;
|
|
218
|
+
const thirdH = canvas.height / 3;
|
|
219
|
+
const rx = cx - canvas.x;
|
|
220
|
+
const ry = cy - canvas.y;
|
|
221
|
+
const col = rx < thirdW ? "left" : rx < thirdW * 2 ? "center" : "right";
|
|
222
|
+
const row = ry < thirdH ? "top" : ry < thirdH * 2 ? "middle" : "bottom";
|
|
223
|
+
return `${row}-${col}`;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Infer the dominant flow direction from edge source→target positions.
|
|
227
|
+
* Returns TB/LR/BT/RL or null if undetermined.
|
|
228
|
+
*/
|
|
229
|
+
function inferFlowDirection(model) {
|
|
230
|
+
const page = model.getActivePage();
|
|
231
|
+
if (page.edges.size === 0)
|
|
232
|
+
return null;
|
|
233
|
+
let downCount = 0, upCount = 0, rightCount = 0, leftCount = 0;
|
|
234
|
+
for (const edge of page.edges.values()) {
|
|
235
|
+
const src = page.shapes.get(edge.sourceId);
|
|
236
|
+
const tgt = page.shapes.get(edge.targetId);
|
|
237
|
+
if (!src || !tgt)
|
|
238
|
+
continue;
|
|
239
|
+
const srcCy = src.bounds.y + src.bounds.height / 2;
|
|
240
|
+
const tgtCy = tgt.bounds.y + tgt.bounds.height / 2;
|
|
241
|
+
const srcCx = src.bounds.x + src.bounds.width / 2;
|
|
242
|
+
const tgtCx = tgt.bounds.x + tgt.bounds.width / 2;
|
|
243
|
+
const dy = tgtCy - srcCy;
|
|
244
|
+
const dx = tgtCx - srcCx;
|
|
245
|
+
if (Math.abs(dy) > Math.abs(dx)) {
|
|
246
|
+
if (dy > 0)
|
|
247
|
+
downCount++;
|
|
248
|
+
else
|
|
249
|
+
upCount++;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
if (dx > 0)
|
|
253
|
+
rightCount++;
|
|
254
|
+
else
|
|
255
|
+
leftCount++;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const max = Math.max(downCount, upCount, rightCount, leftCount);
|
|
259
|
+
if (max === 0)
|
|
260
|
+
return null;
|
|
261
|
+
if (max === downCount)
|
|
262
|
+
return "TB";
|
|
263
|
+
if (max === rightCount)
|
|
264
|
+
return "LR";
|
|
265
|
+
if (max === upCount)
|
|
266
|
+
return "BT";
|
|
267
|
+
return "RL";
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Format a spatial map of the diagram.
|
|
271
|
+
* Compact summary: canvas size, flow direction, groups with positions, ungrouped shapes.
|
|
272
|
+
*/
|
|
273
|
+
export function formatMap(model) {
|
|
274
|
+
const page = model.getActivePage();
|
|
275
|
+
const canvas = model.computeCanvasBounds();
|
|
276
|
+
if (!canvas || page.shapes.size === 0) {
|
|
277
|
+
return "map: empty diagram";
|
|
278
|
+
}
|
|
279
|
+
const flow = page.flowDirection ?? inferFlowDirection(model) ?? "TB";
|
|
280
|
+
const canvasW = Math.round(canvas.width);
|
|
281
|
+
const canvasH = Math.round(canvas.height);
|
|
282
|
+
const lines = [];
|
|
283
|
+
lines.push(`map: ${canvasW}x${canvasH} flow:${flow} | ${page.shapes.size}s ${page.edges.size}e ${page.groups.size}g`);
|
|
284
|
+
// Collect grouped shapes
|
|
285
|
+
const groupedShapeIds = new Set();
|
|
286
|
+
const groupEntries = [];
|
|
287
|
+
for (const group of page.groups.values()) {
|
|
288
|
+
const members = [];
|
|
289
|
+
for (const id of group.memberIds) {
|
|
290
|
+
const shape = page.shapes.get(id);
|
|
291
|
+
if (shape) {
|
|
292
|
+
members.push(shape);
|
|
293
|
+
groupedShapeIds.add(id);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const gcx = group.bounds.x + group.bounds.width / 2;
|
|
297
|
+
const gcy = group.bounds.y + group.bounds.height / 2;
|
|
298
|
+
const region = classifyRegion(gcx, gcy, canvas);
|
|
299
|
+
groupEntries.push({
|
|
300
|
+
group,
|
|
301
|
+
shapes: members,
|
|
302
|
+
region,
|
|
303
|
+
sortY: group.bounds.y,
|
|
304
|
+
sortX: group.bounds.x,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
// Collect ungrouped shapes
|
|
308
|
+
const ungrouped = [];
|
|
309
|
+
for (const shape of page.shapes.values()) {
|
|
310
|
+
if (!groupedShapeIds.has(shape.id)) {
|
|
311
|
+
ungrouped.push(shape);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Sort: flow-aware (TB = sort by y then x, LR = sort by x then y)
|
|
315
|
+
const isVertical = flow === "TB" || flow === "BT";
|
|
316
|
+
const sortFn = isVertical
|
|
317
|
+
? (a, b) => a.sortY - b.sortY || a.sortX - b.sortX
|
|
318
|
+
: (a, b) => a.sortX - b.sortX || a.sortY - b.sortY;
|
|
319
|
+
groupEntries.sort(sortFn);
|
|
320
|
+
// Format groups
|
|
321
|
+
for (const entry of groupEntries) {
|
|
322
|
+
const g = entry.group;
|
|
323
|
+
const b = g.bounds;
|
|
324
|
+
lines.push("");
|
|
325
|
+
lines.push(` [${g.name}] ${entry.region} (${Math.round(b.x)},${Math.round(b.y)})-(${Math.round(b.x + b.width)},${Math.round(b.y + b.height)})`);
|
|
326
|
+
// Sort member shapes by position
|
|
327
|
+
const sorted = [...entry.shapes].sort((a, b2) => isVertical
|
|
328
|
+
? a.bounds.y - b2.bounds.y || a.bounds.x - b2.bounds.x
|
|
329
|
+
: a.bounds.x - b2.bounds.x || a.bounds.y - b2.bounds.y);
|
|
330
|
+
// Format members as pipe-separated rows
|
|
331
|
+
const memberStrs = sorted.map((s) => `${s.label}(${s.type}) @(${Math.round(s.bounds.x)},${Math.round(s.bounds.y)})`);
|
|
332
|
+
// Group into rows of up to 3 for readability
|
|
333
|
+
for (let i = 0; i < memberStrs.length; i += 3) {
|
|
334
|
+
const row = memberStrs.slice(i, i + 3).join(" | ");
|
|
335
|
+
lines.push(` ${row}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Format ungrouped shapes
|
|
339
|
+
if (ungrouped.length > 0) {
|
|
340
|
+
const sortedUngrouped = [...ungrouped].sort((a, b2) => isVertical
|
|
341
|
+
? a.bounds.y - b2.bounds.y || a.bounds.x - b2.bounds.x
|
|
342
|
+
: a.bounds.x - b2.bounds.x || a.bounds.y - b2.bounds.y);
|
|
343
|
+
if (groupEntries.length > 0)
|
|
344
|
+
lines.push("");
|
|
345
|
+
for (const s of sortedUngrouped) {
|
|
346
|
+
lines.push(` ${s.label}(${s.type}) @(${Math.round(s.bounds.x)},${Math.round(s.bounds.y)}) — ungrouped`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return lines.join("\n");
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=response-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-formatter.js","sourceRoot":"","sources":["../../src/server/response-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { tokenize, isKeyValue, parseKeyValue } from "../parser/tokenizer.js";
|
|
2
|
+
import { serializeDiagram } from "../serialization/serialize.js";
|
|
3
|
+
import { deserializeDiagram } from "../serialization/deserialize.js";
|
|
4
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
5
|
+
export class SessionHandler {
|
|
6
|
+
model;
|
|
7
|
+
constructor(model) {
|
|
8
|
+
this.model = model;
|
|
9
|
+
}
|
|
10
|
+
dispatch(action) {
|
|
11
|
+
const tokens = tokenize(action);
|
|
12
|
+
if (tokens.length === 0)
|
|
13
|
+
return "Empty action";
|
|
14
|
+
const cmd = tokens[0].toLowerCase();
|
|
15
|
+
switch (cmd) {
|
|
16
|
+
case "new": {
|
|
17
|
+
const title = tokens[1] ?? "Untitled";
|
|
18
|
+
this.model.createNew(title);
|
|
19
|
+
return `new diagram "${title}" created`;
|
|
20
|
+
}
|
|
21
|
+
case "open": {
|
|
22
|
+
const filePath = tokens[1];
|
|
23
|
+
if (!filePath)
|
|
24
|
+
return "open requires a file path";
|
|
25
|
+
try {
|
|
26
|
+
const xml = readFileSync(filePath, "utf-8");
|
|
27
|
+
this.model.diagram = deserializeDiagram(xml);
|
|
28
|
+
this.model.diagram.filePath = filePath;
|
|
29
|
+
if (this.model.diagram.pages.length > 0) {
|
|
30
|
+
this.model.diagram.activePage = this.model.diagram.pages[0].id;
|
|
31
|
+
}
|
|
32
|
+
this.model.rebuildRegistry();
|
|
33
|
+
const page = this.model.getActivePage();
|
|
34
|
+
const parts = [];
|
|
35
|
+
parts.push(`ok: opened "${filePath}" (${this.model.diagram.pages.length} pages, ${page.shapes.size} shapes, ${page.edges.size} edges, ${page.groups.size} groups)`);
|
|
36
|
+
// Canvas and flow info
|
|
37
|
+
const canvasBounds = this.model.computeCanvasBounds();
|
|
38
|
+
if (canvasBounds) {
|
|
39
|
+
const flowDir = page.flowDirection ?? "TB";
|
|
40
|
+
parts.push(`flow:${flowDir} canvas:${Math.round(canvasBounds.width)}x${Math.round(canvasBounds.height)}`);
|
|
41
|
+
}
|
|
42
|
+
// Group summary
|
|
43
|
+
if (page.groups.size > 0) {
|
|
44
|
+
const groupSummary = [...page.groups.values()]
|
|
45
|
+
.map((g) => `${g.name}(${g.memberIds.size})`)
|
|
46
|
+
.join(", ");
|
|
47
|
+
parts.push(`groups: ${groupSummary}`);
|
|
48
|
+
}
|
|
49
|
+
// Ungrouped shapes
|
|
50
|
+
const groupedIds = new Set();
|
|
51
|
+
for (const g of page.groups.values()) {
|
|
52
|
+
for (const id of g.memberIds)
|
|
53
|
+
groupedIds.add(id);
|
|
54
|
+
}
|
|
55
|
+
const ungroupedShapes = [...page.shapes.values()].filter((s) => !groupedIds.has(s.id));
|
|
56
|
+
if (ungroupedShapes.length > 0 && page.groups.size > 0) {
|
|
57
|
+
const ungroupedSummary = ungroupedShapes
|
|
58
|
+
.map((s) => `${s.label}(${s.type})`)
|
|
59
|
+
.join(", ");
|
|
60
|
+
parts.push(`ungrouped: ${ungroupedSummary}`);
|
|
61
|
+
}
|
|
62
|
+
return parts.join("\n");
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return `error: ${e.message}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
case "save": {
|
|
69
|
+
// Parse "as:PATH" param
|
|
70
|
+
let savePath = this.model.diagram.filePath;
|
|
71
|
+
for (const token of tokens.slice(1)) {
|
|
72
|
+
if (isKeyValue(token)) {
|
|
73
|
+
const { key, value } = parseKeyValue(token);
|
|
74
|
+
if (key === "as")
|
|
75
|
+
savePath = value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!savePath)
|
|
79
|
+
return "error: no file path. Use save as:./file.drawio";
|
|
80
|
+
try {
|
|
81
|
+
const xml = serializeDiagram(this.model.diagram);
|
|
82
|
+
writeFileSync(savePath, xml, "utf-8");
|
|
83
|
+
this.model.diagram.filePath = savePath;
|
|
84
|
+
const page = this.model.getActivePage();
|
|
85
|
+
return `ok: saved ${savePath} (${page.shapes.size} shapes, ${page.edges.size} edges, ${page.groups.size} groups)`;
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return `error: ${e.message}`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
case "export":
|
|
92
|
+
return "export not yet implemented (requires draw.io Desktop)";
|
|
93
|
+
case "checkpoint": {
|
|
94
|
+
const name = tokens[1];
|
|
95
|
+
if (!name)
|
|
96
|
+
return "checkpoint requires a name";
|
|
97
|
+
this.model.checkpoint(name);
|
|
98
|
+
return `checkpoint "${name}" created`;
|
|
99
|
+
}
|
|
100
|
+
case "undo": {
|
|
101
|
+
if (tokens[1] === "to:" || (tokens.length >= 2 && tokens[1].startsWith("to:"))) {
|
|
102
|
+
// undo to:NAME
|
|
103
|
+
const name = tokens[1].startsWith("to:") ? tokens[1].slice(3) : tokens[2];
|
|
104
|
+
if (!name)
|
|
105
|
+
return "undo to: requires a checkpoint name";
|
|
106
|
+
const events = this.model.undoTo(name);
|
|
107
|
+
if (!events)
|
|
108
|
+
return `Cannot undo to "${name}"`;
|
|
109
|
+
return `undone ${events.length} events to checkpoint "${name}"`;
|
|
110
|
+
}
|
|
111
|
+
if (!this.model.canUndo())
|
|
112
|
+
return "nothing to undo";
|
|
113
|
+
const events = this.model.undo();
|
|
114
|
+
return `undone ${events.length} event${events.length !== 1 ? "s" : ""}`;
|
|
115
|
+
}
|
|
116
|
+
case "redo": {
|
|
117
|
+
if (!this.model.canRedo())
|
|
118
|
+
return "nothing to redo";
|
|
119
|
+
const events = this.model.redo();
|
|
120
|
+
return `redone ${events.length} event${events.length !== 1 ? "s" : ""}`;
|
|
121
|
+
}
|
|
122
|
+
default:
|
|
123
|
+
return `Unknown session action "${cmd}"`;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=session-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-handler.js","sourceRoot":"","sources":["../../src/server/session-handler.ts"],"names":[],"mappings":"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"}
|