@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,91 @@
1
+ import { z } from "zod";
2
+ export declare const ListVariablesSchema: z.ZodObject<{
3
+ project_id: z.ZodString;
4
+ response_format: z.ZodDefault<z.ZodEnum<["markdown", "json"]>>;
5
+ }, "strict", z.ZodTypeAny, {
6
+ response_format: "markdown" | "json";
7
+ project_id: string;
8
+ }, {
9
+ project_id: string;
10
+ response_format?: "markdown" | "json" | undefined;
11
+ }>;
12
+ export declare const CreateVariableSchema: z.ZodObject<{
13
+ project_id: z.ZodString;
14
+ name: z.ZodString;
15
+ values: z.ZodObject<{
16
+ dev: z.ZodOptional<z.ZodString>;
17
+ staging: z.ZodOptional<z.ZodString>;
18
+ prod: z.ZodOptional<z.ZodString>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ dev?: string | undefined;
21
+ staging?: string | undefined;
22
+ prod?: string | undefined;
23
+ }, {
24
+ dev?: string | undefined;
25
+ staging?: string | undefined;
26
+ prod?: string | undefined;
27
+ }>;
28
+ }, "strict", z.ZodTypeAny, {
29
+ values: {
30
+ dev?: string | undefined;
31
+ staging?: string | undefined;
32
+ prod?: string | undefined;
33
+ };
34
+ name: string;
35
+ project_id: string;
36
+ }, {
37
+ values: {
38
+ dev?: string | undefined;
39
+ staging?: string | undefined;
40
+ prod?: string | undefined;
41
+ };
42
+ name: string;
43
+ project_id: string;
44
+ }>;
45
+ export declare const UpdateVariableSchema: z.ZodObject<{
46
+ project_id: z.ZodString;
47
+ variable_id: z.ZodString;
48
+ name: z.ZodOptional<z.ZodString>;
49
+ values: z.ZodOptional<z.ZodObject<{
50
+ dev: z.ZodOptional<z.ZodString>;
51
+ staging: z.ZodOptional<z.ZodString>;
52
+ prod: z.ZodOptional<z.ZodString>;
53
+ }, "strip", z.ZodTypeAny, {
54
+ dev?: string | undefined;
55
+ staging?: string | undefined;
56
+ prod?: string | undefined;
57
+ }, {
58
+ dev?: string | undefined;
59
+ staging?: string | undefined;
60
+ prod?: string | undefined;
61
+ }>>;
62
+ }, "strict", z.ZodTypeAny, {
63
+ project_id: string;
64
+ variable_id: string;
65
+ values?: {
66
+ dev?: string | undefined;
67
+ staging?: string | undefined;
68
+ prod?: string | undefined;
69
+ } | undefined;
70
+ name?: string | undefined;
71
+ }, {
72
+ project_id: string;
73
+ variable_id: string;
74
+ values?: {
75
+ dev?: string | undefined;
76
+ staging?: string | undefined;
77
+ prod?: string | undefined;
78
+ } | undefined;
79
+ name?: string | undefined;
80
+ }>;
81
+ export declare const DeleteVariableSchema: z.ZodObject<{
82
+ project_id: z.ZodString;
83
+ variable_id: z.ZodString;
84
+ }, "strict", z.ZodTypeAny, {
85
+ project_id: string;
86
+ variable_id: string;
87
+ }, {
88
+ project_id: string;
89
+ variable_id: string;
90
+ }>;
91
+ //# sourceMappingURL=variable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variable.d.ts","sourceRoot":"","sources":["../../src/schemas/variable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,mBAAmB;;;;;;;;;EAGrB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQtB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAStB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;;;;;;;EAGtB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { ResponseFormatSchema } from "./common.js";
3
+ export const ListVariablesSchema = z.object({
4
+ project_id: z.string().uuid("Invalid project ID").describe("The project ID"),
5
+ response_format: ResponseFormatSchema,
6
+ }).strict();
7
+ export const CreateVariableSchema = z.object({
8
+ project_id: z.string().uuid("Invalid project ID").describe("The project ID"),
9
+ name: z.string().min(1, "Name is required").max(100).describe("Variable name (e.g., 'API_URL', 'TEST_PASSWORD')"),
10
+ values: z.object({
11
+ dev: z.string().optional().describe("Value for dev environment"),
12
+ staging: z.string().optional().describe("Value for staging environment"),
13
+ prod: z.string().optional().describe("Value for prod environment"),
14
+ }).describe("Environment-specific values"),
15
+ }).strict();
16
+ export const UpdateVariableSchema = z.object({
17
+ project_id: z.string().uuid("Invalid project ID").describe("The project ID"),
18
+ variable_id: z.string().uuid("Invalid variable ID").describe("The variable ID"),
19
+ name: z.string().min(1).max(100).optional().describe("New variable name"),
20
+ values: z.object({
21
+ dev: z.string().optional(),
22
+ staging: z.string().optional(),
23
+ prod: z.string().optional(),
24
+ }).optional().describe("Updated environment values"),
25
+ }).strict();
26
+ export const DeleteVariableSchema = z.object({
27
+ project_id: z.string().uuid("Invalid project ID").describe("The project ID"),
28
+ variable_id: z.string().uuid("Invalid variable ID").describe("The variable ID to delete"),
29
+ }).strict();
30
+ //# sourceMappingURL=variable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variable.js","sourceRoot":"","sources":["../../src/schemas/variable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC5E,eAAe,EAAE,oBAAoB;CACtC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC5E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IACjH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACnE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAC3C,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IACzE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CACrD,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CAC1F,CAAC,CAAC,MAAM,EAAE,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Qualitas API Client
3
+ *
4
+ * HTTP client wrapping all Qualitas API endpoints with API key authentication.
5
+ * Used by all MCP tools to communicate with the Qualitas backend.
6
+ */
7
+ import type { QualitasApiResponse, ProjectData, FlowData, RunData, RunStepData, VariableData } from "../types.js";
8
+ /**
9
+ * Convert API errors into actionable, LLM-friendly messages.
10
+ */
11
+ export declare function handleApiError(error: unknown): string;
12
+ export declare class QualitasApiClient {
13
+ private client;
14
+ private maxRetries;
15
+ private retryDelay;
16
+ constructor(apiKey: string, baseUrl?: string, options?: {
17
+ maxRetries?: number;
18
+ retryDelay?: number;
19
+ });
20
+ private request;
21
+ listProjects(params?: {
22
+ page?: number;
23
+ limit?: number;
24
+ search?: string;
25
+ status?: string;
26
+ sort?: string;
27
+ }): Promise<QualitasApiResponse<ProjectData[]>>;
28
+ getProject(projectId: string): Promise<QualitasApiResponse<ProjectData>>;
29
+ createProject(data: {
30
+ name: string;
31
+ description?: string;
32
+ icon?: string;
33
+ icon_color?: string;
34
+ base_url?: string;
35
+ }): Promise<QualitasApiResponse<ProjectData>>;
36
+ updateProject(projectId: string, data: {
37
+ name?: string;
38
+ description?: string;
39
+ base_url?: string;
40
+ }): Promise<QualitasApiResponse<ProjectData>>;
41
+ listFlows(projectId: string, params?: {
42
+ page?: number;
43
+ limit?: number;
44
+ search?: string;
45
+ status?: string;
46
+ }): Promise<QualitasApiResponse<FlowData[]>>;
47
+ getFlow(projectId: string, flowId: string): Promise<QualitasApiResponse<FlowData>>;
48
+ createFlow(projectId: string, data: {
49
+ name: string;
50
+ description?: string;
51
+ type?: "flow" | "fragment";
52
+ environment?: string;
53
+ nodes: unknown[];
54
+ edges: unknown[];
55
+ variables?: unknown[];
56
+ }): Promise<QualitasApiResponse<FlowData>>;
57
+ updateFlow(projectId: string, flowId: string, data: {
58
+ name?: string;
59
+ description?: string;
60
+ environment?: string;
61
+ nodes?: unknown[];
62
+ edges?: unknown[];
63
+ variables?: unknown[];
64
+ }): Promise<QualitasApiResponse<FlowData>>;
65
+ deleteFlow(projectId: string, flowId: string): Promise<void>;
66
+ publishFlow(projectId: string, flowId: string): Promise<QualitasApiResponse<FlowData>>;
67
+ runFlow(projectId: string, flowId: string, config?: {
68
+ environment?: string;
69
+ headless?: boolean;
70
+ browser?: string;
71
+ viewport?: {
72
+ width: number;
73
+ height: number;
74
+ };
75
+ }): Promise<QualitasApiResponse<RunData>>;
76
+ getRunStatus(projectId: string, flowId: string, runId: string): Promise<QualitasApiResponse<RunData>>;
77
+ getRunSteps(runId: string): Promise<QualitasApiResponse<RunStepData[]>>;
78
+ listRuns(projectId: string, flowId: string, params?: {
79
+ page?: number;
80
+ limit?: number;
81
+ }): Promise<QualitasApiResponse<RunData[]>>;
82
+ listVariables(projectId: string): Promise<QualitasApiResponse<VariableData[]>>;
83
+ createVariable(projectId: string, data: {
84
+ name: string;
85
+ values: {
86
+ dev?: string;
87
+ staging?: string;
88
+ prod?: string;
89
+ };
90
+ }): Promise<QualitasApiResponse<VariableData>>;
91
+ updateVariable(projectId: string, variableId: string, data: {
92
+ name?: string;
93
+ values?: {
94
+ dev?: string;
95
+ staging?: string;
96
+ prod?: string;
97
+ };
98
+ }): Promise<QualitasApiResponse<VariableData>>;
99
+ deleteVariable(projectId: string, variableId: string): Promise<void>;
100
+ }
101
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Qualitas API Client
3
+ *
4
+ * HTTP client wrapping all Qualitas API endpoints with API key authentication.
5
+ * Used by all MCP tools to communicate with the Qualitas backend.
6
+ */
7
+ import axios, { AxiosError } from "axios";
8
+ import { API_BASE_URL } from "../constants.js";
9
+ // ===========================================
10
+ // Error Handling
11
+ // ===========================================
12
+ /**
13
+ * Convert API errors into actionable, LLM-friendly messages.
14
+ */
15
+ export function handleApiError(error) {
16
+ if (error instanceof AxiosError) {
17
+ if (error.response) {
18
+ const status = error.response.status;
19
+ const body = error.response.data;
20
+ const apiMessage = body?.error?.message;
21
+ switch (status) {
22
+ case 401:
23
+ return ("Error: Authentication failed. Your API key is invalid or expired. " +
24
+ "Generate a new one from your Qualitas Developer Settings page " +
25
+ "and update the QUALITAS_API_KEY environment variable.");
26
+ case 403:
27
+ return ("Error: Access denied. You don't have permission to access this resource. " +
28
+ "Ensure your API key has the required scope and you belong to the correct workspace.");
29
+ case 404:
30
+ return ("Error: Resource not found. " +
31
+ (apiMessage || "Please verify the ID is correct and the resource exists."));
32
+ case 422:
33
+ return ("Error: Validation failed. " +
34
+ (apiMessage || "Check your input parameters for invalid values.") +
35
+ (body?.error?.details
36
+ ? ` Details: ${JSON.stringify(body.error.details)}`
37
+ : ""));
38
+ case 429:
39
+ return ("Error: Rate limit exceeded. Too many requests. " +
40
+ "Please wait a moment before trying again.");
41
+ default:
42
+ return `Error: API request failed with status ${status}. ${apiMessage || "Please try again later."}`;
43
+ }
44
+ }
45
+ if (error.code === "ECONNABORTED" || error.code === "ETIMEDOUT") {
46
+ return "Error: Request timed out. The Qualitas API may be temporarily unavailable. Please try again.";
47
+ }
48
+ if (error.code === "ECONNREFUSED") {
49
+ return "Error: Connection refused. Please verify the QUALITAS_API_URL is correct.";
50
+ }
51
+ if (error.request) {
52
+ return "Error: No response received from the Qualitas API. Please check your network connection.";
53
+ }
54
+ }
55
+ return `Error: Unexpected error occurred: ${error instanceof Error ? error.message : String(error)}`;
56
+ }
57
+ // ===========================================
58
+ // API Client Class
59
+ // ===========================================
60
+ export class QualitasApiClient {
61
+ client;
62
+ maxRetries;
63
+ retryDelay;
64
+ constructor(apiKey, baseUrl = API_BASE_URL, options) {
65
+ this.maxRetries = options?.maxRetries ?? 3;
66
+ this.retryDelay = options?.retryDelay ?? 1000;
67
+ this.client = axios.create({
68
+ baseURL: baseUrl,
69
+ timeout: 30000,
70
+ headers: {
71
+ "Content-Type": "application/json",
72
+ Accept: "application/json",
73
+ Authorization: `Bearer ${apiKey}`,
74
+ },
75
+ });
76
+ }
77
+ // -------------------------------------------
78
+ // Shared request method with retry logic
79
+ // -------------------------------------------
80
+ async request(method, path, data, params) {
81
+ // For DELETE with no body, remove Content-Type to avoid Fastify rejection
82
+ const extraHeaders = method === "DELETE" && !data
83
+ ? { "Content-Type": undefined }
84
+ : {};
85
+ let lastError = null;
86
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
87
+ try {
88
+ const response = await this.client({
89
+ method,
90
+ url: path,
91
+ data,
92
+ params,
93
+ headers: extraHeaders,
94
+ });
95
+ return response.data;
96
+ }
97
+ catch (error) {
98
+ lastError = error instanceof Error ? error : new Error(String(error));
99
+ // Don't retry on client errors (4xx) except 429 (rate limit)
100
+ if (axios.isAxiosError(error) && error.response) {
101
+ const status = error.response.status;
102
+ if (status >= 400 && status < 500 && status !== 429) {
103
+ throw error;
104
+ }
105
+ }
106
+ // Don't retry on last attempt
107
+ if (attempt === this.maxRetries) {
108
+ break;
109
+ }
110
+ // Wait before retrying (exponential backoff)
111
+ const delay = this.retryDelay * Math.pow(2, attempt);
112
+ await new Promise((resolve) => setTimeout(resolve, delay));
113
+ }
114
+ }
115
+ throw lastError;
116
+ }
117
+ // ===========================================
118
+ // PROJECT METHODS
119
+ // ===========================================
120
+ async listProjects(params) {
121
+ return this.request("GET", "/projects", undefined, params);
122
+ }
123
+ async getProject(projectId) {
124
+ return this.request("GET", `/projects/${projectId}`);
125
+ }
126
+ async createProject(data) {
127
+ return this.request("POST", "/projects", data);
128
+ }
129
+ async updateProject(projectId, data) {
130
+ return this.request("PUT", `/projects/${projectId}`, data);
131
+ }
132
+ // ===========================================
133
+ // FLOW METHODS
134
+ // ===========================================
135
+ async listFlows(projectId, params) {
136
+ return this.request("GET", `/projects/${projectId}/flows`, undefined, params);
137
+ }
138
+ async getFlow(projectId, flowId) {
139
+ return this.request("GET", `/projects/${projectId}/flows/${flowId}`);
140
+ }
141
+ async createFlow(projectId, data) {
142
+ return this.request("POST", `/projects/${projectId}/flows`, data);
143
+ }
144
+ async updateFlow(projectId, flowId, data) {
145
+ return this.request("PUT", `/projects/${projectId}/flows/${flowId}`, data);
146
+ }
147
+ async deleteFlow(projectId, flowId) {
148
+ await this.request("DELETE", `/projects/${projectId}/flows/${flowId}`);
149
+ }
150
+ async publishFlow(projectId, flowId) {
151
+ return this.request("POST", `/projects/${projectId}/flows/${flowId}/publish`, {});
152
+ }
153
+ // ===========================================
154
+ // RUN METHODS
155
+ // ===========================================
156
+ async runFlow(projectId, flowId, config) {
157
+ return this.request("POST", `/projects/${projectId}/flows/${flowId}/run`, config);
158
+ }
159
+ async getRunStatus(projectId, flowId, runId) {
160
+ return this.request("GET", `/runs/${runId}`);
161
+ }
162
+ async getRunSteps(runId) {
163
+ return this.request("GET", `/runs/${runId}/steps`);
164
+ }
165
+ async listRuns(projectId, flowId, params) {
166
+ return this.request("GET", `/projects/${projectId}/flows/${flowId}/runs`, undefined, params);
167
+ }
168
+ // ===========================================
169
+ // VARIABLE METHODS
170
+ // ===========================================
171
+ async listVariables(projectId) {
172
+ return this.request("GET", `/projects/${projectId}/variables`);
173
+ }
174
+ async createVariable(projectId, data) {
175
+ return this.request("POST", `/projects/${projectId}/variables`, data);
176
+ }
177
+ async updateVariable(projectId, variableId, data) {
178
+ return this.request("PUT", `/projects/${projectId}/variables/${variableId}`, data);
179
+ }
180
+ async deleteVariable(projectId, variableId) {
181
+ await this.request("DELETE", `/projects/${projectId}/variables/${variableId}`);
182
+ }
183
+ }
184
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Flow Generator Service
3
+ *
4
+ * Generates Qualitas flow graphs from natural language scenarios.
5
+ * Maps scenario steps to appropriate node types and builds the
6
+ * full FlowNode/FlowEdge/Variable structure ready for the API.
7
+ */
8
+ import type { FlowNode, FlowEdge, Variable } from "@qualitas-id/shared-types";
9
+ export declare const NODE_REFERENCE = "## Available Flow Node Types (40 types)\n\nUse these node types when constructing flows. Each node has a `type` and a `data` object with type-specific fields.\nFields marked **required** must be provided. All others are optional.\n\nVariable references: Use `{{project.VAR_NAME}}` for project variables, `{{flow.VAR_NAME}}` for flow variables.\nSelectors: Use CSS selectors (e.g., `.btn-primary`, `#email-input`, `[data-testid=\"submit\"]`).\n\n---\n\n### Triggers\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `start` | Entry point of the flow (always first node) | _(none)_ | `label`, `description`, `timeout` |\n| `schedule` | Cron-based scheduled trigger | `cron` (string, e.g. \"0 9 * * 1-5\") | `description`, `timeout` |\n\n### Navigation\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `navigate` | Navigate to a URL | `url` (string) | `waitUntil` (\"load\" \\| \"domcontentloaded\" \\| \"networkidle\"), `description`, `timeout` |\n| `reload` | Reload the current page | _(none)_ | `waitUntil`, `description`, `timeout` |\n| `goBack` | Browser back navigation | _(none)_ | `description`, `timeout` |\n| `goForward` | Browser forward navigation | _(none)_ | `description`, `timeout` |\n\n### Mouse Actions\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `click` | Click an element | `selector` (string) | `button` (\"left\" \\| \"right\" \\| \"middle\"), `clickCount`, `position` ({x,y}), `description`, `timeout` |\n| `dblclick` | Double-click an element | `selector` | `position`, `description`, `timeout` |\n| `rightclick` | Right-click an element | `selector` | `position`, `description`, `timeout` |\n| `hover` | Hover over an element | `selector` | `position`, `description`, `timeout` |\n| `dragAndDrop` | Drag from source to target | `sourceSelector`, `targetSelector` | `description`, `timeout` |\n\n### Input\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `fill` | Fill a text input (replaces content) | `selector`, `text` | `description`, `timeout` |\n| `type` | Type text character by character | `selector`, `text` | `delay` (ms between keystrokes), `description`, `timeout` |\n| `clear` | Clear an input field | `selector` | `description`, `timeout` |\n| `press` | Press a keyboard key | `key` (e.g. \"Enter\", \"Tab\", \"Escape\", \"ArrowDown\") | `selector` (focus first), `modifiers` (array of \"ctrl\"/\"alt\"/\"shift\"/\"meta\"), `description`, `timeout` |\n\n### Form\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `submit` | Submit a form | `selector` | `description`, `timeout` |\n| `check` | Check a checkbox | `selector` | `description`, `timeout` |\n| `uncheck` | Uncheck a checkbox | `selector` | `description`, `timeout` |\n| `select` | Select dropdown option | `selector`, `value` | `byLabel` (boolean - select by visible label), `description`, `timeout` |\n| `upload` | Upload a file | `selector`, `filePath` | `description`, `timeout`. `filePath` can be: local path, URL (http/https), or base64 data URL |\n\n### Focus / Scroll\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `focus` | Focus an element | `selector` | `description`, `timeout` |\n| `blur` | Remove focus from element | `selector` | `description`, `timeout` |\n| `scroll` | Scroll the page or element | _(none)_ | `selector`, `x`, `y`, `behavior` (\"auto\" \\| \"smooth\"), `direction` (\"up\"/\"down\"/\"left\"/\"right\"), `amount`, `description`, `timeout` |\n| `scrollIntoView` | Scroll element into view | `selector` | `behavior`, `description`, `timeout` |\n\n### Wait / Sync\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `wait` | Wait for a duration | `duration` (ms) | `description`, `timeout` |\n| `waitForElement` | Wait for element state | `selector` | `state` (\"visible\" \\| \"hidden\" \\| \"attached\" \\| \"detached\"), `description`, `timeout` |\n| `waitForNavigation` | Wait for page navigation | _(none)_ | `url` (URL pattern), `description`, `timeout` |\n| `waitForResponse` | Wait for network response | `urlPattern` (string) | `method`, `statusCode`, `description`, `timeout` |\n\n### Assertions\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `assertVisible` | Assert element visibility | `selector` | `state` (\"visible\" \\| \"hidden\"), `description`, `timeout` |\n| `assertText` | Assert element text content | `selector`, `expectedText` | `exact` (boolean), `description`, `timeout` |\n| `assertValue` | Assert input value | `selector`, `expectedValue` | `description`, `timeout` |\n| `assertUrl` | Assert current URL | `expectedUrl` | `exact` (boolean), `description`, `timeout` |\n| `assertTitle` | Assert page title | `expectedTitle` | `exact` (boolean), `description`, `timeout` |\n| `assertVariable` | Assert variable comparison | `leftValue`, `operator`, `rightValue` | `description`, `timeout`. Operators: \"equals\", \"notEquals\", \"contains\", \"greaterThan\", \"lessThan\" |\n| `assertTableCell` | Assert table cell value | `tableSelector`, `findColumnName`, `findOperator`, `findValue`, `assertColumnName`, `assertOperator`, `expectedValue` | `description`, `timeout` |\n| `assertCount` | Assert element count | `selector`, `operator`, `expectedValue` (number) | `description`, `timeout`. Operators: \"equals\", \"greaterThan\", \"lessThan\" |\n\n### Utility\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `screenshot` | Take a screenshot | _(none)_ | `name`, `fullPage` (boolean), `description`, `timeout` |\n| `extractFromElement` | Extract data from element | `selector`, `extractType`, `saveAs` | `attributeName`, `trim`, `toNumber`, `regex`, `replace`, `description`, `timeout`. extractType: \"text\" \\| \"value\" \\| \"attribute\" \\| \"count\" |\n| `ifCondition` | Conditional branching | `saveResultAs` | `conditionType` (\"variable\" \\| \"element\"), `leftValue`, `operator`, `rightValue`, `selector`, `description`, `timeout` |\n| `loop` | Loop over items | `loopVariableName` | `loopType` (\"list\" \\| \"elements\"), `dataSource`, `selector`, `description`, `timeout` |\n| `executeScript` | Run custom JavaScript | `script` (string) | `description`, `timeout` |\n\n### Integration\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `apiCall` | Make an HTTP request | `method`, `url` | `headers` (array of {key, value, enabled}), `body`, `extractions` (array of {id, variableName, type, expression}), `description`, `timeout` |\n| `generateEmail` | Generate a test email | `outputKey` | `emailName`, `retentionMinutes`, `provider`, `localPartPrefix`, `description`, `timeout` |\n| `readEmail` | Read from email inbox | `inboxId`, `outputKey` | `generatedFrom`, `subjectContains`, `bodyContains`, `fromContains`, `timeoutMs`, `pollIntervalMs`, `description` |\n| `extractEmail` | Extract data from email | `source`, `variableName`, `pattern` | `readSourceNodeId`, `sourceField`, `extractionMode`, `flags`, `matchIndex`, `selector`, `selectorTarget`, `attributeName`, `description`, `timeout` |\n\n### Reusable\n\n| Type | Description | Required Fields | Optional Fields |\n|------|-------------|-----------------|-----------------|\n| `callFragment` | Call a reusable flow fragment | `fragmentId` | `fragmentName`, `description`, `timeout` |\n";
10
+ interface GenerateFlowParams {
11
+ scenario: string;
12
+ name?: string;
13
+ environment?: string;
14
+ }
15
+ interface GeneratedFlow {
16
+ name: string;
17
+ nodes: FlowNode[];
18
+ edges: FlowEdge[];
19
+ variables: Variable[];
20
+ }
21
+ /**
22
+ * Generate a complete flow graph from a natural language scenario.
23
+ *
24
+ * @param params.scenario - Natural language description of the test steps
25
+ * @param params.name - Optional flow name (auto-generated from scenario if not provided)
26
+ * @param params.environment - Target environment (dev/staging/prod)
27
+ * @returns Generated flow with nodes, edges, and variables
28
+ */
29
+ export declare function generateFlowFromScenario(params: GenerateFlowParams): GeneratedFlow;
30
+ export {};
31
+ //# sourceMappingURL=flow-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-generator.d.ts","sourceRoot":"","sources":["../../src/services/flow-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAgB,MAAM,2BAA2B,CAAC;AAO5F,eAAO,MAAM,cAAc,osPA8G1B,CAAC;AAMF,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AA6bD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,aAAa,CA+GlF"}