@alternative-path/x-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 (47) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +364 -0
  3. package/dist/agents/test-planner-context.d.ts +7 -0
  4. package/dist/agents/test-planner-context.d.ts.map +1 -0
  5. package/dist/agents/test-planner-context.js +283 -0
  6. package/dist/agents/test-planner-context.js.map +1 -0
  7. package/dist/agents/test-planner-prompt.d.ts +34 -0
  8. package/dist/agents/test-planner-prompt.d.ts.map +1 -0
  9. package/dist/agents/test-planner-prompt.js +82 -0
  10. package/dist/agents/test-planner-prompt.js.map +1 -0
  11. package/dist/api-client.d.ts +52 -0
  12. package/dist/api-client.d.ts.map +1 -0
  13. package/dist/api-client.js +240 -0
  14. package/dist/api-client.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +159 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/tools/auth-tools.d.ts +17 -0
  20. package/dist/tools/auth-tools.d.ts.map +1 -0
  21. package/dist/tools/auth-tools.js +154 -0
  22. package/dist/tools/auth-tools.js.map +1 -0
  23. package/dist/tools/automation-tools.d.ts +25 -0
  24. package/dist/tools/automation-tools.d.ts.map +1 -0
  25. package/dist/tools/automation-tools.js +399 -0
  26. package/dist/tools/automation-tools.js.map +1 -0
  27. package/dist/tools/export-import-tools.d.ts +16 -0
  28. package/dist/tools/export-import-tools.d.ts.map +1 -0
  29. package/dist/tools/export-import-tools.js +62 -0
  30. package/dist/tools/export-import-tools.js.map +1 -0
  31. package/dist/tools/module-tools.d.ts +42 -0
  32. package/dist/tools/module-tools.d.ts.map +1 -0
  33. package/dist/tools/module-tools.js +302 -0
  34. package/dist/tools/module-tools.js.map +1 -0
  35. package/dist/tools/project-tools.d.ts +44 -0
  36. package/dist/tools/project-tools.d.ts.map +1 -0
  37. package/dist/tools/project-tools.js +67 -0
  38. package/dist/tools/project-tools.js.map +1 -0
  39. package/dist/tools/testcase-tools.d.ts +129 -0
  40. package/dist/tools/testcase-tools.d.ts.map +1 -0
  41. package/dist/tools/testcase-tools.js +762 -0
  42. package/dist/tools/testcase-tools.js.map +1 -0
  43. package/dist/tools/testgroup-launch-tools.d.ts +28 -0
  44. package/dist/tools/testgroup-launch-tools.d.ts.map +1 -0
  45. package/dist/tools/testgroup-launch-tools.js +332 -0
  46. package/dist/tools/testgroup-launch-tools.js.map +1 -0
  47. package/package.json +56 -0
@@ -0,0 +1,399 @@
1
+ import { io } from "socket.io-client";
2
+ const DEFAULT_WS_URL = "wss://ap-agent.qa-path.com";
3
+ const WS_PATH = "/test-automation/socket.io/";
4
+ const DEFAULT_ORIGIN = "https://qa-path.com";
5
+ const EXECUTION_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
6
+ export class AutomationTools {
7
+ apiClient;
8
+ constructor(apiClient) {
9
+ this.apiClient = apiClient;
10
+ }
11
+ getTools() {
12
+ return [
13
+ {
14
+ name: "generate_nlp_script",
15
+ description: "Generate an automation script from NLP instructions using the Script Creator flow: runs the AI agent to interpret and execute the instructions, then saves the generated script to the specified test case. Returns execution logs and test steps in the response (not streamed in real time). If model is not provided, returns the list of available models so you can choose one and call again with modelId or modelName.",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ nlpInstructions: {
20
+ type: "string",
21
+ description: "NLP instructions (one per line or newline-separated). Example: 'open https://example.com\\nClick on Login\\nEnter username and password'",
22
+ },
23
+ modelId: {
24
+ type: "string",
25
+ description: "ID of the AI model to use for automation (from fetch-automation-models). Provide either modelId or modelName.",
26
+ },
27
+ modelName: {
28
+ type: "string",
29
+ description: "Name of the AI model to use (e.g. 'gpt-4o-mini'). If provided, the tool will resolve it to modelId. Provide either modelId or modelName.",
30
+ },
31
+ testCaseId: {
32
+ type: "string",
33
+ description: "UUID of the test case where the generated automation script will be saved (required for save step).",
34
+ },
35
+ projectId: {
36
+ type: "string",
37
+ description: "Project ID (UUID). If not provided, uses X_MCP_PROJECT_ID.",
38
+ },
39
+ },
40
+ required: ["nlpInstructions", "testCaseId"],
41
+ },
42
+ },
43
+ ];
44
+ }
45
+ handles(name) {
46
+ return name === "generate_nlp_script";
47
+ }
48
+ async handle(name, args) {
49
+ if (name === "generate_nlp_script") {
50
+ return await this.generateNlpScript(args);
51
+ }
52
+ throw new Error(`Unknown automation tool: ${name}`);
53
+ }
54
+ async fetchModels() {
55
+ const response = await this.apiClient.get("aimodel/fetch-automation-models");
56
+ if (!response.success || !response.data?.length) {
57
+ return [];
58
+ }
59
+ return response.data;
60
+ }
61
+ async getCurrentUserId() {
62
+ const response = await this.apiClient.get("auth/getCurrentLoggedInUser");
63
+ const userId = response.data?.user?.id;
64
+ if (!userId) {
65
+ throw new Error("Could not get current user. Please ensure you are logged in.");
66
+ }
67
+ return userId;
68
+ }
69
+ formatInstructions(nlpInstructions) {
70
+ const lines = nlpInstructions
71
+ .split(/\r?\n/)
72
+ .map((s) => s.trim())
73
+ .filter(Boolean);
74
+ return lines.map((line, i) => `${i + 1}. ${line}`).join("\n");
75
+ }
76
+ async runExecutionOverWebSocket(params) {
77
+ const { instructionsString, instructionsArray, modelId, projectId, userId } = params;
78
+ const wsUrl = process.env.X_MCP_WS_URL || DEFAULT_WS_URL;
79
+ const uniqueId = `mcp_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
80
+ const executionLogs = [];
81
+ const testSteps = [];
82
+ let tokenUsage = null;
83
+ const urlsToTry = [wsUrl];
84
+ try {
85
+ const baseUrl = this.apiClient.client?.defaults?.baseURL;
86
+ if (baseUrl)
87
+ urlsToTry.push(baseUrl);
88
+ }
89
+ catch (_) { }
90
+ let cookieString = "";
91
+ for (const u of urlsToTry) {
92
+ try {
93
+ const c = await this.apiClient.getCookieStringForUrl(u);
94
+ if (c && c.length > cookieString.length)
95
+ cookieString = c;
96
+ }
97
+ catch (_) { }
98
+ }
99
+ return new Promise((resolve) => {
100
+ let socket = null;
101
+ let replayPlan = null;
102
+ let testCompleteResult = null;
103
+ let resolved = false;
104
+ const finish = (err) => {
105
+ if (resolved)
106
+ return;
107
+ resolved = true;
108
+ if (socket) {
109
+ socket.removeAllListeners();
110
+ socket.disconnect();
111
+ }
112
+ if (err) {
113
+ resolve({ plan: null, error: err, executionLogs, testSteps, tokenUsage });
114
+ }
115
+ else {
116
+ resolve({
117
+ plan: replayPlan || testCompleteResult?.testPlan,
118
+ error: testCompleteResult?.error,
119
+ executionLogs,
120
+ testSteps,
121
+ tokenUsage,
122
+ });
123
+ }
124
+ };
125
+ const timeout = setTimeout(() => {
126
+ finish("Execution timed out (5 minutes). The automation agent may still be running.");
127
+ }, EXECUTION_TIMEOUT_MS);
128
+ try {
129
+ const origin = process.env.X_MCP_WS_ORIGIN || DEFAULT_ORIGIN;
130
+ const socketOptions = {
131
+ path: WS_PATH,
132
+ transports: ["polling", "websocket"],
133
+ reconnection: false,
134
+ forceNew: true,
135
+ withCredentials: true,
136
+ extraHeaders: {
137
+ Origin: origin,
138
+ ...(cookieString && { Cookie: cookieString }),
139
+ },
140
+ };
141
+ socket = io(wsUrl, socketOptions);
142
+ socket.on("connect", () => {
143
+ const instructionsPayload = instructionsArray.length > 0
144
+ ? instructionsArray.map((text, i) => ({ id: i + 1, text }))
145
+ : instructionsString;
146
+ socket.emit("executeTest", {
147
+ testId: uniqueId,
148
+ instructions: instructionsPayload,
149
+ model: modelId,
150
+ environmentId: null,
151
+ executionContext: {
152
+ projectId,
153
+ organizationId: null,
154
+ userId,
155
+ },
156
+ projectId,
157
+ });
158
+ });
159
+ socket.on("connect_error", (err) => {
160
+ clearTimeout(timeout);
161
+ const msg = err?.message || "Connection failed";
162
+ const extra = [err?.description, err?.context].filter(Boolean).join("; ");
163
+ finish(extra ? `${msg}. ${extra}` : msg);
164
+ });
165
+ socket.on("log", (data) => {
166
+ if (data && typeof data === "object") {
167
+ executionLogs.push({
168
+ ...data,
169
+ timestamp: data.timestamp ?? Date.now(),
170
+ message: data.message ?? data.text ?? JSON.stringify(data),
171
+ level: data.level ?? "info",
172
+ });
173
+ }
174
+ });
175
+ socket.on("testStep", (step) => {
176
+ if (step && typeof step === "object") {
177
+ testSteps.push({
178
+ ...step,
179
+ timestamp: step.timestamp ?? Date.now(),
180
+ id: step.id ?? `step_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
181
+ });
182
+ }
183
+ });
184
+ socket.on("tokenUsage", (usage) => {
185
+ if (usage && typeof usage === "object")
186
+ tokenUsage = usage;
187
+ });
188
+ socket.on("replayPlan", (data) => {
189
+ if (data)
190
+ replayPlan = data;
191
+ });
192
+ socket.on("testComplete", (result) => {
193
+ testCompleteResult = result;
194
+ clearTimeout(timeout);
195
+ finish(result?.error);
196
+ });
197
+ socket.on("error", (err) => {
198
+ clearTimeout(timeout);
199
+ finish(err?.message || String(err));
200
+ });
201
+ }
202
+ catch (err) {
203
+ clearTimeout(timeout);
204
+ finish(err?.message || String(err));
205
+ }
206
+ });
207
+ }
208
+ async generateNlpScript(args) {
209
+ const { nlpInstructions, modelId: argModelId, modelName: argModelName, testCaseId, projectId: argProjectId, } = args;
210
+ const projectId = argProjectId || this.apiClient["projectId"];
211
+ if (!projectId) {
212
+ return this.jsonResponse({
213
+ success: false,
214
+ message: "Project ID is required. Provide projectId or set X_MCP_PROJECT_ID.",
215
+ });
216
+ }
217
+ if (!nlpInstructions || typeof nlpInstructions !== "string") {
218
+ return this.jsonResponse({
219
+ success: false,
220
+ message: "nlpInstructions (string) is required.",
221
+ });
222
+ }
223
+ const models = await this.fetchModels();
224
+ if (!argModelId && !argModelName) {
225
+ return this.jsonResponse({
226
+ success: true,
227
+ message: "No model specified. Please call generate_nlp_script again with modelId or modelName from the list below.",
228
+ models: models.map((m) => ({ id: m.id, name: m.name })),
229
+ });
230
+ }
231
+ let modelId = argModelId;
232
+ if (!modelId && argModelName) {
233
+ const matched = models.find((m) => m.name?.toLowerCase() === String(argModelName).toLowerCase());
234
+ if (!matched) {
235
+ return this.jsonResponse({
236
+ success: false,
237
+ message: `Model not found: '${argModelName}'. Available models: ${models.map((m) => m.name).join(", ")}`,
238
+ models: models.map((m) => ({ id: m.id, name: m.name })),
239
+ });
240
+ }
241
+ modelId = matched.id;
242
+ }
243
+ const instructionsFormatted = this.formatInstructions(nlpInstructions);
244
+ const instructionsArray = instructionsFormatted.split("\n").filter(Boolean);
245
+ const userId = await this.getCurrentUserId();
246
+ const { plan, error: executionError, executionLogs, testSteps, tokenUsage, } = await this.runExecutionOverWebSocket({
247
+ instructionsString: instructionsFormatted,
248
+ instructionsArray,
249
+ modelId: modelId,
250
+ projectId,
251
+ userId,
252
+ });
253
+ if (executionError) {
254
+ return this.jsonResponse({
255
+ success: false,
256
+ message: "Automation execution failed.",
257
+ error: executionError,
258
+ executionLogs: executionLogs.slice(-100),
259
+ testSteps: testSteps.slice(-50),
260
+ });
261
+ }
262
+ if (!plan || !plan.steps) {
263
+ return this.jsonResponse({
264
+ success: false,
265
+ message: "No automation plan was generated. The agent may not have produced steps.",
266
+ executionLogs: executionLogs.slice(-100),
267
+ testSteps: testSteps.slice(-50),
268
+ });
269
+ }
270
+ try {
271
+ await this.apiClient.put(`${projectId}/auto-execution/updateExecutionRecord`, {
272
+ testCaseId,
273
+ plan,
274
+ });
275
+ }
276
+ catch (err) {
277
+ return this.jsonResponse({
278
+ success: false,
279
+ message: "Failed to save execution record to test case.",
280
+ error: err?.message || String(err),
281
+ executionLogs: executionLogs.slice(-100),
282
+ testSteps: testSteps.slice(-50),
283
+ });
284
+ }
285
+ const automationInstruction = instructionsArray.map((text, i) => ({ id: i + 1, text }));
286
+ try {
287
+ await this.apiClient.put(`${projectId}/auto-execution/updateAutomationInstruction`, { testCaseId, automationInstruction });
288
+ }
289
+ catch (err) {
290
+ return this.jsonResponse({
291
+ success: true,
292
+ message: "Execution record saved, but automation instruction text could not be updated.",
293
+ testCaseId,
294
+ executionRecordSaved: true,
295
+ error: err?.message || String(err),
296
+ executionLogs: executionLogs.slice(-100),
297
+ testSteps: testSteps.slice(-50),
298
+ stepsCount: Array.isArray(plan.steps) ? plan.steps.length : 0,
299
+ });
300
+ }
301
+ return this.jsonResponse({
302
+ success: true,
303
+ message: "NLP script generated and saved to the test case successfully.",
304
+ testCaseId,
305
+ stepsCount: Array.isArray(plan.steps) ? plan.steps.length : 0,
306
+ executionLogs: executionLogs.slice(-100),
307
+ testSteps: testSteps.slice(-50),
308
+ tokenUsage: tokenUsage ?? undefined,
309
+ });
310
+ }
311
+ formatToolOutput(obj) {
312
+ const success = obj.success === true;
313
+ const message = obj.message || "";
314
+ if (success && obj.models?.length) {
315
+ const names = obj.models.map((m) => m.name ?? m.id).join(", ");
316
+ return `**${message}**\n\nAvailable models: ${names}`;
317
+ }
318
+ if (!success && !obj.executionLogs?.length) {
319
+ let out = `**${message}**`;
320
+ if (obj.error)
321
+ out += `\n\nError: ${obj.error}`;
322
+ if (obj.models?.length) {
323
+ out += `\n\nAvailable models: ${obj.models.map((m) => m.name ?? m.id).join(", ")}`;
324
+ }
325
+ return out;
326
+ }
327
+ if (!success) {
328
+ let out = `**${message}**`;
329
+ if (obj.error)
330
+ out += `\n\nError: ${obj.error}`;
331
+ const passed = obj.testSteps?.filter((s) => s?.passed).length ?? 0;
332
+ const total = obj.testSteps?.length ?? 0;
333
+ if (total > 0)
334
+ out += `\n\nSteps executed: ${passed}/${total}`;
335
+ return out;
336
+ }
337
+ const stepsCount = obj.stepsCount ?? 0;
338
+ const testSteps = Array.isArray(obj.testSteps) ? obj.testSteps : [];
339
+ const passed = testSteps.filter((s) => s?.passed).length;
340
+ const total = testSteps.length || stepsCount;
341
+ const executionTime = this.parseExecutionTime(obj.executionLogs);
342
+ const status = this.parseStatus(obj.executionLogs) ?? (passed === total && total > 0 ? "PASSED" : null);
343
+ let out = "**The NLP automation script ran successfully and was saved to the test case.**\n\n";
344
+ out += "| | |\n|---|---|\n";
345
+ out += `| **Test case** | ${obj.testCaseId ?? "—"} |\n`;
346
+ out += `| **Status** | ${status ?? "—"} |\n`;
347
+ out += `| **Steps in plan** | ${stepsCount} |\n`;
348
+ out += `| **Passed** | ${total > 0 ? `${passed}/${total}` : "—"} |\n`;
349
+ if (executionTime)
350
+ out += `| **Execution time** | ${executionTime} |\n`;
351
+ if (testSteps.length > 0) {
352
+ out += "\n**What was generated**\n\n";
353
+ testSteps.forEach((s, i) => {
354
+ const desc = s.stepDescription ?? s.code ?? `Step ${i + 1}`;
355
+ out += `- ${desc}\n`;
356
+ });
357
+ }
358
+ out += "\nThe plan includes Playwright steps and assertions. Both the execution record (plan) and the automation instruction text were saved to the test case. You can open the test case in QA Path to view or run the script.";
359
+ return out;
360
+ }
361
+ parseExecutionTime(logs) {
362
+ if (!Array.isArray(logs))
363
+ return null;
364
+ const line = logs.find((l) => {
365
+ const msg = l?.message ?? l?.text ?? "";
366
+ return typeof msg === "string" && msg.includes("Execution Time:");
367
+ });
368
+ const msg = line?.message ?? line?.text ?? "";
369
+ const match = typeof msg === "string" && msg.match(/Execution Time:\s*([\d.]+s?)/);
370
+ return match ? `~${match[1]}` : null;
371
+ }
372
+ parseStatus(logs) {
373
+ if (!Array.isArray(logs))
374
+ return null;
375
+ const line = logs.find((l) => {
376
+ const msg = l?.message ?? l?.text ?? "";
377
+ return typeof msg === "string" && (msg.includes("Status: PASSED") || msg.includes("Status: FAILED"));
378
+ });
379
+ const msg = line?.message ?? line?.text ?? "";
380
+ if (typeof msg !== "string")
381
+ return null;
382
+ if (msg.includes("Status: PASSED"))
383
+ return "PASSED";
384
+ if (msg.includes("Status: FAILED"))
385
+ return "FAILED";
386
+ return null;
387
+ }
388
+ formattedResponse(obj) {
389
+ const summary = this.formatToolOutput(obj);
390
+ const text = summary + "\n\n<details>\n<summary>Full response (JSON)</summary>\n\n```json\n" + JSON.stringify(obj, null, 2) + "\n```\n</details>";
391
+ return {
392
+ content: [{ type: "text", text }],
393
+ };
394
+ }
395
+ jsonResponse(obj) {
396
+ return this.formattedResponse(obj);
397
+ }
398
+ }
399
+ //# sourceMappingURL=automation-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-tools.js","sourceRoot":"","sources":["../../src/tools/automation-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { ApiClient } from "../api-client.js";
3
+ export declare class ExportImportTools {
4
+ private apiClient;
5
+ constructor(apiClient: ApiClient);
6
+ getTools(): Tool[];
7
+ handles(name: string): boolean;
8
+ handle(name: string, args: any): Promise<{
9
+ content: {
10
+ type: string;
11
+ text: string;
12
+ }[];
13
+ }>;
14
+ private getExportStructure;
15
+ }
16
+ //# sourceMappingURL=export-import-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-import-tools.d.ts","sourceRoot":"","sources":["../../src/tools/export-import-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,iBAAiB;IAChB,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAExC,QAAQ,IAAI,IAAI,EAAE;IAoBlB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMxB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;;;;;;YAStB,kBAAkB;CAgCjC"}
@@ -0,0 +1,62 @@
1
+ export class ExportImportTools {
2
+ apiClient;
3
+ constructor(apiClient) {
4
+ this.apiClient = apiClient;
5
+ }
6
+ getTools() {
7
+ return [
8
+ {
9
+ name: "get_export_structure",
10
+ description: "Get the module structure and test case fields needed for export. Returns JSON with modules hierarchy and available test case fields. This can be used to generate Excel templates.",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ projectId: {
15
+ type: "string",
16
+ description: "Optional project ID. If not provided, uses the configured project ID.",
17
+ },
18
+ },
19
+ },
20
+ },
21
+ ];
22
+ }
23
+ handles(name) {
24
+ return [
25
+ "get_export_structure",
26
+ ].includes(name);
27
+ }
28
+ async handle(name, args) {
29
+ switch (name) {
30
+ case "get_export_structure":
31
+ return await this.getExportStructure(args);
32
+ default:
33
+ throw new Error(`Unknown export/import tool: ${name}`);
34
+ }
35
+ }
36
+ async getExportStructure(args) {
37
+ const { projectId: argProjectId } = args;
38
+ const projectId = argProjectId || this.apiClient["projectId"];
39
+ if (!projectId) {
40
+ throw new Error("Project ID is required. Provide it as an argument or set X_MCP_PROJECT_ID.");
41
+ }
42
+ try {
43
+ const response = await this.apiClient.get("/testcase/get_excel_template", {
44
+ headers: {
45
+ "x-project-id": projectId,
46
+ },
47
+ });
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: JSON.stringify(response, null, 2),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (error) {
58
+ throw new Error(`Failed to get export structure: ${error.message}`);
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=export-import-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-import-tools.js","sourceRoot":"","sources":["../../src/tools/export-import-tools.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,iBAAiB;IACR;IAApB,YAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE5C,QAAQ;QACN,OAAO;YACL;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,WAAW,EACT,oLAAoL;gBACtL,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,WAAW,EACT,uEAAuE;yBAC1E;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,OAAO;YACL,sBAAsB;SACvB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAS;QAClC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,sBAAsB;gBACzB,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC7C;gBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,IAAS;QACxC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QACzC,MAAM,SAAS,GAAG,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAGtC,8BAA8B,EAAE;gBACjC,OAAO,EAAE;oBACP,cAAc,EAAE,SAAS;iBAC1B;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;qBACxC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { ApiClient } from "../api-client.js";
3
+ export interface Module {
4
+ id: string;
5
+ parent_id: string | null;
6
+ project_id: string;
7
+ name: string;
8
+ level: number;
9
+ created_at: string;
10
+ updated_at: string;
11
+ deletedAt: string | null;
12
+ context: string;
13
+ children: Module[];
14
+ }
15
+ export interface ModulesResponse {
16
+ success: boolean;
17
+ message: string;
18
+ data: Module[];
19
+ }
20
+ export interface ModuleResponse {
21
+ success: boolean;
22
+ message: string;
23
+ data: Module;
24
+ }
25
+ export declare class ModuleTools {
26
+ private apiClient;
27
+ constructor(apiClient: ApiClient);
28
+ getTools(): Tool[];
29
+ handles(name: string): boolean;
30
+ handle(name: string, args: any): Promise<{
31
+ content: {
32
+ type: string;
33
+ text: string;
34
+ }[];
35
+ }>;
36
+ private listModules;
37
+ private createModule;
38
+ private updateModule;
39
+ private deleteModule;
40
+ private getModule;
41
+ }
42
+ //# sourceMappingURL=module-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-tools.d.ts","sourceRoot":"","sources":["../../src/tools/module-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAExC,QAAQ,IAAI,IAAI,EAAE;IAgHlB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAUxB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;;;;;;YAiBtB,WAAW;YA4BX,YAAY;YAsEZ,YAAY;YA2CZ,YAAY;YAsCZ,SAAS;CA0CxB"}