flowspec-mcp 2.1.1 → 3.0.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 (71) hide show
  1. package/dist/analysis/analysisUtils.d.ts +36 -0
  2. package/dist/analysis/analysisUtils.js +284 -0
  3. package/dist/analysis/analysisUtils.js.map +1 -0
  4. package/dist/db.d.ts +68 -0
  5. package/dist/db.js +259 -0
  6. package/dist/db.js.map +1 -1
  7. package/dist/image/dimensions.d.ts +10 -0
  8. package/dist/image/dimensions.js +53 -0
  9. package/dist/image/dimensions.js.map +1 -0
  10. package/dist/import/yamlImporter.d.ts +22 -0
  11. package/dist/import/yamlImporter.js +227 -0
  12. package/dist/import/yamlImporter.js.map +1 -0
  13. package/dist/index.js +0 -0
  14. package/dist/layout/autoLayout.d.ts +19 -0
  15. package/dist/layout/autoLayout.js +85 -0
  16. package/dist/layout/autoLayout.js.map +1 -0
  17. package/dist/layout/semanticLayout.d.ts +24 -0
  18. package/dist/layout/semanticLayout.js +233 -0
  19. package/dist/layout/semanticLayout.js.map +1 -0
  20. package/dist/server.js +26 -2
  21. package/dist/server.js.map +1 -1
  22. package/dist/tools/addRegion.d.ts +69 -0
  23. package/dist/tools/addRegion.js +39 -0
  24. package/dist/tools/addRegion.js.map +1 -0
  25. package/dist/tools/autoLayout.d.ts +27 -0
  26. package/dist/tools/autoLayout.js +52 -0
  27. package/dist/tools/autoLayout.js.map +1 -0
  28. package/dist/tools/captureScreen.d.ts +48 -0
  29. package/dist/tools/captureScreen.js +135 -0
  30. package/dist/tools/captureScreen.js.map +1 -0
  31. package/dist/tools/cloneProject.d.ts +21 -0
  32. package/dist/tools/cloneProject.js +21 -0
  33. package/dist/tools/cloneProject.js.map +1 -0
  34. package/dist/tools/createScreen.d.ts +36 -0
  35. package/dist/tools/createScreen.js +26 -0
  36. package/dist/tools/createScreen.js.map +1 -0
  37. package/dist/tools/deleteScreen.d.ts +24 -0
  38. package/dist/tools/deleteScreen.js +22 -0
  39. package/dist/tools/deleteScreen.js.map +1 -0
  40. package/dist/tools/generateSpec.d.ts +26 -0
  41. package/dist/tools/generateSpec.js +336 -0
  42. package/dist/tools/generateSpec.js.map +1 -0
  43. package/dist/tools/healthCheck.d.ts +8 -0
  44. package/dist/tools/healthCheck.js +16 -0
  45. package/dist/tools/healthCheck.js.map +1 -0
  46. package/dist/tools/importYaml.d.ts +33 -0
  47. package/dist/tools/importYaml.js +97 -0
  48. package/dist/tools/importYaml.js.map +1 -0
  49. package/dist/tools/ingestCodebase.d.ts +27 -0
  50. package/dist/tools/ingestCodebase.js +516 -0
  51. package/dist/tools/ingestCodebase.js.map +1 -0
  52. package/dist/tools/removeRegion.d.ts +27 -0
  53. package/dist/tools/removeRegion.js +23 -0
  54. package/dist/tools/removeRegion.js.map +1 -0
  55. package/dist/tools/smartLayout.d.ts +30 -0
  56. package/dist/tools/smartLayout.js +74 -0
  57. package/dist/tools/smartLayout.js.map +1 -0
  58. package/dist/tools/updateEdge.d.ts +39 -0
  59. package/dist/tools/updateEdge.js +50 -0
  60. package/dist/tools/updateEdge.js.map +1 -0
  61. package/dist/tools/updateRegion.d.ts +72 -0
  62. package/dist/tools/updateRegion.js +35 -0
  63. package/dist/tools/updateRegion.js.map +1 -0
  64. package/dist/tools/updateScreen.d.ts +39 -0
  65. package/dist/tools/updateScreen.js +28 -0
  66. package/dist/tools/updateScreen.js.map +1 -0
  67. package/dist/tools/uploadImage.d.ts +27 -0
  68. package/dist/tools/uploadImage.js +55 -0
  69. package/dist/tools/uploadImage.js.map +1 -0
  70. package/dist/types.d.ts +6 -6
  71. package/package.json +2 -1
@@ -0,0 +1,233 @@
1
+ import nlp from 'compromise';
2
+ // ─── Layout Regions (9-grid system for infinite canvas) ─────────
3
+ const LAYOUT_REGIONS = {
4
+ 'top-left': { x: 0.05, y: 0.05 },
5
+ 'top-center': { x: 0.4, y: 0.05 },
6
+ 'top-right': { x: 0.7, y: 0.05 },
7
+ 'center-left': { x: 0.05, y: 0.4 },
8
+ 'center': { x: 0.4, y: 0.4 },
9
+ 'center-right': { x: 0.7, y: 0.4 },
10
+ 'bottom-left': { x: 0.05, y: 0.7 },
11
+ 'bottom-center': { x: 0.4, y: 0.7 },
12
+ 'bottom-right': { x: 0.7, y: 0.7 }
13
+ };
14
+ // Aliases for natural language
15
+ const REGION_ALIASES = {
16
+ 'top': 'top-center',
17
+ 'bottom': 'bottom-center',
18
+ 'left': 'center-left',
19
+ 'right': 'center-right',
20
+ 'upper-left': 'top-left',
21
+ 'upper-right': 'top-right',
22
+ 'lower-left': 'bottom-left',
23
+ 'lower-right': 'bottom-right',
24
+ 'middle': 'center'
25
+ };
26
+ // ─── Natural Language Parsing ────────────────────────────────────
27
+ export function parseNaturalLanguageLayout(command, nodes, canvasBounds) {
28
+ const doc = nlp(command.toLowerCase());
29
+ // Extract action verb (move, arrange, cluster, position)
30
+ const verbs = doc.verbs().out('array');
31
+ const action = verbs[0] ?? 'move';
32
+ // Extract target nodes (by label matching)
33
+ const nodeMatches = extractNodeReferences(command, nodes);
34
+ if (nodeMatches.length === 0) {
35
+ return {
36
+ error: `No matching nodes found. Command: "${command}". Try specifying node labels explicitly (e.g., "move user auth nodes to top-right").`
37
+ };
38
+ }
39
+ // Extract target region
40
+ const region = extractTargetRegion(command);
41
+ if (!region) {
42
+ return {
43
+ error: `No target region found. Supported regions: ${Object.keys(LAYOUT_REGIONS).join(', ')}. Command: "${command}".`
44
+ };
45
+ }
46
+ // Extract arrangement style (vertical, horizontal, grid, cluster)
47
+ const arrangement = extractArrangement(command);
48
+ const direction = extractDirection(command);
49
+ // Convert region to absolute coordinates
50
+ const relativePos = LAYOUT_REGIONS[region];
51
+ const targetBounds = {
52
+ x: relativePos.x * canvasBounds.width,
53
+ y: relativePos.y * canvasBounds.height,
54
+ width: canvasBounds.width * 0.25, // 25% of canvas for layout region
55
+ height: canvasBounds.height * 0.25
56
+ };
57
+ return {
58
+ nodeIds: nodeMatches,
59
+ targetBounds,
60
+ arrangement,
61
+ direction
62
+ };
63
+ }
64
+ function extractNodeReferences(command, nodes) {
65
+ const matches = [];
66
+ // Extract potential node label keywords (nouns, adjectives)
67
+ const doc = nlp(command);
68
+ const keywords = [
69
+ ...doc.nouns().out('array'),
70
+ ...doc.adjectives().out('array')
71
+ ];
72
+ // Match keywords against node labels (fuzzy matching)
73
+ for (const node of nodes) {
74
+ const label = (node.data?.label ?? '').toLowerCase();
75
+ if (!label)
76
+ continue;
77
+ // Check if any keyword appears in label
78
+ for (const keyword of keywords) {
79
+ if (label.includes(keyword) || keyword.includes(label)) {
80
+ matches.push(node.id);
81
+ break;
82
+ }
83
+ }
84
+ }
85
+ return [...new Set(matches)]; // Deduplicate
86
+ }
87
+ function extractTargetRegion(command) {
88
+ const lowerCommand = command.toLowerCase();
89
+ // Check for explicit region names
90
+ for (const [alias, canonical] of Object.entries(REGION_ALIASES)) {
91
+ if (lowerCommand.includes(alias)) {
92
+ return canonical;
93
+ }
94
+ }
95
+ for (const region of Object.keys(LAYOUT_REGIONS)) {
96
+ if (lowerCommand.includes(region)) {
97
+ return region;
98
+ }
99
+ }
100
+ // Pattern matching: "to the <direction>"
101
+ if (lowerCommand.includes('to the top'))
102
+ return 'top-center';
103
+ if (lowerCommand.includes('to the bottom'))
104
+ return 'bottom-center';
105
+ if (lowerCommand.includes('to the left'))
106
+ return 'center-left';
107
+ if (lowerCommand.includes('to the right'))
108
+ return 'center-right';
109
+ // Pattern matching: "in the <region>"
110
+ if (lowerCommand.includes('in the top left'))
111
+ return 'top-left';
112
+ if (lowerCommand.includes('in the top right'))
113
+ return 'top-right';
114
+ if (lowerCommand.includes('in the bottom left'))
115
+ return 'bottom-left';
116
+ if (lowerCommand.includes('in the bottom right'))
117
+ return 'bottom-right';
118
+ if (lowerCommand.includes('in the center'))
119
+ return 'center';
120
+ return null;
121
+ }
122
+ function extractArrangement(command) {
123
+ const lowerCommand = command.toLowerCase();
124
+ if (lowerCommand.includes('stack') || lowerCommand.includes('column') || lowerCommand.includes('row')) {
125
+ return 'stack';
126
+ }
127
+ if (lowerCommand.includes('grid')) {
128
+ return 'grid';
129
+ }
130
+ if (lowerCommand.includes('flow')) {
131
+ return 'flow';
132
+ }
133
+ if (lowerCommand.includes('cluster') || lowerCommand.includes('group')) {
134
+ return 'cluster';
135
+ }
136
+ // Default: stack for small groups, grid for larger
137
+ return 'stack';
138
+ }
139
+ function extractDirection(command) {
140
+ const lowerCommand = command.toLowerCase();
141
+ if (lowerCommand.includes('vertical') || lowerCommand.includes('vertically') || lowerCommand.includes('column')) {
142
+ return 'vertical';
143
+ }
144
+ if (lowerCommand.includes('horizontal') || lowerCommand.includes('horizontally') || lowerCommand.includes('row')) {
145
+ return 'horizontal';
146
+ }
147
+ return undefined; // Let arrangement logic decide
148
+ }
149
+ // ─── Apply Semantic Layout ───────────────────────────────────────
150
+ export function applySemanticLayout(nodes, edges, command) {
151
+ const positions = new Map();
152
+ const targetNodes = nodes.filter((n) => command.nodeIds.includes(n.id));
153
+ if (targetNodes.length === 0)
154
+ return positions;
155
+ const { targetBounds, arrangement, direction } = command;
156
+ switch (arrangement) {
157
+ case 'stack': {
158
+ // Stack vertically or horizontally
159
+ const isVertical = direction === 'vertical' || direction === undefined;
160
+ const spacing = 60;
161
+ targetNodes.forEach((node, index) => {
162
+ if (isVertical) {
163
+ positions.set(node.id, {
164
+ x: targetBounds.x,
165
+ y: targetBounds.y + index * spacing
166
+ });
167
+ }
168
+ else {
169
+ positions.set(node.id, {
170
+ x: targetBounds.x + index * spacing,
171
+ y: targetBounds.y
172
+ });
173
+ }
174
+ });
175
+ break;
176
+ }
177
+ case 'grid': {
178
+ // Arrange in a grid (3 columns max)
179
+ const cols = Math.min(3, Math.ceil(Math.sqrt(targetNodes.length)));
180
+ const spacing = 80;
181
+ targetNodes.forEach((node, index) => {
182
+ const col = index % cols;
183
+ const row = Math.floor(index / cols);
184
+ positions.set(node.id, {
185
+ x: targetBounds.x + col * spacing,
186
+ y: targetBounds.y + row * spacing
187
+ });
188
+ });
189
+ break;
190
+ }
191
+ case 'flow': {
192
+ // Flow layout (left-to-right, wrapping)
193
+ const maxWidth = targetBounds.width;
194
+ const spacing = 70;
195
+ let currentX = targetBounds.x;
196
+ let currentY = targetBounds.y;
197
+ for (const node of targetNodes) {
198
+ positions.set(node.id, { x: currentX, y: currentY });
199
+ currentX += spacing;
200
+ if (currentX - targetBounds.x > maxWidth) {
201
+ currentX = targetBounds.x;
202
+ currentY += spacing;
203
+ }
204
+ }
205
+ break;
206
+ }
207
+ case 'cluster': {
208
+ // Cluster in a compact circle/ellipse
209
+ const centerX = targetBounds.x + targetBounds.width / 2;
210
+ const centerY = targetBounds.y + targetBounds.height / 2;
211
+ const radius = Math.min(targetBounds.width, targetBounds.height) / 3;
212
+ targetNodes.forEach((node, index) => {
213
+ const angle = (index / targetNodes.length) * 2 * Math.PI;
214
+ positions.set(node.id, {
215
+ x: centerX + radius * Math.cos(angle),
216
+ y: centerY + radius * Math.sin(angle)
217
+ });
218
+ });
219
+ break;
220
+ }
221
+ }
222
+ return positions;
223
+ }
224
+ // ─── Supported Commands (for tool description) ───────────────────
225
+ export const SUPPORTED_COMMANDS = [
226
+ 'move <nodes> to <region>',
227
+ 'arrange <nodes> vertically/horizontally in <region>',
228
+ 'cluster <nodes> in <region>',
229
+ 'position <nodes> at <region>',
230
+ 'stack <nodes> in <region>'
231
+ ];
232
+ export const SUPPORTED_REGIONS = Object.keys(LAYOUT_REGIONS);
233
+ //# sourceMappingURL=semanticLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semanticLayout.js","sourceRoot":"","sources":["../../src/layout/semanticLayout.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -14,11 +14,23 @@ import { deleteNodeSchema, handleDeleteNode } from './tools/deleteNode.js';
14
14
  import { createEdgeSchema, handleCreateEdge } from './tools/createEdge.js';
15
15
  import { deleteEdgeSchema, handleDeleteEdge } from './tools/deleteEdge.js';
16
16
  import { analyseProjectSchema, handleAnalyseProject } from './tools/analyseProject.js';
17
+ // v3 write tools
18
+ import { importYamlSchema, handleImportYaml } from './tools/importYaml.js';
19
+ import { autoLayoutSchema, handleAutoLayout } from './tools/autoLayout.js';
20
+ import { uploadImageSchema, handleUploadImage } from './tools/uploadImage.js';
21
+ import { createScreenSchema, handleCreateScreen } from './tools/createScreen.js';
22
+ import { updateScreenSchema, handleUpdateScreen } from './tools/updateScreen.js';
23
+ import { deleteScreenSchema, handleDeleteScreen } from './tools/deleteScreen.js';
24
+ import { addRegionSchema, handleAddRegion } from './tools/addRegion.js';
25
+ import { updateRegionSchema, handleUpdateRegion } from './tools/updateRegion.js';
26
+ import { removeRegionSchema, handleRemoveRegion } from './tools/removeRegion.js';
27
+ import { updateEdgeSchema, handleUpdateEdge } from './tools/updateEdge.js';
28
+ import { cloneProjectSchema, handleCloneProject } from './tools/cloneProject.js';
17
29
  import { MODE } from './config.js';
18
30
  export function createServer() {
19
31
  const server = new McpServer({
20
32
  name: 'flowspec',
21
- version: '2.1.1',
33
+ version: '3.0.0',
22
34
  });
23
35
  // ─── Read tools ──────────────────────────────────────────────────
24
36
  server.tool('flowspec_list_projects', 'List all FlowSpec projects with names and dates', listProjectsSchema.shape, handleListProjects);
@@ -36,7 +48,19 @@ export function createServer() {
36
48
  server.tool('flowspec_create_edge', 'Connect two nodes with an edge type (flows-to, derives-from, transforms, validates, contains)', createEdgeSchema.shape, handleCreateEdge);
37
49
  server.tool('flowspec_delete_edge', 'Remove an edge from a project', deleteEdgeSchema.shape, handleDeleteEdge);
38
50
  server.tool('flowspec_analyse_project', 'Run orphan node and duplicate label analysis on a project', analyseProjectSchema.shape, handleAnalyseProject);
39
- console.error(`FlowSpec MCP v2.1.1 mode: ${MODE}`);
51
+ // ─── Write tools (v3) ────────────────────────────────────────────
52
+ server.tool('flowspec_import_yaml', 'Import YAML specification to create/merge nodes, edges, and screens', importYamlSchema.shape, handleImportYaml);
53
+ server.tool('flowspec_auto_layout', 'Apply automatic hierarchical layout (Dagre) to organize nodes', autoLayoutSchema.shape, handleAutoLayout);
54
+ server.tool('flowspec_upload_image', 'Upload an image and get its URL with auto-detected dimensions', uploadImageSchema.shape, handleUploadImage);
55
+ server.tool('flowspec_create_screen', 'Create a new wireframe screen with optional image', createScreenSchema.shape, handleCreateScreen);
56
+ server.tool('flowspec_update_screen', 'Update screen properties (name, image)', updateScreenSchema.shape, handleUpdateScreen);
57
+ server.tool('flowspec_delete_screen', 'Delete a wireframe screen and all its regions', deleteScreenSchema.shape, handleDeleteScreen);
58
+ server.tool('flowspec_add_region', 'Add a region to a screen with % coordinates and element IDs', addRegionSchema.shape, handleAddRegion);
59
+ server.tool('flowspec_update_region', 'Update region position, size, label, or element IDs', updateRegionSchema.shape, handleUpdateRegion);
60
+ server.tool('flowspec_remove_region', 'Remove a region from a screen', removeRegionSchema.shape, handleRemoveRegion);
61
+ server.tool('flowspec_update_edge', 'Update edge type, label, or handle positions', updateEdgeSchema.shape, handleUpdateEdge);
62
+ server.tool('flowspec_clone_project', 'Clone a project for backup or branching', cloneProjectSchema.shape, handleCloneProject);
63
+ console.error(`FlowSpec MCP v3.0.0 — mode: ${MODE}`);
40
64
  return server;
41
65
  }
42
66
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ export declare const addRegionSchema: z.ZodObject<{
3
+ projectId: z.ZodString;
4
+ screenId: z.ZodString;
5
+ label: z.ZodOptional<z.ZodString>;
6
+ position: z.ZodObject<{
7
+ x: z.ZodNumber;
8
+ y: z.ZodNumber;
9
+ }, "strip", z.ZodTypeAny, {
10
+ x: number;
11
+ y: number;
12
+ }, {
13
+ x: number;
14
+ y: number;
15
+ }>;
16
+ size: z.ZodObject<{
17
+ width: z.ZodNumber;
18
+ height: z.ZodNumber;
19
+ }, "strip", z.ZodTypeAny, {
20
+ width: number;
21
+ height: number;
22
+ }, {
23
+ width: number;
24
+ height: number;
25
+ }>;
26
+ elementIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
27
+ componentNodeId: z.ZodOptional<z.ZodString>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ position: {
30
+ x: number;
31
+ y: number;
32
+ };
33
+ size: {
34
+ width: number;
35
+ height: number;
36
+ };
37
+ projectId: string;
38
+ screenId: string;
39
+ label?: string | undefined;
40
+ elementIds?: string[] | undefined;
41
+ componentNodeId?: string | undefined;
42
+ }, {
43
+ position: {
44
+ x: number;
45
+ y: number;
46
+ };
47
+ size: {
48
+ width: number;
49
+ height: number;
50
+ };
51
+ projectId: string;
52
+ screenId: string;
53
+ label?: string | undefined;
54
+ elementIds?: string[] | undefined;
55
+ componentNodeId?: string | undefined;
56
+ }>;
57
+ export declare function handleAddRegion(args: z.infer<typeof addRegionSchema>): Promise<{
58
+ content: {
59
+ type: "text";
60
+ text: string;
61
+ }[];
62
+ isError: boolean;
63
+ } | {
64
+ content: {
65
+ type: "text";
66
+ text: string;
67
+ }[];
68
+ isError?: undefined;
69
+ }>;
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { addRegionViaApi } from '../db.js';
3
+ export const addRegionSchema = z.object({
4
+ projectId: z.string().describe('UUID of the project'),
5
+ screenId: z.string().describe('UUID of the screen'),
6
+ label: z.string().optional().describe('Region label (e.g. "Login Form")'),
7
+ position: z.object({
8
+ x: z.number().describe('Left edge, percentage 0-100'),
9
+ y: z.number().describe('Top edge, percentage 0-100'),
10
+ }).describe('Top-left corner position in percentage coordinates'),
11
+ size: z.object({
12
+ width: z.number().describe('Width, percentage 0-100'),
13
+ height: z.number().describe('Height, percentage 0-100'),
14
+ }).describe('Region size in percentage coordinates'),
15
+ elementIds: z.array(z.string()).optional().describe('Canvas node IDs linked to this region'),
16
+ componentNodeId: z.string().optional().describe('Component node ID when region is promoted'),
17
+ });
18
+ export async function handleAddRegion(args) {
19
+ const region = await addRegionViaApi(args.projectId, args.screenId, {
20
+ label: args.label,
21
+ position: args.position,
22
+ size: args.size,
23
+ elementIds: args.elementIds,
24
+ componentNodeId: args.componentNodeId,
25
+ });
26
+ if (!region) {
27
+ return {
28
+ content: [{ type: 'text', text: `Failed to add region — project or screen not found` }],
29
+ isError: true,
30
+ };
31
+ }
32
+ return {
33
+ content: [{
34
+ type: 'text',
35
+ text: `Added region **${region.label ?? region.id}** to screen (id: ${region.id})`,
36
+ }],
37
+ };
38
+ }
39
+ //# sourceMappingURL=addRegion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addRegion.js","sourceRoot":"","sources":["../../src/tools/addRegion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACrD,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACrD,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACxD,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACpD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IAC5F,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CAC7F,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAqC;IACzE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;QAClE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oDAAoD,EAAE,CAAC;YAChG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,kBAAkB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,qBAAqB,MAAM,CAAC,EAAE,GAAG;aACnF,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ export declare const autoLayoutSchema: z.ZodObject<{
3
+ projectId: z.ZodString;
4
+ direction: z.ZodOptional<z.ZodEnum<["TB", "BT", "LR", "RL"]>>;
5
+ pinnedNodeIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ projectId: string;
8
+ direction?: "TB" | "BT" | "LR" | "RL" | undefined;
9
+ pinnedNodeIds?: string[] | undefined;
10
+ }, {
11
+ projectId: string;
12
+ direction?: "TB" | "BT" | "LR" | "RL" | undefined;
13
+ pinnedNodeIds?: string[] | undefined;
14
+ }>;
15
+ export declare function handleAutoLayout(args: z.infer<typeof autoLayoutSchema>): Promise<{
16
+ content: {
17
+ type: "text";
18
+ text: string;
19
+ }[];
20
+ isError: boolean;
21
+ } | {
22
+ content: {
23
+ type: "text";
24
+ text: string;
25
+ }[];
26
+ isError?: undefined;
27
+ }>;
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ import { getProject, updateProjectViaApi } from '../db.js';
3
+ import { computeAutoLayout } from '../layout/autoLayout.js';
4
+ export const autoLayoutSchema = z.object({
5
+ projectId: z.string().describe('UUID of the project'),
6
+ direction: z.enum(['TB', 'BT', 'LR', 'RL']).optional().describe('Layout direction (default: TB — top-to-bottom)'),
7
+ pinnedNodeIds: z.array(z.string()).optional().describe('Node IDs to keep in their current positions'),
8
+ });
9
+ export async function handleAutoLayout(args) {
10
+ const project = await getProject(args.projectId);
11
+ if (!project) {
12
+ return {
13
+ content: [{ type: 'text', text: `Project not found: ${args.projectId}` }],
14
+ isError: true,
15
+ };
16
+ }
17
+ const nodes = project.canvas_state.nodes ?? [];
18
+ const edges = project.canvas_state.edges ?? [];
19
+ if (nodes.length === 0) {
20
+ return {
21
+ content: [{ type: 'text', text: 'No nodes to layout' }],
22
+ };
23
+ }
24
+ const direction = args.direction ?? 'TB';
25
+ const pinnedNodeIds = new Set(args.pinnedNodeIds ?? []);
26
+ const positions = computeAutoLayout(nodes, edges, { rankdir: direction, pinnedNodeIds });
27
+ // Apply positions to nodes
28
+ let movedCount = 0;
29
+ for (const node of nodes) {
30
+ const pos = positions.get(node.id);
31
+ if (pos) {
32
+ node.position = pos;
33
+ movedCount++;
34
+ }
35
+ }
36
+ const updated = await updateProjectViaApi(args.projectId, {
37
+ canvas_state: project.canvas_state,
38
+ });
39
+ if (!updated) {
40
+ return {
41
+ content: [{ type: 'text', text: `Failed to save layout changes` }],
42
+ isError: true,
43
+ };
44
+ }
45
+ return {
46
+ content: [{
47
+ type: 'text',
48
+ text: `Auto-layout complete — repositioned ${movedCount} nodes (direction: ${direction}, pinned: ${pinnedNodeIds.size})`,
49
+ }],
50
+ };
51
+ }
52
+ //# sourceMappingURL=autoLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoLayout.js","sourceRoot":"","sources":["../../src/tools/autoLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACrD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IACjH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;CACtG,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsC;IAC3E,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sBAAsB,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAClF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;IAE/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;IACzC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IAEzF,2BAA2B;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE;QACxD,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC;YAC3E,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,uCAAuC,UAAU,sBAAsB,SAAS,aAAa,aAAa,CAAC,IAAI,GAAG;aACzH,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ export declare const captureScreenSchema: z.ZodObject<{
3
+ url: z.ZodString;
4
+ selector: z.ZodOptional<z.ZodString>;
5
+ viewport: z.ZodOptional<z.ZodObject<{
6
+ width: z.ZodNumber;
7
+ height: z.ZodNumber;
8
+ }, "strip", z.ZodTypeAny, {
9
+ width: number;
10
+ height: number;
11
+ }, {
12
+ width: number;
13
+ height: number;
14
+ }>>;
15
+ waitFor: z.ZodOptional<z.ZodString>;
16
+ fullPage: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ url: string;
19
+ fullPage: boolean;
20
+ selector?: string | undefined;
21
+ viewport?: {
22
+ width: number;
23
+ height: number;
24
+ } | undefined;
25
+ waitFor?: string | undefined;
26
+ }, {
27
+ url: string;
28
+ selector?: string | undefined;
29
+ viewport?: {
30
+ width: number;
31
+ height: number;
32
+ } | undefined;
33
+ waitFor?: string | undefined;
34
+ fullPage?: boolean | undefined;
35
+ }>;
36
+ export declare function handleCaptureScreen(args: z.infer<typeof captureScreenSchema>): Promise<{
37
+ content: {
38
+ type: "text";
39
+ text: string;
40
+ }[];
41
+ isError: boolean;
42
+ } | {
43
+ content: {
44
+ type: "text";
45
+ text: string;
46
+ }[];
47
+ isError?: undefined;
48
+ }>;