@qualitas-id/mcp 1.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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +262 -0
  3. package/dist/constants.d.ts +18 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +18 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +10 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +82 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/common.d.ts +20 -0
  12. package/dist/schemas/common.d.ts.map +1 -0
  13. package/dist/schemas/common.js +10 -0
  14. package/dist/schemas/common.js.map +1 -0
  15. package/dist/schemas/flow.d.ts +358 -0
  16. package/dist/schemas/flow.d.ts.map +1 -0
  17. package/dist/schemas/flow.js +72 -0
  18. package/dist/schemas/flow.js.map +1 -0
  19. package/dist/schemas/project.d.ts +70 -0
  20. package/dist/schemas/project.d.ts.map +1 -0
  21. package/dist/schemas/project.js +26 -0
  22. package/dist/schemas/project.js.map +1 -0
  23. package/dist/schemas/run.d.ts +54 -0
  24. package/dist/schemas/run.d.ts.map +1 -0
  25. package/dist/schemas/run.js +20 -0
  26. package/dist/schemas/run.js.map +1 -0
  27. package/dist/schemas/variable.d.ts +91 -0
  28. package/dist/schemas/variable.d.ts.map +1 -0
  29. package/dist/schemas/variable.js +30 -0
  30. package/dist/schemas/variable.js.map +1 -0
  31. package/dist/services/api-client.d.ts +101 -0
  32. package/dist/services/api-client.d.ts.map +1 -0
  33. package/dist/services/api-client.js +184 -0
  34. package/dist/services/api-client.js.map +1 -0
  35. package/dist/services/flow-generator.d.ts +31 -0
  36. package/dist/services/flow-generator.d.ts.map +1 -0
  37. package/dist/services/flow-generator.js +638 -0
  38. package/dist/services/flow-generator.js.map +1 -0
  39. package/dist/shared-types.d.ts +579 -0
  40. package/dist/shared-types.d.ts.map +1 -0
  41. package/dist/shared-types.js +12 -0
  42. package/dist/shared-types.js.map +1 -0
  43. package/dist/tools/flows.d.ts +13 -0
  44. package/dist/tools/flows.d.ts.map +1 -0
  45. package/dist/tools/flows.js +458 -0
  46. package/dist/tools/flows.js.map +1 -0
  47. package/dist/tools/projects.d.ts +13 -0
  48. package/dist/tools/projects.d.ts.map +1 -0
  49. package/dist/tools/projects.js +381 -0
  50. package/dist/tools/projects.js.map +1 -0
  51. package/dist/tools/runs.d.ts +9 -0
  52. package/dist/tools/runs.d.ts.map +1 -0
  53. package/dist/tools/runs.js +342 -0
  54. package/dist/tools/runs.js.map +1 -0
  55. package/dist/tools/utils.d.ts +12 -0
  56. package/dist/tools/utils.d.ts.map +1 -0
  57. package/dist/tools/utils.js +144 -0
  58. package/dist/tools/utils.js.map +1 -0
  59. package/dist/tools/variables.d.ts +9 -0
  60. package/dist/tools/variables.d.ts.map +1 -0
  61. package/dist/tools/variables.js +316 -0
  62. package/dist/tools/variables.js.map +1 -0
  63. package/dist/types.d.ts +117 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +8 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/utils/flow-layout.d.ts +34 -0
  68. package/dist/utils/flow-layout.d.ts.map +1 -0
  69. package/dist/utils/flow-layout.js +109 -0
  70. package/dist/utils/flow-layout.js.map +1 -0
  71. package/dist/utils/flow-validation.d.ts +74 -0
  72. package/dist/utils/flow-validation.d.ts.map +1 -0
  73. package/dist/utils/flow-validation.js +386 -0
  74. package/dist/utils/flow-validation.js.map +1 -0
  75. package/dist/utils/ocr.d.ts +25 -0
  76. package/dist/utils/ocr.d.ts.map +1 -0
  77. package/dist/utils/ocr.js +88 -0
  78. package/dist/utils/ocr.js.map +1 -0
  79. package/package.json +65 -0
  80. package/skills/qualitas.md +253 -0
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Qualitas MCP Server - Variable Tools
3
+ *
4
+ * Tools for managing project-level environment variables (CRUD).
5
+ */
6
+ import { handleApiError } from "../services/api-client.js";
7
+ import { ListVariablesSchema, CreateVariableSchema, UpdateVariableSchema, DeleteVariableSchema, } from "../schemas/variable.js";
8
+ // ===========================================
9
+ // Helpers
10
+ // ===========================================
11
+ function formatVariableMarkdown(variable) {
12
+ const lines = [];
13
+ lines.push(`### \`${variable.name}\``);
14
+ lines.push("");
15
+ lines.push(`- **ID:** \`${variable.id}\``);
16
+ if (variable.scope)
17
+ lines.push(`- **Scope:** ${variable.scope}`);
18
+ lines.push(`- **Created:** ${variable.created_at}`);
19
+ lines.push(`- **Updated:** ${variable.updated_at}`);
20
+ if (variable.values) {
21
+ lines.push("");
22
+ lines.push("**Environment Values:**");
23
+ lines.push("");
24
+ lines.push("| Environment | Value |");
25
+ lines.push("|-------------|-------|");
26
+ lines.push(`| dev | \`${variable.values.dev ?? "—"}\` |`);
27
+ lines.push(`| staging | \`${variable.values.staging ?? "—"}\` |`);
28
+ lines.push(`| prod | \`${variable.values.prod ?? "—"}\` |`);
29
+ }
30
+ return lines.join("\n");
31
+ }
32
+ function formatVariablesListMarkdown(variables) {
33
+ if (variables.length === 0) {
34
+ return "No variables found for this project.";
35
+ }
36
+ const lines = [];
37
+ lines.push("## Project Variables");
38
+ lines.push("");
39
+ lines.push("| Name | Scope | dev | staging | prod |");
40
+ lines.push("|------|-------|-----|---------|------|");
41
+ for (const v of variables) {
42
+ const scope = v.scope ?? "project";
43
+ const dev = v.values?.dev ?? "—";
44
+ const staging = v.values?.staging ?? "—";
45
+ const prod = v.values?.prod ?? "—";
46
+ lines.push(`| \`${v.name}\` | ${scope} | \`${dev}\` | \`${staging}\` | \`${prod}\` |`);
47
+ }
48
+ lines.push("");
49
+ lines.push(`> ${variables.length} variable(s) total.`);
50
+ return lines.join("\n");
51
+ }
52
+ // ===========================================
53
+ // Tool Registration
54
+ // ===========================================
55
+ export function registerVariableTools(server, apiClient) {
56
+ // ------------------------------------------
57
+ // 1. qualitas_list_variables
58
+ // ------------------------------------------
59
+ server.registerTool("list_variables", {
60
+ title: "List Variables",
61
+ description: [
62
+ "List all environment variables for a project, showing name, scope, and values per environment.",
63
+ "",
64
+ "**Arguments:**",
65
+ "- `project_id` (UUID, required): The project whose variables to list.",
66
+ "- `response_format` (\"markdown\" | \"json\", default \"markdown\"): Output format.",
67
+ "",
68
+ "**Returns (markdown):**",
69
+ "- A table with variable names, scope, and values for dev, staging, and prod.",
70
+ "",
71
+ "**Returns (json):**",
72
+ "```json",
73
+ "{",
74
+ ' "variables": [',
75
+ " {",
76
+ ' "id": "var-uuid",',
77
+ ' "name": "API_URL",',
78
+ ' "scope": "project",',
79
+ ' "values": { "dev": "https://dev.api.com", "staging": "https://stg.api.com", "prod": "https://api.com" },',
80
+ ' "created_at": "2025-01-01T00:00:00Z",',
81
+ ' "updated_at": "2025-01-15T10:00:00Z"',
82
+ " }",
83
+ " ]",
84
+ "}",
85
+ "```",
86
+ "",
87
+ "**Example:**",
88
+ "```",
89
+ 'qualitas_list_variables({ project_id: "abc-123" })',
90
+ "```",
91
+ "",
92
+ "**Errors:**",
93
+ "- 404: Project not found.",
94
+ "- 401: Invalid or expired API key.",
95
+ ].join("\n"),
96
+ inputSchema: ListVariablesSchema.shape,
97
+ annotations: {
98
+ title: "List Variables",
99
+ readOnlyHint: true,
100
+ destructiveHint: false,
101
+ idempotentHint: true,
102
+ openWorldHint: true,
103
+ },
104
+ }, async (args) => {
105
+ try {
106
+ const response = await apiClient.listVariables(args.project_id);
107
+ const variables = response.data;
108
+ if (args.response_format === "json") {
109
+ return {
110
+ content: [
111
+ { type: "text", text: JSON.stringify({ variables }, null, 2) },
112
+ ],
113
+ };
114
+ }
115
+ return {
116
+ content: [
117
+ { type: "text", text: formatVariablesListMarkdown(variables) },
118
+ ],
119
+ };
120
+ }
121
+ catch (error) {
122
+ return {
123
+ content: [{ type: "text", text: handleApiError(error) }],
124
+ isError: true,
125
+ };
126
+ }
127
+ });
128
+ // ------------------------------------------
129
+ // 2. qualitas_create_variable
130
+ // ------------------------------------------
131
+ server.registerTool("create_variable", {
132
+ title: "Create Variable",
133
+ description: [
134
+ "Create a new environment variable for a project.",
135
+ "",
136
+ "**Arguments:**",
137
+ "- `project_id` (UUID, required): The project to create the variable in.",
138
+ "- `name` (string, required): Variable name, e.g. `API_URL`, `TEST_PASSWORD`.",
139
+ "- `values` (object, required): Environment-specific values.",
140
+ " - `dev` (string, optional): Value for dev environment.",
141
+ " - `staging` (string, optional): Value for staging environment.",
142
+ " - `prod` (string, optional): Value for prod environment.",
143
+ "",
144
+ "**Returns:**",
145
+ "- Markdown with the created variable's ID, name, scope, and environment values.",
146
+ "",
147
+ "**Example:**",
148
+ "```",
149
+ 'qualitas_create_variable({',
150
+ ' project_id: "abc-123",',
151
+ ' name: "API_URL",',
152
+ ' values: { dev: "https://dev.api.com", staging: "https://stg.api.com", prod: "https://api.com" }',
153
+ "})",
154
+ "```",
155
+ "",
156
+ "**Errors:**",
157
+ "- 404: Project not found.",
158
+ "- 422: Validation failed (missing name, duplicate variable, etc.).",
159
+ "- 401: Invalid or expired API key.",
160
+ ].join("\n"),
161
+ inputSchema: CreateVariableSchema.shape,
162
+ annotations: {
163
+ title: "Create Variable",
164
+ readOnlyHint: false,
165
+ destructiveHint: false,
166
+ idempotentHint: false,
167
+ openWorldHint: true,
168
+ },
169
+ }, async (args) => {
170
+ try {
171
+ const response = await apiClient.createVariable(args.project_id, {
172
+ name: args.name,
173
+ values: args.values,
174
+ });
175
+ const variable = response.data;
176
+ const lines = [];
177
+ lines.push("## Variable Created");
178
+ lines.push("");
179
+ lines.push(formatVariableMarkdown(variable));
180
+ return {
181
+ content: [{ type: "text", text: lines.join("\n") }],
182
+ };
183
+ }
184
+ catch (error) {
185
+ return {
186
+ content: [{ type: "text", text: handleApiError(error) }],
187
+ isError: true,
188
+ };
189
+ }
190
+ });
191
+ // ------------------------------------------
192
+ // 3. qualitas_update_variable
193
+ // ------------------------------------------
194
+ server.registerTool("update_variable", {
195
+ title: "Update Variable",
196
+ description: [
197
+ "Update an existing environment variable's name and/or values.",
198
+ "",
199
+ "**Arguments:**",
200
+ "- `project_id` (UUID, required): The project containing the variable.",
201
+ "- `variable_id` (UUID, required): The variable to update.",
202
+ "- `name` (string, optional): New variable name.",
203
+ "- `values` (object, optional): Updated environment values.",
204
+ " - `dev` (string, optional): New value for dev.",
205
+ " - `staging` (string, optional): New value for staging.",
206
+ " - `prod` (string, optional): New value for prod.",
207
+ "",
208
+ "**Returns:**",
209
+ "- Markdown with the updated variable's ID, name, scope, and environment values.",
210
+ "",
211
+ "**Example:**",
212
+ "```",
213
+ 'qualitas_update_variable({',
214
+ ' project_id: "abc-123",',
215
+ ' variable_id: "var-uuid",',
216
+ ' values: { prod: "https://new-prod.api.com" }',
217
+ "})",
218
+ "```",
219
+ "",
220
+ "**Errors:**",
221
+ "- 404: Project or variable not found.",
222
+ "- 422: Validation failed (invalid name, etc.).",
223
+ "- 401: Invalid or expired API key.",
224
+ ].join("\n"),
225
+ inputSchema: UpdateVariableSchema.shape,
226
+ annotations: {
227
+ title: "Update Variable",
228
+ readOnlyHint: false,
229
+ destructiveHint: false,
230
+ idempotentHint: true,
231
+ openWorldHint: true,
232
+ },
233
+ }, async (args) => {
234
+ try {
235
+ const response = await apiClient.updateVariable(args.project_id, args.variable_id, {
236
+ name: args.name,
237
+ values: args.values,
238
+ });
239
+ const variable = response.data;
240
+ const lines = [];
241
+ lines.push("## Variable Updated");
242
+ lines.push("");
243
+ lines.push(formatVariableMarkdown(variable));
244
+ return {
245
+ content: [{ type: "text", text: lines.join("\n") }],
246
+ };
247
+ }
248
+ catch (error) {
249
+ return {
250
+ content: [{ type: "text", text: handleApiError(error) }],
251
+ isError: true,
252
+ };
253
+ }
254
+ });
255
+ // ------------------------------------------
256
+ // 4. qualitas_delete_variable
257
+ // ------------------------------------------
258
+ server.registerTool("delete_variable", {
259
+ title: "Delete Variable",
260
+ description: [
261
+ "**⚠️ Destructive action.** Permanently delete an environment variable from a project.",
262
+ "",
263
+ "**Arguments:**",
264
+ "- `project_id` (UUID, required): The project containing the variable.",
265
+ "- `variable_id` (UUID, required): The variable to delete.",
266
+ "",
267
+ "**Returns:**",
268
+ "- Confirmation message with the deleted variable's project and ID.",
269
+ "",
270
+ "**Example:**",
271
+ "```",
272
+ 'qualitas_delete_variable({ project_id: "abc-123", variable_id: "var-uuid" })',
273
+ "```",
274
+ "",
275
+ "**Errors:**",
276
+ "- 404: Project or variable not found.",
277
+ "- 401: Invalid or expired API key.",
278
+ "",
279
+ "**Warning:** This action cannot be undone. Any flows referencing this variable will fail at runtime.",
280
+ ].join("\n"),
281
+ inputSchema: DeleteVariableSchema.shape,
282
+ annotations: {
283
+ title: "Delete Variable",
284
+ readOnlyHint: false,
285
+ destructiveHint: true,
286
+ idempotentHint: false,
287
+ openWorldHint: true,
288
+ },
289
+ }, async (args) => {
290
+ try {
291
+ await apiClient.deleteVariable(args.project_id, args.variable_id);
292
+ return {
293
+ content: [
294
+ {
295
+ type: "text",
296
+ text: [
297
+ "## Variable Deleted",
298
+ "",
299
+ `- **Project:** \`${args.project_id}\``,
300
+ `- **Variable ID:** \`${args.variable_id}\``,
301
+ "",
302
+ "> This action cannot be undone.",
303
+ ].join("\n"),
304
+ },
305
+ ],
306
+ };
307
+ }
308
+ catch (error) {
309
+ return {
310
+ content: [{ type: "text", text: handleApiError(error) }],
311
+ isError: true,
312
+ };
313
+ }
314
+ });
315
+ }
316
+ //# sourceMappingURL=variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/tools/variables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Qualitas MCP Server - Type Re-exports
3
+ *
4
+ * Re-exports key types from @qualitas-id/shared-types for convenient use
5
+ * throughout the MCP server.
6
+ */
7
+ export type { FlowNodeType, ActionType } from "@qualitas-id/shared-types";
8
+ export type { BaseNodeData, SelectorNodeData, StartNodeData, ScheduleNodeData, NavigateNodeData, ReloadNodeData, GoBackNodeData, GoForwardNodeData, ClickNodeData, DblclickNodeData, RightclickNodeData, HoverNodeData, DragAndDropNodeData, FillNodeData, TypeNodeData, ClearNodeData, PressNodeData, SubmitNodeData, CheckNodeData, UncheckNodeData, SelectNodeData, UploadNodeData, FocusNodeData, BlurNodeData, ScrollNodeData, ScrollIntoViewNodeData, WaitNodeData, WaitForElementNodeData, WaitForNavigationNodeData, WaitForResponseNodeData, AssertVisibleNodeData, AssertTextNodeData, AssertValueNodeData, AssertUrlNodeData, AssertTitleNodeData, AssertVariableNodeData, AssertTableCellNodeData, AssertCountNodeData, ScreenshotNodeData, ExtractFromElementNodeData, IfConditionNodeData, LoopNodeData, ExecuteScriptNodeData, ApiCallHeader, ApiCallExtraction, ApiCallNodeData, GenerateEmailNodeData, ReadEmailNodeData, ExtractEmailNodeData, CallFragmentNodeData, NodeData, NodeDataMap, GetNodeData, } from "@qualitas-id/shared-types";
9
+ export type { Environment, EnvironmentConfig, FlowStatus, VariableValues, Variable, FlowNode, FlowEdge, Flow, PaletteItem, PaletteCategory, } from "@qualitas-id/shared-types";
10
+ export type { RunStatus, StepStatus, StepResult, ExecutionContext, RunPlanConfig, RunFlowJobData, SSEEventType, StepStartData, StepCompleteData, LogData, RunCompleteData, SSEEvent, Step, } from "@qualitas-id/shared-types";
11
+ export type { ApiResponse, ApiError, PaginationMeta, PaginatedResponse, PaginationQuery, ProjectsQuery, FlowsQuery, RunsQuery, } from "@qualitas-id/shared-types";
12
+ /** Response format for tool outputs */
13
+ export type ResponseFormat = "markdown" | "json";
14
+ /** Standard tool response structure */
15
+ export interface ToolResponse {
16
+ content: Array<{
17
+ type: "text";
18
+ text: string;
19
+ }>;
20
+ isError?: boolean;
21
+ }
22
+ /** Qualitas API standard success response */
23
+ export interface QualitasApiResponse<T = unknown> {
24
+ success: true;
25
+ data: T;
26
+ meta?: {
27
+ page: number;
28
+ limit: number;
29
+ total: number;
30
+ };
31
+ }
32
+ /** Qualitas API standard error response */
33
+ export interface QualitasApiError {
34
+ success: false;
35
+ error: {
36
+ code: string;
37
+ message: string;
38
+ details?: Record<string, string[]>;
39
+ };
40
+ }
41
+ /** Project data from API */
42
+ export interface ProjectData {
43
+ id: string;
44
+ name: string;
45
+ description?: string;
46
+ icon?: string;
47
+ icon_color?: string;
48
+ base_url?: string;
49
+ status: string;
50
+ flows_count?: number;
51
+ passing_count?: number;
52
+ failing_count?: number;
53
+ last_run_at?: string;
54
+ last_run_by?: string;
55
+ created_at: string;
56
+ updated_at: string;
57
+ }
58
+ /** Flow data from API */
59
+ export interface FlowData {
60
+ id: string;
61
+ name: string;
62
+ description?: string;
63
+ project_id: string;
64
+ type?: string;
65
+ environment?: string;
66
+ status: string;
67
+ nodes: unknown[];
68
+ edges: unknown[];
69
+ variables?: unknown[];
70
+ created_at: string;
71
+ updated_at: string;
72
+ }
73
+ /** Run data from API */
74
+ export interface RunData {
75
+ id: string;
76
+ flow_id: string;
77
+ status: string;
78
+ environment?: string;
79
+ duration_ms?: number;
80
+ steps_total?: number;
81
+ steps_passed?: number;
82
+ steps_failed?: number;
83
+ steps_result?: unknown[];
84
+ video_url?: string;
85
+ executed_at: string;
86
+ executed_by?: string;
87
+ }
88
+ /** Run step data from API */
89
+ export interface RunStepData {
90
+ id: string;
91
+ runId: string;
92
+ nodeId: string;
93
+ type: string;
94
+ status: "passed" | "failed" | "skipped";
95
+ durationMs?: number;
96
+ logs?: string;
97
+ errorMessage?: string;
98
+ screenshotUrl?: string;
99
+ apiCallRequest?: Record<string, unknown>;
100
+ apiCallResponse?: Record<string, unknown>;
101
+ sequenceOrder: number;
102
+ createdAt: string;
103
+ }
104
+ /** Variable data from API */
105
+ export interface VariableData {
106
+ id: string;
107
+ name: string;
108
+ scope?: string;
109
+ values: {
110
+ dev?: string;
111
+ staging?: string;
112
+ prod?: string;
113
+ };
114
+ created_at: string;
115
+ updated_at: string;
116
+ }
117
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Qualitas MCP Server - Type Re-exports
3
+ *
4
+ * Re-exports key types from @qualitas-id/shared-types for convenient use
5
+ * throughout the MCP server.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Flow Layout Utilities
3
+ *
4
+ * Auto-arranges flow nodes in a clean topological layout.
5
+ * Ported from front-end/src/features/flows/utils/flow-layout.ts
6
+ */
7
+ interface LayoutNode {
8
+ id: string;
9
+ type: string;
10
+ position: {
11
+ x: number;
12
+ y: number;
13
+ };
14
+ data: Record<string, unknown>;
15
+ }
16
+ interface LayoutEdge {
17
+ id: string;
18
+ source: string;
19
+ target: string;
20
+ sourceHandle?: string;
21
+ targetHandle?: string;
22
+ }
23
+ /**
24
+ * Auto-arrange nodes in a clean topological layout.
25
+ * - Topological sort to determine layers
26
+ * - Center nodes horizontally per layer
27
+ * - Extra gap after callFragment nodes
28
+ */
29
+ export declare function beautifyFlowLayout(nodes: LayoutNode[], edges: LayoutEdge[], options?: {
30
+ verticalGap?: number;
31
+ horizontalGap?: number;
32
+ }): LayoutNode[];
33
+ export {};
34
+ //# sourceMappingURL=flow-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-layout.d.ts","sourceRoot":"","sources":["../../src/utils/flow-layout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EAAE,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,UAAU,EAAE,CAgHd"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Flow Layout Utilities
3
+ *
4
+ * Auto-arranges flow nodes in a clean topological layout.
5
+ * Ported from front-end/src/features/flows/utils/flow-layout.ts
6
+ */
7
+ const DEFAULT_VERTICAL_GAP = 140;
8
+ const DEFAULT_HORIZONTAL_GAP = 340;
9
+ const CALL_FRAGMENT_EXTRA_GAP = 80;
10
+ /**
11
+ * Auto-arrange nodes in a clean topological layout.
12
+ * - Topological sort to determine layers
13
+ * - Center nodes horizontally per layer
14
+ * - Extra gap after callFragment nodes
15
+ */
16
+ export function beautifyFlowLayout(nodes, edges, options) {
17
+ if (nodes.length === 0) {
18
+ return nodes;
19
+ }
20
+ const verticalGap = options?.verticalGap ?? DEFAULT_VERTICAL_GAP;
21
+ const horizontalGap = options?.horizontalGap ?? DEFAULT_HORIZONTAL_GAP;
22
+ const nodeIds = new Set(nodes.map((node) => node.id));
23
+ const adjacency = new Map();
24
+ const inDegree = new Map();
25
+ nodes.forEach((node) => {
26
+ adjacency.set(node.id, []);
27
+ inDegree.set(node.id, 0);
28
+ });
29
+ edges.forEach((edge) => {
30
+ if (!nodeIds.has(edge.source) || !nodeIds.has(edge.target)) {
31
+ return;
32
+ }
33
+ const targets = adjacency.get(edge.source) ?? [];
34
+ targets.push(edge.target);
35
+ adjacency.set(edge.source, targets);
36
+ inDegree.set(edge.target, (inDegree.get(edge.target) ?? 0) + 1);
37
+ });
38
+ const sortedByVisualOrder = [...nodes].sort((a, b) => {
39
+ if (a.position.y !== b.position.y)
40
+ return a.position.y - b.position.y;
41
+ return a.position.x - b.position.x;
42
+ });
43
+ const queue = sortedByVisualOrder
44
+ .filter((node) => (inDegree.get(node.id) ?? 0) === 0)
45
+ .map((node) => node.id);
46
+ const layerByNodeId = new Map();
47
+ queue.forEach((id) => layerByNodeId.set(id, 0));
48
+ while (queue.length > 0) {
49
+ const currentNodeId = queue.shift();
50
+ if (!currentNodeId)
51
+ continue;
52
+ const currentLayer = layerByNodeId.get(currentNodeId) ?? 0;
53
+ const nextTargets = adjacency.get(currentNodeId) ?? [];
54
+ nextTargets.forEach((targetId) => {
55
+ const targetLayer = layerByNodeId.get(targetId) ?? 0;
56
+ layerByNodeId.set(targetId, Math.max(targetLayer, currentLayer + 1));
57
+ const nextInDegree = (inDegree.get(targetId) ?? 0) - 1;
58
+ inDegree.set(targetId, nextInDegree);
59
+ if (nextInDegree === 0) {
60
+ queue.push(targetId);
61
+ }
62
+ });
63
+ }
64
+ // Fallback for cycles/disconnected unresolved nodes
65
+ nodes.forEach((node) => {
66
+ if (!layerByNodeId.has(node.id)) {
67
+ layerByNodeId.set(node.id, 0);
68
+ }
69
+ });
70
+ const minY = Math.min(...nodes.map((node) => node.position.y));
71
+ const centerX = nodes.reduce((sum, node) => sum + node.position.x, 0) / nodes.length;
72
+ const nodesByLayer = new Map();
73
+ nodes.forEach((node) => {
74
+ const layer = layerByNodeId.get(node.id) ?? 0;
75
+ const list = nodesByLayer.get(layer) ?? [];
76
+ list.push(node);
77
+ nodesByLayer.set(layer, list);
78
+ });
79
+ const newPositionByNodeId = new Map();
80
+ const layerOrder = Array.from(nodesByLayer.keys()).sort((a, b) => a - b);
81
+ const cumulativeExtraGapByLayer = new Map();
82
+ let cumulativeExtraGap = 0;
83
+ layerOrder.forEach((layer) => {
84
+ cumulativeExtraGapByLayer.set(layer, cumulativeExtraGap);
85
+ const layerNodes = nodesByLayer.get(layer) ?? [];
86
+ const hasCallFragment = layerNodes.some((node) => node.type === "callFragment");
87
+ if (hasCallFragment) {
88
+ cumulativeExtraGap += CALL_FRAGMENT_EXTRA_GAP;
89
+ }
90
+ });
91
+ Array.from(nodesByLayer.entries())
92
+ .sort((a, b) => a[0] - b[0])
93
+ .forEach(([layer, layerNodes]) => {
94
+ const visualLayerNodes = [...layerNodes].sort((a, b) => a.position.x - b.position.x);
95
+ const totalWidth = (visualLayerNodes.length - 1) * horizontalGap;
96
+ const startX = centerX - totalWidth / 2;
97
+ visualLayerNodes.forEach((node, index) => {
98
+ newPositionByNodeId.set(node.id, {
99
+ x: startX + index * horizontalGap,
100
+ y: minY + layer * verticalGap + (cumulativeExtraGapByLayer.get(layer) ?? 0),
101
+ });
102
+ });
103
+ });
104
+ return nodes.map((node) => ({
105
+ ...node,
106
+ position: newPositionByNodeId.get(node.id) ?? node.position,
107
+ }));
108
+ }
109
+ //# sourceMappingURL=flow-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-layout.js","sourceRoot":"","sources":["../../src/utils/flow-layout.ts"],"names":[],"mappings":"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"}