@hiabhee/archdraw-mcp-server 1.0.2

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 (109) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +745 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/__tests__/constants.test.d.ts +2 -0
  6. package/dist/lib/__tests__/constants.test.d.ts.map +1 -0
  7. package/dist/lib/__tests__/constants.test.js +47 -0
  8. package/dist/lib/__tests__/constants.test.js.map +1 -0
  9. package/dist/lib/__tests__/diagram-state.test.d.ts +2 -0
  10. package/dist/lib/__tests__/diagram-state.test.d.ts.map +1 -0
  11. package/dist/lib/__tests__/diagram-state.test.js +82 -0
  12. package/dist/lib/__tests__/diagram-state.test.js.map +1 -0
  13. package/dist/lib/__tests__/elk-runner.test.d.ts +2 -0
  14. package/dist/lib/__tests__/elk-runner.test.d.ts.map +1 -0
  15. package/dist/lib/__tests__/elk-runner.test.js +87 -0
  16. package/dist/lib/__tests__/elk-runner.test.js.map +1 -0
  17. package/dist/lib/checkpoints.d.ts +48 -0
  18. package/dist/lib/checkpoints.d.ts.map +1 -0
  19. package/dist/lib/checkpoints.js +67 -0
  20. package/dist/lib/checkpoints.js.map +1 -0
  21. package/dist/lib/constants.d.ts +29 -0
  22. package/dist/lib/constants.d.ts.map +1 -0
  23. package/dist/lib/constants.js +62 -0
  24. package/dist/lib/constants.js.map +1 -0
  25. package/dist/lib/diagram-state.d.ts +24 -0
  26. package/dist/lib/diagram-state.d.ts.map +1 -0
  27. package/dist/lib/diagram-state.js +59 -0
  28. package/dist/lib/diagram-state.js.map +1 -0
  29. package/dist/lib/elk-runner.d.ts +29 -0
  30. package/dist/lib/elk-runner.d.ts.map +1 -0
  31. package/dist/lib/elk-runner.js +532 -0
  32. package/dist/lib/elk-runner.js.map +1 -0
  33. package/dist/lib/http.d.ts +3 -0
  34. package/dist/lib/http.d.ts.map +1 -0
  35. package/dist/lib/http.js +13 -0
  36. package/dist/lib/http.js.map +1 -0
  37. package/dist/lib/node-catalog.d.ts +10 -0
  38. package/dist/lib/node-catalog.d.ts.map +1 -0
  39. package/dist/lib/node-catalog.js +122 -0
  40. package/dist/lib/node-catalog.js.map +1 -0
  41. package/dist/lib/parse-prompt.d.ts +26 -0
  42. package/dist/lib/parse-prompt.d.ts.map +1 -0
  43. package/dist/lib/parse-prompt.js +289 -0
  44. package/dist/lib/parse-prompt.js.map +1 -0
  45. package/dist/lib/prompt-builder.d.ts +14 -0
  46. package/dist/lib/prompt-builder.d.ts.map +1 -0
  47. package/dist/lib/prompt-builder.js +133 -0
  48. package/dist/lib/prompt-builder.js.map +1 -0
  49. package/dist/lib/schema.d.ts +1240 -0
  50. package/dist/lib/schema.d.ts.map +1 -0
  51. package/dist/lib/schema.js +261 -0
  52. package/dist/lib/schema.js.map +1 -0
  53. package/dist/server.d.ts +36 -0
  54. package/dist/server.d.ts.map +1 -0
  55. package/dist/server.js +287 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/tools/__tests__/export-diagram.test.d.ts +2 -0
  58. package/dist/tools/__tests__/export-diagram.test.d.ts.map +1 -0
  59. package/dist/tools/__tests__/export-diagram.test.js +40 -0
  60. package/dist/tools/__tests__/export-diagram.test.js.map +1 -0
  61. package/dist/tools/__tests__/update-diagram.test.d.ts +2 -0
  62. package/dist/tools/__tests__/update-diagram.test.d.ts.map +1 -0
  63. package/dist/tools/__tests__/update-diagram.test.js +98 -0
  64. package/dist/tools/__tests__/update-diagram.test.js.map +1 -0
  65. package/dist/tools/apply-template.d.ts +29 -0
  66. package/dist/tools/apply-template.d.ts.map +1 -0
  67. package/dist/tools/apply-template.js +392 -0
  68. package/dist/tools/apply-template.js.map +1 -0
  69. package/dist/tools/export-diagram.d.ts +36 -0
  70. package/dist/tools/export-diagram.d.ts.map +1 -0
  71. package/dist/tools/export-diagram.js +65 -0
  72. package/dist/tools/export-diagram.js.map +1 -0
  73. package/dist/tools/fix-layout.d.ts +23 -0
  74. package/dist/tools/fix-layout.d.ts.map +1 -0
  75. package/dist/tools/fix-layout.js +39 -0
  76. package/dist/tools/fix-layout.js.map +1 -0
  77. package/dist/tools/generate-diagram.d.ts +32 -0
  78. package/dist/tools/generate-diagram.d.ts.map +1 -0
  79. package/dist/tools/generate-diagram.js +325 -0
  80. package/dist/tools/generate-diagram.js.map +1 -0
  81. package/dist/tools/list-nodes.d.ts +18 -0
  82. package/dist/tools/list-nodes.d.ts.map +1 -0
  83. package/dist/tools/list-nodes.js +48 -0
  84. package/dist/tools/list-nodes.js.map +1 -0
  85. package/dist/tools/load-checkpoint.d.ts +18 -0
  86. package/dist/tools/load-checkpoint.d.ts.map +1 -0
  87. package/dist/tools/load-checkpoint.js +24 -0
  88. package/dist/tools/load-checkpoint.js.map +1 -0
  89. package/dist/tools/read-me.d.ts +2 -0
  90. package/dist/tools/read-me.d.ts.map +1 -0
  91. package/dist/tools/read-me.js +14 -0
  92. package/dist/tools/read-me.js.map +1 -0
  93. package/dist/tools/save-checkpoint.d.ts +11 -0
  94. package/dist/tools/save-checkpoint.d.ts.map +1 -0
  95. package/dist/tools/save-checkpoint.js +17 -0
  96. package/dist/tools/save-checkpoint.js.map +1 -0
  97. package/dist/tools/update-diagram.d.ts +20 -0
  98. package/dist/tools/update-diagram.d.ts.map +1 -0
  99. package/dist/tools/update-diagram.js +217 -0
  100. package/dist/tools/update-diagram.js.map +1 -0
  101. package/dist/tools/validate-diagram.d.ts +16 -0
  102. package/dist/tools/validate-diagram.d.ts.map +1 -0
  103. package/dist/tools/validate-diagram.js +204 -0
  104. package/dist/tools/validate-diagram.js.map +1 -0
  105. package/dist/types/index.d.ts +218 -0
  106. package/dist/types/index.d.ts.map +1 -0
  107. package/dist/types/index.js +2 -0
  108. package/dist/types/index.js.map +1 -0
  109. package/package.json +50 -0
@@ -0,0 +1,36 @@
1
+ export declare function exportDiagram(input: unknown): Promise<{
2
+ success: boolean;
3
+ error: string;
4
+ format?: undefined;
5
+ nodes?: undefined;
6
+ edges?: undefined;
7
+ label?: undefined;
8
+ message?: undefined;
9
+ editorUrl?: undefined;
10
+ instructions?: undefined;
11
+ } | {
12
+ success: boolean;
13
+ format: string;
14
+ nodes: import("../types/index.js").ReactFlowNode[];
15
+ edges: import("../types/index.js").ReactFlowEdge[];
16
+ label: string;
17
+ message: string;
18
+ error?: undefined;
19
+ editorUrl?: undefined;
20
+ instructions?: undefined;
21
+ } | {
22
+ success: boolean;
23
+ format: "png" | "svg";
24
+ message: string;
25
+ editorUrl: string | undefined;
26
+ instructions: {
27
+ json: string;
28
+ png: string;
29
+ svg: string;
30
+ };
31
+ error?: undefined;
32
+ nodes?: undefined;
33
+ edges?: undefined;
34
+ label?: undefined;
35
+ }>;
36
+ //# sourceMappingURL=export-diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-diagram.d.ts","sourceRoot":"","sources":["../../src/tools/export-diagram.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEjD"}
@@ -0,0 +1,65 @@
1
+ import { getDiagramState } from '../lib/diagram-state.js';
2
+ import { ExportDiagramInputSchema } from '../lib/schema.js';
3
+ import { fetchWithTimeout } from '../lib/http.js';
4
+ const API_BASE = process.env.API_BASE_URL || 'https://archdraw.hiabhee.online';
5
+ export async function exportDiagram(input) {
6
+ const validated = ExportDiagramInputSchema.parse(input);
7
+ const format = validated.format;
8
+ const sessionId = validated.sessionId || getDiagramState().sessionId;
9
+ const state = getDiagramState();
10
+ if (state.nodes.length === 0) {
11
+ return {
12
+ success: false,
13
+ error: 'No diagram loaded. Generate or load a diagram first.',
14
+ };
15
+ }
16
+ if (format === 'json') {
17
+ return {
18
+ success: true,
19
+ format: 'json',
20
+ nodes: state.nodes,
21
+ edges: state.edges,
22
+ label: 'ArchDraw Diagram',
23
+ message: 'Diagram exported as JSON. You can save this data to a file.',
24
+ };
25
+ }
26
+ if (!sessionId) {
27
+ return {
28
+ success: false,
29
+ error: 'No sessionId available for this diagram. Export as JSON instead, or generate a diagram first.',
30
+ };
31
+ }
32
+ try {
33
+ const response = await fetchWithTimeout(`${API_BASE}/api/diagram/export`, {
34
+ method: 'POST',
35
+ headers: { 'Content-Type': 'application/json' },
36
+ body: JSON.stringify({ sessionId, format }),
37
+ });
38
+ if (!response.ok) {
39
+ const errorData = await response.json().catch(() => ({}));
40
+ return {
41
+ success: false,
42
+ error: errorData.error || `Export failed: ${response.status}`,
43
+ };
44
+ }
45
+ const data = await response.json();
46
+ return {
47
+ success: true,
48
+ format,
49
+ message: `To export as ${format.toUpperCase()}, open the editor URL in your browser and use the export button.`,
50
+ editorUrl: data.editorUrl,
51
+ instructions: {
52
+ json: 'Use format: "json" to get raw diagram data',
53
+ png: 'Open editor and click Export → PNG',
54
+ svg: 'Open editor and click Export → SVG',
55
+ },
56
+ };
57
+ }
58
+ catch (error) {
59
+ return {
60
+ success: false,
61
+ error: error instanceof Error ? error.message : 'Export failed',
62
+ };
63
+ }
64
+ }
65
+ //# sourceMappingURL=export-diagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-diagram.js","sourceRoot":"","sources":["../../src/tools/export-diagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,iCAAiC,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAc;IAChD,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAChC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,eAAe,EAAE,CAAC,SAAS,CAAC;IAErE,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sDAAsD;SAC9D,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE,6DAA6D;SACvE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+FAA+F;SACvG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,QAAQ,qBAAqB,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAChF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,kBAAkB,QAAQ,CAAC,MAAM,EAAE;aAC9D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAkF,CAAC;QAEnH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM;YACN,OAAO,EAAE,gBAAgB,MAAM,CAAC,WAAW,EAAE,kEAAkE;YAC/G,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE;gBACZ,IAAI,EAAE,4CAA4C;gBAClD,GAAG,EAAE,oCAAoC;gBACzC,GAAG,EAAE,oCAAoC;aAC1C;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ReactFlowEdge, ReactFlowNode } from '../types/index.js';
2
+ import type { FixLayoutInput } from '../lib/schema.js';
3
+ /** Layout via the canonical Mermaid → Dagre editor pipeline. */
4
+ export declare function fixLayout(input: FixLayoutInput): Promise<{
5
+ success: boolean;
6
+ nodes: ReactFlowNode[];
7
+ edges: ReactFlowEdge[];
8
+ elkPositions: Array<{
9
+ id: string;
10
+ x: number;
11
+ y: number;
12
+ width: number;
13
+ height: number;
14
+ }>;
15
+ metadata: {
16
+ nodeCount: number;
17
+ edgeCount: number;
18
+ layoutAlgorithm: string;
19
+ direction: string;
20
+ };
21
+ errors?: string[];
22
+ }>;
23
+ //# sourceMappingURL=fix-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-layout.d.ts","sourceRoot":"","sources":["../../src/tools/fix-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,gEAAgE;AAChE,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzF,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/F,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC,CA+BD"}
@@ -0,0 +1,39 @@
1
+ import { fetchWithTimeout } from '../lib/http.js';
2
+ function escapeMermaidLabel(value) {
3
+ return value.replaceAll('"', "'").replaceAll('\n', ' ');
4
+ }
5
+ /** Layout via the canonical Mermaid → Dagre editor pipeline. */
6
+ export async function fixLayout(input) {
7
+ const apiBase = process.env.API_BASE_URL;
8
+ if (!apiBase) {
9
+ return { success: false, nodes: [], edges: [], elkPositions: [], metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'Mermaid → Dagre', direction: input.direction }, errors: ['fix_layout requires API_BASE_URL so it can use the ArchDraw editor layout pipeline.'] };
10
+ }
11
+ const direction = input.direction === 'DOWN' || input.direction === 'UP' ? 'TD' : 'LR';
12
+ const lines = [`graph ${direction}`];
13
+ for (const node of input.nodes)
14
+ lines.push(` ${node.id}["${escapeMermaidLabel(node.label)}"]`);
15
+ for (const edge of input.edges)
16
+ lines.push(` ${edge.source} --> ${edge.target}`);
17
+ try {
18
+ const response = await fetchWithTimeout(`${apiBase}/api/diagram/load`, {
19
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
20
+ body: JSON.stringify({ mermaid: lines.join('\n'), dryRun: true }),
21
+ });
22
+ if (!response.ok) {
23
+ return { success: false, nodes: [], edges: [], elkPositions: [], metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'Mermaid → Dagre', direction: input.direction }, errors: ['The ArchDraw layout pipeline rejected this graph.'] };
24
+ }
25
+ const diagram = await response.json();
26
+ return {
27
+ success: true,
28
+ nodes: diagram.nodes,
29
+ edges: diagram.edges,
30
+ elkPositions: diagram.nodes.map(node => ({ id: node.id, x: node.position.x, y: node.position.y, width: node.width || 0, height: node.height || 0 })),
31
+ metadata: { nodeCount: diagram.nodes.length, edgeCount: diagram.edges.length, layoutAlgorithm: 'Mermaid → Dagre', direction: input.direction },
32
+ errors: diagram.warnings,
33
+ };
34
+ }
35
+ catch (error) {
36
+ return { success: false, nodes: [], edges: [], elkPositions: [], metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'Mermaid → Dagre', direction: input.direction }, errors: [error instanceof Error ? error.message : 'Layout request failed'] };
37
+ }
38
+ }
39
+ //# sourceMappingURL=fix-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-layout.js","sourceRoot":"","sources":["../../src/tools/fix-layout.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAqB;IAQnD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,qFAAqF,CAAC,EAAE,CAAC;IAC/Q,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,MAAM,KAAK,GAAG,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,KAAK,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChG,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAElF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,OAAO,mBAAmB,EAAE;YACrE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAClE,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,mDAAmD,CAAC,EAAE,CAAC;QAC7O,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6E,CAAC;QACjH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YACpJ,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;YAC9I,MAAM,EAAE,OAAO,CAAC,QAAQ;SACzB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE,CAAC;IAC1P,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { ReactFlowNode, ReactFlowEdge } from '../types/index.js';
2
+ import type { GenerateDiagramInput } from '../lib/schema.js';
3
+ export declare function generateDiagram(input: GenerateDiagramInput): Promise<{
4
+ success: boolean;
5
+ nodes: ReactFlowNode[];
6
+ edges: ReactFlowEdge[];
7
+ elkPositions: Array<{
8
+ id: string;
9
+ x: number;
10
+ y: number;
11
+ width: number;
12
+ height: number;
13
+ }>;
14
+ metadata: {
15
+ nodeCount: number;
16
+ edgeCount: number;
17
+ layoutAlgorithm: string;
18
+ direction: string;
19
+ groupCount: number;
20
+ };
21
+ diagramUrl?: string;
22
+ sessionId?: string;
23
+ updateToken?: string;
24
+ shareUrl?: string;
25
+ embeddedDiagram?: {
26
+ nodes: ReactFlowNode[];
27
+ edges: ReactFlowEdge[];
28
+ };
29
+ message?: string;
30
+ errors?: string[];
31
+ }>;
32
+ //# sourceMappingURL=generate-diagram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-diagram.d.ts","sourceRoot":"","sources":["../../src/tools/generate-diagram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AA8K7D,wBAAsB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzF,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAAC,KAAK,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC,CA+TD"}
@@ -0,0 +1,325 @@
1
+ import { fetchWithTimeout } from '../lib/http.js';
2
+ import { validateGraph } from './validate-diagram.js';
3
+ function structuredInputToMermaid(nodes, edges, direction) {
4
+ const graphDirection = direction === 'DOWN' || direction === 'UP' ? 'TD' : 'LR';
5
+ const lines = [`graph ${graphDirection}`];
6
+ for (const node of nodes) {
7
+ const label = (node.label || node.id || 'Component').replaceAll('"', "'").replaceAll('\n', ' ');
8
+ lines.push(` ${node.id || 'component'}["${label}"]`);
9
+ }
10
+ for (const edge of edges || [])
11
+ lines.push(` ${edge.source} --> ${edge.target}`);
12
+ return lines.join('\n');
13
+ }
14
+ export async function generateDiagram(input) {
15
+ try {
16
+ const { direction } = input;
17
+ // Handle Mermaid input directly
18
+ if (input.mermaid) {
19
+ const API_BASE = process.env.API_BASE_URL;
20
+ const label = input.label || 'AI Diagram';
21
+ if (!API_BASE) {
22
+ return { success: false, nodes: [], edges: [], elkPositions: [], metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'Mermaid Pipeline', direction: input.direction || 'RIGHT', groupCount: 0 }, errors: ['Mermaid generation requires API_BASE_URL to run the ArchDraw pipeline.'] };
23
+ }
24
+ const previewResponse = await fetchWithTimeout(`${API_BASE}/api/diagram/load`, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify({
28
+ mermaid: input.mermaid,
29
+ label,
30
+ dryRun: true,
31
+ }),
32
+ });
33
+ if (!previewResponse.ok) {
34
+ const errText = await previewResponse.text();
35
+ let errData;
36
+ try {
37
+ errData = JSON.parse(errText);
38
+ }
39
+ catch { }
40
+ const errorMsg = errData?.error || errText || 'Failed to save diagram to API';
41
+ const warnings = errData?.warnings ? ` Warnings: ${errData.warnings.join(', ')}` : '';
42
+ return {
43
+ success: false, nodes: [], edges: [], elkPositions: [],
44
+ metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'Mermaid Pipeline', direction: input.direction || 'RIGHT', groupCount: 0 },
45
+ errors: [`${errorMsg}${warnings}`],
46
+ };
47
+ }
48
+ const preview = await previewResponse.json();
49
+ const validation = validateGraph(preview.nodes, preview.edges);
50
+ const structuralErrors = validation.issues.filter(issue => issue.severity === 'error').map(issue => issue.message);
51
+ if (structuralErrors.length > 0) {
52
+ return { success: false, nodes: [], edges: [], elkPositions: [], metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'Mermaid Pipeline', direction: input.direction || 'RIGHT', groupCount: 0 }, errors: structuralErrors };
53
+ }
54
+ let sessionId;
55
+ let updateToken;
56
+ let diagramUrl;
57
+ let shareUrl;
58
+ if (input.publish) {
59
+ const saveResponse = await fetchWithTimeout(`${API_BASE}/api/diagram/load`, {
60
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
61
+ body: JSON.stringify({ mermaid: input.mermaid, label, source: 'mcp', publish: true }),
62
+ });
63
+ if (!saveResponse.ok)
64
+ return { success: false, nodes: [], edges: [], elkPositions: [], metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'Mermaid Pipeline', direction: input.direction || 'RIGHT', groupCount: 0 }, errors: ['Could not publish diagram.'] };
65
+ const saved = await saveResponse.json();
66
+ sessionId = saved.sessionId;
67
+ updateToken = saved.updateToken;
68
+ diagramUrl = `${API_BASE}/editor?session=${sessionId}`;
69
+ shareUrl = `${API_BASE}/share/${sessionId}`;
70
+ }
71
+ const saveData = preview;
72
+ const nodeCount = saveData.nodes.filter(n => !n.data?.isGroup).length;
73
+ const groupCount = saveData.nodes.filter(n => n.data?.isGroup).length;
74
+ const techStack = input.techStack || [];
75
+ const customFeatures = input.customFeatures || [];
76
+ const techLine = techStack.length > 0
77
+ ? `\n\nšŸ”§ **Tech Stack Applied**: ${techStack.join(', ')}`
78
+ : '';
79
+ const featuresLine = customFeatures.length > 0
80
+ ? `\n⚔ **Features Included**: ${customFeatures.join(', ')}`
81
+ : '';
82
+ const promptLine = input.userPrompt
83
+ ? `\n\nšŸ’¬ **From prompt**: "${input.userPrompt.substring(0, 100)}${input.userPrompt.length > 100 ? '...' : ''}"` : '';
84
+ const linkLine = diagramUrl ? ` Open and edit it: ${diagramUrl}\n\nShare link: ${shareUrl}` : ' It is held locally in this MCP session. Set publish:true only when the user explicitly requests a browser link.';
85
+ const message = `āœ… Diagram ready!${linkLine}\n\nšŸ“Š ${nodeCount} nodes, ${groupCount} groups, ${saveData.edges.length} edges.${techLine}${featuresLine}${promptLine}`;
86
+ return {
87
+ success: true,
88
+ nodes: saveData.nodes,
89
+ edges: saveData.edges,
90
+ elkPositions: [],
91
+ metadata: {
92
+ nodeCount: saveData.nodes.length,
93
+ edgeCount: saveData.edges.length,
94
+ layoutAlgorithm: 'Mermaid Pipeline',
95
+ direction: input.direction || 'RIGHT',
96
+ groupCount,
97
+ },
98
+ diagramUrl,
99
+ sessionId,
100
+ updateToken,
101
+ shareUrl,
102
+ embeddedDiagram: { nodes: saveData.nodes, edges: saveData.edges },
103
+ message,
104
+ errors: [...(saveData.warnings || []), ...validation.issues.filter(issue => issue.severity !== 'error').map(issue => issue.message)],
105
+ };
106
+ }
107
+ if (!input.nodes || input.nodes.length === 0) {
108
+ return {
109
+ success: false, nodes: [], edges: [], elkPositions: [],
110
+ metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'ELK layered', direction, groupCount: 0 },
111
+ errors: ['No nodes or mermaid string provided.'],
112
+ };
113
+ }
114
+ // JSON remains supported for existing agents, but is deliberately adapted
115
+ // into Mermaid so every generated diagram uses the editor's canonical
116
+ // Mermaid → Dagre pipeline rather than a competing ELK layout.
117
+ return generateDiagram({
118
+ ...input,
119
+ mermaid: structuredInputToMermaid(input.nodes, input.edges || [], input.direction),
120
+ });
121
+ /* Retained temporarily only as migration history; JSON input returns above
122
+ through the canonical Mermaid pipeline. */
123
+ /*
124
+ // Check if AI used groups — warn if not
125
+ const groupNodes = input.nodes.filter((n: NodeInput) => n.isGroup);
126
+ if (groupNodes.length === 0) {
127
+ errors.push('WARNING: No group nodes provided. Best practice: wrap related nodes in group containers (isGroup:true) for visual clarity.');
128
+ }
129
+
130
+ // Extract tech/feature context for fidelity checks.
131
+ // If the caller did not pass an explicit techStack/customFeatures, derive
132
+ // them from the userPrompt via the shared prompt parser (single source).
133
+ const parsedPrompt = input.userPrompt ? parseUserPrompt(input.userPrompt) : null;
134
+ const techStack = input.techStack && input.techStack.length > 0
135
+ ? [...input.techStack]
136
+ : parsedPrompt?.detectedTechStack || [];
137
+ const customFeatures = input.customFeatures && input.customFeatures.length > 0
138
+ ? [...input.customFeatures]
139
+ : parsedPrompt?.customFeatures || [];
140
+
141
+ const architectureNodes: ArchitectureNode[] = input.nodes.map((node: NodeInput, index: number) => {
142
+ const layer = node.layer || node.tier || 'compute';
143
+ const tier = assignTierFromLayer(layer);
144
+ const isGroup = node.isGroup === true;
145
+
146
+ return {
147
+ id: node.id || `node-${index}`,
148
+ type: isGroup ? 'groupNode' : 'systemNode',
149
+ label: node.label,
150
+ subtitle: node.subtitle || '',
151
+ layer: tier,
152
+ tier: tier,
153
+ tierColor: node.tierColor || TIER_COLORS[tier],
154
+ accentColor: node.accentColor,
155
+ groupColor: node.groupColor,
156
+ status: node.status,
157
+ shape: node.shape,
158
+ // Groups get larger default dimensions; clamp regular nodes to minimum
159
+ width: isGroup
160
+ ? Math.max(node.width || DEFAULT_GROUP_WIDTH, 300)
161
+ : Math.max(node.width || DEFAULT_NODE_WIDTH, 160),
162
+ height: isGroup
163
+ ? Math.max(node.height || DEFAULT_GROUP_HEIGHT, 200)
164
+ : Math.max(node.height || DEFAULT_NODE_HEIGHT, 60),
165
+ icon: node.icon || (isGroup ? 'layers' : 'box'),
166
+ metadata: { serviceType: node.serviceType },
167
+ isGroup,
168
+ parentId: node.parentId,
169
+ serviceType: node.serviceType,
170
+ };
171
+ });
172
+
173
+ // Validate node integrity
174
+ const nodeIdSet = new Set(architectureNodes.map(n => n.id));
175
+ const inputEdgeErrors: string[] = [];
176
+ const inputEdgeIds = new Set<string>();
177
+
178
+ for (const edge of (input.edges || [])) {
179
+ if (edge.id && inputEdgeIds.has(edge.id)) {
180
+ inputEdgeErrors.push(`Duplicate edge id: ${edge.id}`);
181
+ } else if (edge.id) {
182
+ inputEdgeIds.add(edge.id);
183
+ }
184
+ if (!nodeIdSet.has(edge.source)) {
185
+ inputEdgeErrors.push(`Edge ${edge.id || 'unknown'}: invalid source "${edge.source}"`);
186
+ }
187
+ if (!nodeIdSet.has(edge.target)) {
188
+ inputEdgeErrors.push(`Edge ${edge.id || 'unknown'}: invalid target "${edge.target}"`);
189
+ }
190
+ if (edge.source === edge.target) {
191
+ inputEdgeErrors.push(`Edge ${edge.id || 'unknown'}: source and target are the same`);
192
+ }
193
+ }
194
+
195
+ errors.push(...validateNodes(architectureNodes, techStack, customFeatures), ...inputEdgeErrors);
196
+
197
+ // ── Run edge topology validation BEFORE layout ────────────────────────────
198
+ const topologyErrors = validateEdgeTopology(
199
+ architectureNodes,
200
+ (input.edges || []).map(e => ({ source: e.source, target: e.target, label: e.label, id: e.id }))
201
+ );
202
+ errors.push(...topologyErrors.map(error => `WARNING: ${error}`));
203
+
204
+ const architectureEdges: ArchitectureEdge[] = (input.edges || []).map((edge, index) => {
205
+ const commType = (edge.communicationType || 'sync') as keyof typeof COMM_COLORS;
206
+ const commStyle = COMM_COLORS[commType] || COMM_COLORS.sync;
207
+ // Use provided label; for async/stream/event, fall back to comm type description
208
+ const label = edge.label?.trim() || 'Connection';
209
+
210
+ return {
211
+ id: edge.id || `edge-${index}`,
212
+ source: edge.source,
213
+ target: edge.target,
214
+ communicationType: commType as ArchitectureEdge['communicationType'],
215
+ pathType: (edge.pathType ?? 'Smoothstep') as ArchitectureEdge['pathType'],
216
+ label,
217
+ labelPosition: 'center' as const,
218
+ animated: commStyle.animated,
219
+ style: {
220
+ stroke: commStyle.color,
221
+ strokeDasharray: commStyle.dash,
222
+ strokeWidth: 2.5,
223
+ },
224
+ markerEnd: 'arrowclosed' as const,
225
+ markerStart: 'none' as const,
226
+ };
227
+ });
228
+
229
+ const layoutResult = await runELKLayout(architectureNodes, architectureEdges, { direction });
230
+
231
+ const layoutValidation = validateLayout(layoutResult.nodes, layoutResult.edges);
232
+ if (!layoutValidation.valid) {
233
+ errors.push(...layoutValidation.errors);
234
+ }
235
+
236
+ const graphValidation = validateGraph(layoutResult.nodes, layoutResult.edges);
237
+ const structuralErrors = graphValidation.issues.filter(issue => issue.severity === 'error').map(issue => issue.message);
238
+ if (structuralErrors.length > 0) {
239
+ return {
240
+ success: false, nodes: [], edges: [], elkPositions: [],
241
+ metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'ELK layered', direction, groupCount: 0 },
242
+ errors: structuralErrors,
243
+ };
244
+ }
245
+ errors.push(...graphValidation.issues.filter(issue => issue.severity !== 'error').map(issue => issue.message));
246
+
247
+ let diagramUrl: string | undefined;
248
+ let message: string | undefined;
249
+ let sessionId: string | undefined;
250
+ let updateToken: string | undefined;
251
+
252
+ const API_BASE = process.env.API_BASE_URL;
253
+
254
+ if (input.publish && API_BASE) try {
255
+ const label = input.label || input.nodes[0]?.label || 'AI Diagram';
256
+ const saveResponse = await fetchWithTimeout(`${API_BASE}/api/diagram/load`, {
257
+ method: 'POST',
258
+ headers: { 'Content-Type': 'application/json' },
259
+ body: JSON.stringify({
260
+ nodes: layoutResult.nodes,
261
+ edges: layoutResult.edges,
262
+ label,
263
+ source: 'mcp', publish: true,
264
+ }),
265
+ });
266
+
267
+ if (saveResponse.ok) {
268
+ const saveData = await saveResponse.json() as { sessionId: string; url?: string; updateToken: string };
269
+ const urlPath = saveData.url || `/editor?session=${saveData.sessionId}`;
270
+ diagramUrl = `${API_BASE}${urlPath}`;
271
+ sessionId = saveData.sessionId;
272
+ updateToken = saveData.updateToken;
273
+ const shareUrl = `${API_BASE}/share/${sessionId}`;
274
+ const nodeCount = layoutResult.nodes.filter(n => !n.data?.isGroup).length;
275
+ const groupCount = layoutResult.nodes.filter(n => n.data?.isGroup).length;
276
+
277
+ // Build a context-aware success message
278
+ const techLine = techStack.length > 0
279
+ ? `\n\nšŸ”§ **Tech Stack Applied**: ${techStack.join(', ')}`
280
+ : '';
281
+ const featuresLine = customFeatures.length > 0
282
+ ? `\n⚔ **Features Included**: ${customFeatures.join(', ')}`
283
+ : '';
284
+ const promptLine = input.userPrompt
285
+ ? `\n\nšŸ’¬ **From prompt**: "${input.userPrompt.substring(0, 100)}${input.userPrompt.length > 100 ? '...' : ''}"` : '';
286
+
287
+ message = `āœ… Diagram ready! Open this URL to view and edit:\n\n${diagramUrl}\n\nšŸ”— Shareable link:\n${shareUrl}\n\nšŸ“Š ${nodeCount} nodes, ${groupCount} groups, ${layoutResult.edges.length} edges.${techLine}${featuresLine}${promptLine}\n\n**To export**: Use session ID "${sessionId}" with the export_diagram tool.`;
288
+ }
289
+ } catch {
290
+ message = `Diagram generated with ${layoutResult.nodes.length} nodes and ${layoutResult.edges.length} edges, but couldn't save to generate a link. Make sure Next.js is running on ${API_BASE}.`;
291
+ }
292
+
293
+ const groupCount = architectureNodes.filter(n => n.isGroup).length;
294
+
295
+ return {
296
+ success: true,
297
+ nodes: layoutResult.nodes,
298
+ edges: layoutResult.edges,
299
+ elkPositions: layoutResult.elkPositions,
300
+ metadata: {
301
+ nodeCount: layoutResult.nodes.length,
302
+ edgeCount: layoutResult.edges.length,
303
+ layoutAlgorithm: 'ELK layered',
304
+ direction,
305
+ groupCount,
306
+ },
307
+ diagramUrl,
308
+ sessionId,
309
+ updateToken,
310
+ shareUrl: sessionId ? `${API_BASE}/share/${sessionId}` : undefined,
311
+ embeddedDiagram: { nodes: layoutResult.nodes, edges: layoutResult.edges },
312
+ message,
313
+ errors: errors.length > 0 ? errors : undefined,
314
+ };
315
+ */
316
+ }
317
+ catch (error) {
318
+ return {
319
+ success: false, nodes: [], edges: [], elkPositions: [],
320
+ metadata: { nodeCount: 0, edgeCount: 0, layoutAlgorithm: 'ELK layered', direction: input.direction, groupCount: 0 },
321
+ errors: [error instanceof Error ? error.message : 'Unknown error'],
322
+ };
323
+ }
324
+ }
325
+ //# sourceMappingURL=generate-diagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-diagram.js","sourceRoot":"","sources":["../../src/tools/generate-diagram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ListNodeTypesInput } from '../lib/schema.js';
2
+ interface SearchResult {
3
+ id: string;
4
+ label: string;
5
+ icon: string;
6
+ description: string;
7
+ }
8
+ interface CategoryResult {
9
+ name: string;
10
+ count: number;
11
+ nodes: SearchResult[];
12
+ }
13
+ export declare function listNodeTypes(input: ListNodeTypesInput): Promise<{
14
+ categories: CategoryResult[];
15
+ totalCount: number;
16
+ }>;
17
+ export {};
18
+ //# sourceMappingURL=list-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-nodes.d.ts","sourceRoot":"","sources":["../../src/tools/list-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAI3D,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC;IACtE,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAwDD"}
@@ -0,0 +1,48 @@
1
+ import { getComponentsByCategory, searchComponents } from '../lib/node-catalog.js';
2
+ export async function listNodeTypes(input) {
3
+ const { category, search, limit } = input;
4
+ if (search && search.trim()) {
5
+ const results = searchComponents(search, limit);
6
+ const categoryMap = new Map();
7
+ for (const component of results) {
8
+ if (!categoryMap.has(component.category)) {
9
+ categoryMap.set(component.category, []);
10
+ }
11
+ categoryMap.get(component.category).push(component);
12
+ }
13
+ const categories = Array.from(categoryMap.entries())
14
+ .map(([name, comps]) => ({
15
+ name,
16
+ count: comps.length,
17
+ nodes: comps.map((n) => ({
18
+ id: n.id,
19
+ label: n.label,
20
+ icon: n.icon,
21
+ description: n.description,
22
+ })),
23
+ }))
24
+ .sort((a, b) => a.name.localeCompare(b.name));
25
+ return {
26
+ categories,
27
+ totalCount: results.length,
28
+ };
29
+ }
30
+ if (category && category.trim()) {
31
+ const summary = getComponentsByCategory();
32
+ const filteredCategories = summary.categories.filter(c => c.name.toLowerCase().includes(category.toLowerCase()));
33
+ return {
34
+ categories: filteredCategories,
35
+ totalCount: filteredCategories.reduce((sum, c) => sum + c.count, 0),
36
+ };
37
+ }
38
+ const summary = getComponentsByCategory();
39
+ const limitedCategories = summary.categories.map((cat) => ({
40
+ ...cat,
41
+ nodes: cat.nodes.slice(0, Math.ceil(limit / summary.categories.length)),
42
+ }));
43
+ return {
44
+ categories: limitedCategories,
45
+ totalCount: summary.totalCount,
46
+ };
47
+ }
48
+ //# sourceMappingURL=list-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-nodes.js","sourceRoot":"","sources":["../../src/tools/list-nodes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAgBnF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAyB;IAI3D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAE1C,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEhD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiC,CAAC;QAC7D,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,UAAU,GAAqB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aACnE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI;YACJ,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAsB,EAAE,EAAE,CAAC,CAAC;gBAC5C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;SACJ,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhD,OAAO;YACL,UAAU;YACV,UAAU,EAAE,OAAO,CAAC,MAAM;SAC3B,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;QAC1C,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CACtD,CAAC;QAEF,OAAO;YACL,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAiB,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;SAC5F,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAE1C,MAAM,iBAAiB,GAAqB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAmB,EAAE,EAAE,CAAC,CAAC;QAC3F,GAAG,GAAG;QACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;KACxE,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,UAAU,EAAE,iBAAiB;QAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC"}