@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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/adapter.d.ts +38 -0
  4. package/dist/adapter.js +259 -0
  5. package/dist/adapter.js.map +1 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/layout/elk-layout.d.ts +49 -0
  10. package/dist/layout/elk-layout.js +144 -0
  11. package/dist/layout/elk-layout.js.map +1 -0
  12. package/dist/lib/drawio-cli.d.ts +22 -0
  13. package/dist/lib/drawio-cli.js +88 -0
  14. package/dist/lib/drawio-cli.js.map +1 -0
  15. package/dist/lib/node-types.d.ts +22 -0
  16. package/dist/lib/node-types.js +174 -0
  17. package/dist/lib/node-types.js.map +1 -0
  18. package/dist/lib/stencils/aws.d.ts +2 -0
  19. package/dist/lib/stencils/aws.js +69 -0
  20. package/dist/lib/stencils/aws.js.map +1 -0
  21. package/dist/lib/stencils/azure.d.ts +2 -0
  22. package/dist/lib/stencils/azure.js +54 -0
  23. package/dist/lib/stencils/azure.js.map +1 -0
  24. package/dist/lib/stencils/cisco.d.ts +2 -0
  25. package/dist/lib/stencils/cisco.js +30 -0
  26. package/dist/lib/stencils/cisco.js.map +1 -0
  27. package/dist/lib/stencils/gcp.d.ts +2 -0
  28. package/dist/lib/stencils/gcp.js +38 -0
  29. package/dist/lib/stencils/gcp.js.map +1 -0
  30. package/dist/lib/stencils/ibm.d.ts +2 -0
  31. package/dist/lib/stencils/ibm.js +32 -0
  32. package/dist/lib/stencils/ibm.js.map +1 -0
  33. package/dist/lib/stencils/index.d.ts +10 -0
  34. package/dist/lib/stencils/index.js +33 -0
  35. package/dist/lib/stencils/index.js.map +1 -0
  36. package/dist/lib/stencils/k8s.d.ts +2 -0
  37. package/dist/lib/stencils/k8s.js +32 -0
  38. package/dist/lib/stencils/k8s.js.map +1 -0
  39. package/dist/lib/stencils/types.d.ts +14 -0
  40. package/dist/lib/stencils/types.js +2 -0
  41. package/dist/lib/stencils/types.js.map +1 -0
  42. package/dist/lib/themes.d.ts +8 -0
  43. package/dist/lib/themes.js +32 -0
  44. package/dist/lib/themes.js.map +1 -0
  45. package/dist/model/defaults.d.ts +3 -0
  46. package/dist/model/defaults.js +26 -0
  47. package/dist/model/defaults.js.map +1 -0
  48. package/dist/model/diagram-model.d.ts +110 -0
  49. package/dist/model/diagram-model.js +938 -0
  50. package/dist/model/diagram-model.js.map +1 -0
  51. package/dist/model/event-log.d.ts +30 -0
  52. package/dist/model/event-log.js +112 -0
  53. package/dist/model/event-log.js.map +1 -0
  54. package/dist/model/id.d.ts +9 -0
  55. package/dist/model/id.js +35 -0
  56. package/dist/model/id.js.map +1 -0
  57. package/dist/model/reference-registry.d.ts +33 -0
  58. package/dist/model/reference-registry.js +143 -0
  59. package/dist/model/reference-registry.js.map +1 -0
  60. package/dist/model/spatial.d.ts +20 -0
  61. package/dist/model/spatial.js +59 -0
  62. package/dist/model/spatial.js.map +1 -0
  63. package/dist/parser/parse-op.d.ts +18 -0
  64. package/dist/parser/parse-op.js +430 -0
  65. package/dist/parser/parse-op.js.map +1 -0
  66. package/dist/parser/resolve-ref.d.ts +27 -0
  67. package/dist/parser/resolve-ref.js +232 -0
  68. package/dist/parser/resolve-ref.js.map +1 -0
  69. package/dist/parser/tokenizer.d.ts +6 -0
  70. package/dist/parser/tokenizer.js +7 -0
  71. package/dist/parser/tokenizer.js.map +1 -0
  72. package/dist/serialization/connector-intelligence.d.ts +35 -0
  73. package/dist/serialization/connector-intelligence.js +336 -0
  74. package/dist/serialization/connector-intelligence.js.map +1 -0
  75. package/dist/serialization/deserialize.d.ts +6 -0
  76. package/dist/serialization/deserialize.js +511 -0
  77. package/dist/serialization/deserialize.js.map +1 -0
  78. package/dist/serialization/serialize.d.ts +15 -0
  79. package/dist/serialization/serialize.js +332 -0
  80. package/dist/serialization/serialize.js.map +1 -0
  81. package/dist/server/intent-layer.d.ts +48 -0
  82. package/dist/server/intent-layer.js +1322 -0
  83. package/dist/server/intent-layer.js.map +1 -0
  84. package/dist/server/mcp-server.d.ts +7 -0
  85. package/dist/server/mcp-server.js +26 -0
  86. package/dist/server/mcp-server.js.map +1 -0
  87. package/dist/server/model-map.d.ts +8 -0
  88. package/dist/server/model-map.js +240 -0
  89. package/dist/server/model-map.js.map +1 -0
  90. package/dist/server/query-handler.d.ts +19 -0
  91. package/dist/server/query-handler.js +148 -0
  92. package/dist/server/query-handler.js.map +1 -0
  93. package/dist/server/response-formatter.d.ts +56 -0
  94. package/dist/server/response-formatter.js +351 -0
  95. package/dist/server/response-formatter.js.map +1 -0
  96. package/dist/server/session-handler.d.ts +6 -0
  97. package/dist/server/session-handler.js +127 -0
  98. package/dist/server/session-handler.js.map +1 -0
  99. package/dist/types/index.d.ts +238 -0
  100. package/dist/types/index.js +3 -0
  101. package/dist/types/index.js.map +1 -0
  102. package/dist/verb-specs.d.ts +6 -0
  103. package/dist/verb-specs.js +144 -0
  104. package/dist/verb-specs.js.map +1 -0
  105. 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,6 @@
1
+ import { DiagramModel } from "../model/diagram-model.js";
2
+ export declare class SessionHandler {
3
+ private model;
4
+ constructor(model: DiagramModel);
5
+ dispatch(action: string): string;
6
+ }
@@ -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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"}