n8n-mcp 2.10.8 → 2.11.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 (74) hide show
  1. package/.env.example +21 -1
  2. package/README.md +73 -19
  3. package/data/nodes.db +0 -0
  4. package/dist/mcp/handlers-n8n-manager.d.ts.map +1 -1
  5. package/dist/mcp/handlers-n8n-manager.js +3 -0
  6. package/dist/mcp/handlers-n8n-manager.js.map +1 -1
  7. package/dist/mcp/server.d.ts +2 -0
  8. package/dist/mcp/server.d.ts.map +1 -1
  9. package/dist/mcp/server.js +121 -32
  10. package/dist/mcp/server.js.map +1 -1
  11. package/dist/mcp/tool-docs/index.d.ts.map +1 -1
  12. package/dist/mcp/tool-docs/index.js +1 -0
  13. package/dist/mcp/tool-docs/index.js.map +1 -1
  14. package/dist/mcp/tool-docs/templates/index.d.ts +1 -0
  15. package/dist/mcp/tool-docs/templates/index.d.ts.map +1 -1
  16. package/dist/mcp/tool-docs/templates/index.js +3 -1
  17. package/dist/mcp/tool-docs/templates/index.js.map +1 -1
  18. package/dist/mcp/tool-docs/templates/search-templates-by-metadata.d.ts +3 -0
  19. package/dist/mcp/tool-docs/templates/search-templates-by-metadata.d.ts.map +1 -0
  20. package/dist/mcp/tool-docs/templates/search-templates-by-metadata.js +120 -0
  21. package/dist/mcp/tool-docs/templates/search-templates-by-metadata.js.map +1 -0
  22. package/dist/mcp/tools.d.ts.map +1 -1
  23. package/dist/mcp/tools.js +124 -4
  24. package/dist/mcp/tools.js.map +1 -1
  25. package/dist/scripts/fetch-templates.d.ts +1 -1
  26. package/dist/scripts/fetch-templates.d.ts.map +1 -1
  27. package/dist/scripts/fetch-templates.js +167 -44
  28. package/dist/scripts/fetch-templates.js.map +1 -1
  29. package/dist/scripts/generate-metadata-only.d.ts +3 -0
  30. package/dist/scripts/generate-metadata-only.d.ts.map +1 -0
  31. package/dist/scripts/generate-metadata-only.js +146 -0
  32. package/dist/scripts/generate-metadata-only.js.map +1 -0
  33. package/dist/scripts/generate-metadata-sync.d.ts +3 -0
  34. package/dist/scripts/generate-metadata-sync.d.ts.map +1 -0
  35. package/dist/scripts/generate-metadata-sync.js +136 -0
  36. package/dist/scripts/generate-metadata-sync.js.map +1 -0
  37. package/dist/scripts/test-batch-processing.d.ts +3 -0
  38. package/dist/scripts/test-batch-processing.d.ts.map +1 -0
  39. package/dist/scripts/test-batch-processing.js +144 -0
  40. package/dist/scripts/test-batch-processing.js.map +1 -0
  41. package/dist/scripts/test-metadata-generation.d.ts +3 -0
  42. package/dist/scripts/test-metadata-generation.d.ts.map +1 -0
  43. package/dist/scripts/test-metadata-generation.js +96 -0
  44. package/dist/scripts/test-metadata-generation.js.map +1 -0
  45. package/dist/scripts/validation-summary.js +1 -1
  46. package/dist/scripts/validation-summary.js.map +1 -1
  47. package/dist/templates/batch-processor.d.ts +35 -0
  48. package/dist/templates/batch-processor.d.ts.map +1 -0
  49. package/dist/templates/batch-processor.js +280 -0
  50. package/dist/templates/batch-processor.js.map +1 -0
  51. package/dist/templates/metadata-generator.d.ts +52 -0
  52. package/dist/templates/metadata-generator.d.ts.map +1 -0
  53. package/dist/templates/metadata-generator.js +254 -0
  54. package/dist/templates/metadata-generator.js.map +1 -0
  55. package/dist/templates/template-fetcher.d.ts +1 -0
  56. package/dist/templates/template-fetcher.d.ts.map +1 -1
  57. package/dist/templates/template-fetcher.js +23 -19
  58. package/dist/templates/template-fetcher.js.map +1 -1
  59. package/dist/templates/template-repository.d.ts +58 -5
  60. package/dist/templates/template-repository.d.ts.map +1 -1
  61. package/dist/templates/template-repository.js +408 -25
  62. package/dist/templates/template-repository.js.map +1 -1
  63. package/dist/templates/template-service.d.ts +50 -5
  64. package/dist/templates/template-service.d.ts.map +1 -1
  65. package/dist/templates/template-service.js +163 -21
  66. package/dist/templates/template-service.js.map +1 -1
  67. package/dist/types/n8n-api.d.ts +1 -0
  68. package/dist/types/n8n-api.d.ts.map +1 -1
  69. package/dist/types/n8n-api.js.map +1 -1
  70. package/dist/utils/template-node-resolver.d.ts +2 -0
  71. package/dist/utils/template-node-resolver.d.ts.map +1 -0
  72. package/dist/utils/template-node-resolver.js +161 -0
  73. package/dist/utils/template-node-resolver.js.map +1 -0
  74. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ import { MetadataRequest, MetadataResult } from './metadata-generator';
2
+ export interface BatchProcessorOptions {
3
+ apiKey: string;
4
+ model?: string;
5
+ batchSize?: number;
6
+ outputDir?: string;
7
+ }
8
+ export interface BatchJob {
9
+ id: string;
10
+ status: 'validating' | 'in_progress' | 'finalizing' | 'completed' | 'failed' | 'expired' | 'cancelled';
11
+ created_at: number;
12
+ completed_at?: number;
13
+ input_file_id: string;
14
+ output_file_id?: string;
15
+ error?: any;
16
+ }
17
+ export declare class BatchProcessor {
18
+ private client;
19
+ private generator;
20
+ private batchSize;
21
+ private outputDir;
22
+ constructor(options: BatchProcessorOptions);
23
+ processTemplates(templates: MetadataRequest[], progressCallback?: (message: string, current: number, total: number) => void): Promise<Map<number, MetadataResult>>;
24
+ private submitBatch;
25
+ private processBatch;
26
+ private createBatches;
27
+ private createBatchFile;
28
+ private uploadFile;
29
+ private createBatchJob;
30
+ private monitorBatchJob;
31
+ private retrieveResults;
32
+ private cleanup;
33
+ private sleep;
34
+ }
35
+ //# sourceMappingURL=batch-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../../src/templates/batch-processor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE1F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACvG,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,GAAG,CAAC;CACb;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,qBAAqB;IAepC,gBAAgB,CACpB,SAAS,EAAE,eAAe,EAAE,EAC5B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAC3E,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAwEzB,WAAW;YA6CX,YAAY;IAiC1B,OAAO,CAAC,aAAa;YAaP,eAAe;YAwBf,UAAU;YAcV,cAAc;YAcd,eAAe;YAmDf,eAAe;YAgCf,OAAO;IA8BrB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.BatchProcessor = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const openai_1 = __importDefault(require("openai"));
43
+ const logger_1 = require("../utils/logger");
44
+ const metadata_generator_1 = require("./metadata-generator");
45
+ class BatchProcessor {
46
+ constructor(options) {
47
+ this.client = new openai_1.default({ apiKey: options.apiKey });
48
+ this.generator = new metadata_generator_1.MetadataGenerator(options.apiKey, options.model);
49
+ this.batchSize = options.batchSize || 100;
50
+ this.outputDir = options.outputDir || './temp';
51
+ if (!fs.existsSync(this.outputDir)) {
52
+ fs.mkdirSync(this.outputDir, { recursive: true });
53
+ }
54
+ }
55
+ async processTemplates(templates, progressCallback) {
56
+ const results = new Map();
57
+ const batches = this.createBatches(templates);
58
+ logger_1.logger.info(`Processing ${templates.length} templates in ${batches.length} batches`);
59
+ console.log(`\n📤 Submitting ${batches.length} batch${batches.length > 1 ? 'es' : ''} to OpenAI...`);
60
+ const batchJobs = [];
61
+ for (let i = 0; i < batches.length; i++) {
62
+ const batch = batches[i];
63
+ const batchNum = i + 1;
64
+ try {
65
+ progressCallback?.(`Submitting batch ${batchNum}/${batches.length}`, i * this.batchSize, templates.length);
66
+ const jobPromise = this.submitBatch(batch, `batch_${batchNum}`);
67
+ batchJobs.push({ batchNum, jobPromise, templates: batch });
68
+ console.log(` 📨 Submitted batch ${batchNum}/${batches.length} (${batch.length} templates)`);
69
+ }
70
+ catch (error) {
71
+ logger_1.logger.error(`Error submitting batch ${batchNum}:`, error);
72
+ console.error(` ❌ Failed to submit batch ${batchNum}`);
73
+ }
74
+ }
75
+ console.log(`\n⏳ All batches submitted. Waiting for completion...`);
76
+ console.log(` (Batches process in parallel - this is much faster than sequential processing)`);
77
+ const batchPromises = batchJobs.map(async ({ batchNum, jobPromise, templates: batchTemplates }) => {
78
+ try {
79
+ const completedJob = await jobPromise;
80
+ console.log(`\n📦 Retrieving results for batch ${batchNum}/${batches.length}...`);
81
+ const batchResults = await this.retrieveResults(completedJob);
82
+ logger_1.logger.info(`Retrieved ${batchResults.length} results from batch ${batchNum}`);
83
+ progressCallback?.(`Retrieved batch ${batchNum}/${batches.length}`, Math.min(batchNum * this.batchSize, templates.length), templates.length);
84
+ return { batchNum, results: batchResults };
85
+ }
86
+ catch (error) {
87
+ logger_1.logger.error(`Error processing batch ${batchNum}:`, error);
88
+ console.error(` ❌ Batch ${batchNum} failed:`, error);
89
+ return { batchNum, results: [] };
90
+ }
91
+ });
92
+ const allBatchResults = await Promise.all(batchPromises);
93
+ for (const { batchNum, results: batchResults } of allBatchResults) {
94
+ for (const result of batchResults) {
95
+ results.set(result.templateId, result);
96
+ }
97
+ if (batchResults.length > 0) {
98
+ console.log(` ✅ Merged ${batchResults.length} results from batch ${batchNum}`);
99
+ }
100
+ }
101
+ logger_1.logger.info(`Batch processing complete: ${results.size} results`);
102
+ return results;
103
+ }
104
+ async submitBatch(templates, batchName) {
105
+ const inputFile = await this.createBatchFile(templates, batchName);
106
+ try {
107
+ const uploadedFile = await this.uploadFile(inputFile);
108
+ const batchJob = await this.createBatchJob(uploadedFile.id);
109
+ const monitoringPromise = this.monitorBatchJob(batchJob.id);
110
+ try {
111
+ fs.unlinkSync(inputFile);
112
+ }
113
+ catch { }
114
+ monitoringPromise.then(async (completedJob) => {
115
+ try {
116
+ await this.client.files.del(uploadedFile.id);
117
+ if (completedJob.output_file_id) {
118
+ }
119
+ }
120
+ catch (error) {
121
+ logger_1.logger.warn(`Failed to cleanup files for batch ${batchName}`, error);
122
+ }
123
+ });
124
+ return monitoringPromise;
125
+ }
126
+ catch (error) {
127
+ try {
128
+ fs.unlinkSync(inputFile);
129
+ }
130
+ catch { }
131
+ throw error;
132
+ }
133
+ }
134
+ async processBatch(templates, batchName) {
135
+ const inputFile = await this.createBatchFile(templates, batchName);
136
+ try {
137
+ const uploadedFile = await this.uploadFile(inputFile);
138
+ const batchJob = await this.createBatchJob(uploadedFile.id);
139
+ const completedJob = await this.monitorBatchJob(batchJob.id);
140
+ const results = await this.retrieveResults(completedJob);
141
+ await this.cleanup(inputFile, uploadedFile.id, completedJob.output_file_id);
142
+ return results;
143
+ }
144
+ catch (error) {
145
+ try {
146
+ fs.unlinkSync(inputFile);
147
+ }
148
+ catch { }
149
+ throw error;
150
+ }
151
+ }
152
+ createBatches(templates) {
153
+ const batches = [];
154
+ for (let i = 0; i < templates.length; i += this.batchSize) {
155
+ batches.push(templates.slice(i, i + this.batchSize));
156
+ }
157
+ return batches;
158
+ }
159
+ async createBatchFile(templates, batchName) {
160
+ const filename = path.join(this.outputDir, `${batchName}_${Date.now()}.jsonl`);
161
+ const stream = fs.createWriteStream(filename);
162
+ for (const template of templates) {
163
+ const request = this.generator.createBatchRequest(template);
164
+ stream.write(JSON.stringify(request) + '\n');
165
+ }
166
+ stream.end();
167
+ await new Promise((resolve, reject) => {
168
+ stream.on('finish', () => resolve());
169
+ stream.on('error', reject);
170
+ });
171
+ logger_1.logger.debug(`Created batch file: ${filename} with ${templates.length} requests`);
172
+ return filename;
173
+ }
174
+ async uploadFile(filepath) {
175
+ const file = fs.createReadStream(filepath);
176
+ const uploadedFile = await this.client.files.create({
177
+ file,
178
+ purpose: 'batch'
179
+ });
180
+ logger_1.logger.debug(`Uploaded file: ${uploadedFile.id}`);
181
+ return uploadedFile;
182
+ }
183
+ async createBatchJob(fileId) {
184
+ const batchJob = await this.client.batches.create({
185
+ input_file_id: fileId,
186
+ endpoint: '/v1/chat/completions',
187
+ completion_window: '24h'
188
+ });
189
+ logger_1.logger.info(`Created batch job: ${batchJob.id}`);
190
+ return batchJob;
191
+ }
192
+ async monitorBatchJob(batchId) {
193
+ const waitTimes = [30, 60, 120, 300, 600, 900, 1800];
194
+ let waitIndex = 0;
195
+ let attempts = 0;
196
+ const maxAttempts = 100;
197
+ const startTime = Date.now();
198
+ let lastStatus = '';
199
+ while (attempts < maxAttempts) {
200
+ const batchJob = await this.client.batches.retrieve(batchId);
201
+ if (batchJob.status !== lastStatus) {
202
+ const elapsedMinutes = Math.floor((Date.now() - startTime) / 60000);
203
+ const statusSymbol = batchJob.status === 'in_progress' ? '⚙️' :
204
+ batchJob.status === 'finalizing' ? '📦' :
205
+ batchJob.status === 'validating' ? '🔍' : '⏳';
206
+ console.log(` ${statusSymbol} Batch ${batchId.slice(-8)}: ${batchJob.status} (${elapsedMinutes} min)`);
207
+ lastStatus = batchJob.status;
208
+ }
209
+ logger_1.logger.debug(`Batch ${batchId} status: ${batchJob.status} (attempt ${attempts + 1})`);
210
+ if (batchJob.status === 'completed') {
211
+ const elapsedMinutes = Math.floor((Date.now() - startTime) / 60000);
212
+ console.log(` ✅ Batch ${batchId.slice(-8)} completed in ${elapsedMinutes} minutes`);
213
+ logger_1.logger.info(`Batch job ${batchId} completed successfully`);
214
+ return batchJob;
215
+ }
216
+ if (['failed', 'expired', 'cancelled'].includes(batchJob.status)) {
217
+ throw new Error(`Batch job failed with status: ${batchJob.status}`);
218
+ }
219
+ const waitTime = waitTimes[Math.min(waitIndex, waitTimes.length - 1)];
220
+ logger_1.logger.debug(`Waiting ${waitTime} seconds before next check...`);
221
+ await this.sleep(waitTime * 1000);
222
+ waitIndex = Math.min(waitIndex + 1, waitTimes.length - 1);
223
+ attempts++;
224
+ }
225
+ throw new Error(`Batch job monitoring timed out after ${maxAttempts} attempts`);
226
+ }
227
+ async retrieveResults(batchJob) {
228
+ if (!batchJob.output_file_id) {
229
+ throw new Error('No output file available for batch job');
230
+ }
231
+ const fileResponse = await this.client.files.content(batchJob.output_file_id);
232
+ const fileContent = await fileResponse.text();
233
+ const results = [];
234
+ const lines = fileContent.trim().split('\n');
235
+ for (const line of lines) {
236
+ if (!line)
237
+ continue;
238
+ try {
239
+ const result = JSON.parse(line);
240
+ const parsed = this.generator.parseResult(result);
241
+ results.push(parsed);
242
+ }
243
+ catch (error) {
244
+ logger_1.logger.error('Error parsing result line:', error);
245
+ }
246
+ }
247
+ logger_1.logger.info(`Retrieved ${results.length} results from batch job`);
248
+ return results;
249
+ }
250
+ async cleanup(localFile, inputFileId, outputFileId) {
251
+ try {
252
+ fs.unlinkSync(localFile);
253
+ logger_1.logger.debug(`Deleted local file: ${localFile}`);
254
+ }
255
+ catch (error) {
256
+ logger_1.logger.warn(`Failed to delete local file: ${localFile}`, error);
257
+ }
258
+ try {
259
+ await this.client.files.del(inputFileId);
260
+ logger_1.logger.debug(`Deleted input file from OpenAI: ${inputFileId}`);
261
+ }
262
+ catch (error) {
263
+ logger_1.logger.warn(`Failed to delete input file from OpenAI: ${inputFileId}`, error);
264
+ }
265
+ if (outputFileId) {
266
+ try {
267
+ await this.client.files.del(outputFileId);
268
+ logger_1.logger.debug(`Deleted output file from OpenAI: ${outputFileId}`);
269
+ }
270
+ catch (error) {
271
+ logger_1.logger.warn(`Failed to delete output file from OpenAI: ${outputFileId}`, error);
272
+ }
273
+ }
274
+ }
275
+ sleep(ms) {
276
+ return new Promise(resolve => setTimeout(resolve, ms));
277
+ }
278
+ }
279
+ exports.BatchProcessor = BatchProcessor;
280
+ //# sourceMappingURL=batch-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-processor.js","sourceRoot":"","sources":["../../src/templates/batch-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ export declare const TemplateMetadataSchema: z.ZodObject<{
3
+ categories: z.ZodArray<z.ZodString, "many">;
4
+ complexity: z.ZodEnum<["simple", "medium", "complex"]>;
5
+ use_cases: z.ZodArray<z.ZodString, "many">;
6
+ estimated_setup_minutes: z.ZodNumber;
7
+ required_services: z.ZodArray<z.ZodString, "many">;
8
+ key_features: z.ZodArray<z.ZodString, "many">;
9
+ target_audience: z.ZodArray<z.ZodString, "many">;
10
+ }, "strip", z.ZodTypeAny, {
11
+ complexity: "simple" | "medium" | "complex";
12
+ categories: string[];
13
+ use_cases: string[];
14
+ estimated_setup_minutes: number;
15
+ required_services: string[];
16
+ key_features: string[];
17
+ target_audience: string[];
18
+ }, {
19
+ complexity: "simple" | "medium" | "complex";
20
+ categories: string[];
21
+ use_cases: string[];
22
+ estimated_setup_minutes: number;
23
+ required_services: string[];
24
+ key_features: string[];
25
+ target_audience: string[];
26
+ }>;
27
+ export type TemplateMetadata = z.infer<typeof TemplateMetadataSchema>;
28
+ export interface MetadataRequest {
29
+ templateId: number;
30
+ name: string;
31
+ description?: string;
32
+ nodes: string[];
33
+ workflow?: any;
34
+ }
35
+ export interface MetadataResult {
36
+ templateId: number;
37
+ metadata: TemplateMetadata;
38
+ error?: string;
39
+ }
40
+ export declare class MetadataGenerator {
41
+ private client;
42
+ private model;
43
+ constructor(apiKey: string, model?: string);
44
+ private getJsonSchema;
45
+ createBatchRequest(template: MetadataRequest): any;
46
+ private sanitizeInput;
47
+ private summarizeNodes;
48
+ parseResult(result: any): MetadataResult;
49
+ private getDefaultMetadata;
50
+ generateSingle(template: MetadataRequest): Promise<TemplateMetadata>;
51
+ }
52
+ //# sourceMappingURL=metadata-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-generator.d.ts","sourceRoot":"","sources":["../../src/templates/metadata-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;EAQjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAsB;IAQzD,OAAO,CAAC,aAAa;IAiErB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,GAAG;IA+ClD,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,cAAc;IAwDtB,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,cAAc;IAsCxC,OAAO,CAAC,kBAAkB;IAepB,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAmC3E"}
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MetadataGenerator = exports.TemplateMetadataSchema = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const zod_1 = require("zod");
9
+ const logger_1 = require("../utils/logger");
10
+ exports.TemplateMetadataSchema = zod_1.z.object({
11
+ categories: zod_1.z.array(zod_1.z.string()).max(5).describe('Main categories (max 5)'),
12
+ complexity: zod_1.z.enum(['simple', 'medium', 'complex']).describe('Implementation complexity'),
13
+ use_cases: zod_1.z.array(zod_1.z.string()).max(5).describe('Primary use cases'),
14
+ estimated_setup_minutes: zod_1.z.number().min(5).max(480).describe('Setup time in minutes'),
15
+ required_services: zod_1.z.array(zod_1.z.string()).describe('External services needed'),
16
+ key_features: zod_1.z.array(zod_1.z.string()).max(5).describe('Main capabilities'),
17
+ target_audience: zod_1.z.array(zod_1.z.string()).max(3).describe('Target users')
18
+ });
19
+ class MetadataGenerator {
20
+ constructor(apiKey, model = 'gpt-4o-mini') {
21
+ this.client = new openai_1.default({ apiKey });
22
+ this.model = model;
23
+ }
24
+ getJsonSchema() {
25
+ return {
26
+ name: 'template_metadata',
27
+ strict: true,
28
+ schema: {
29
+ type: 'object',
30
+ properties: {
31
+ categories: {
32
+ type: 'array',
33
+ items: { type: 'string' },
34
+ maxItems: 5,
35
+ description: 'Main categories like automation, integration, data processing'
36
+ },
37
+ complexity: {
38
+ type: 'string',
39
+ enum: ['simple', 'medium', 'complex'],
40
+ description: 'Implementation complexity level'
41
+ },
42
+ use_cases: {
43
+ type: 'array',
44
+ items: { type: 'string' },
45
+ maxItems: 5,
46
+ description: 'Primary use cases for this template'
47
+ },
48
+ estimated_setup_minutes: {
49
+ type: 'number',
50
+ minimum: 5,
51
+ maximum: 480,
52
+ description: 'Estimated setup time in minutes'
53
+ },
54
+ required_services: {
55
+ type: 'array',
56
+ items: { type: 'string' },
57
+ description: 'External services or APIs required'
58
+ },
59
+ key_features: {
60
+ type: 'array',
61
+ items: { type: 'string' },
62
+ maxItems: 5,
63
+ description: 'Main capabilities or features'
64
+ },
65
+ target_audience: {
66
+ type: 'array',
67
+ items: { type: 'string' },
68
+ maxItems: 3,
69
+ description: 'Target users like developers, marketers, analysts'
70
+ }
71
+ },
72
+ required: [
73
+ 'categories',
74
+ 'complexity',
75
+ 'use_cases',
76
+ 'estimated_setup_minutes',
77
+ 'required_services',
78
+ 'key_features',
79
+ 'target_audience'
80
+ ],
81
+ additionalProperties: false
82
+ }
83
+ };
84
+ }
85
+ createBatchRequest(template) {
86
+ const nodesSummary = this.summarizeNodes(template.nodes);
87
+ const sanitizedName = this.sanitizeInput(template.name, Math.max(200, template.name.length));
88
+ const sanitizedDescription = template.description ?
89
+ this.sanitizeInput(template.description, 500) : '';
90
+ const context = [
91
+ `Template: ${sanitizedName}`,
92
+ sanitizedDescription ? `Description: ${sanitizedDescription}` : '',
93
+ `Nodes Used (${template.nodes.length}): ${nodesSummary}`,
94
+ template.workflow ? `Workflow has ${template.workflow.nodes?.length || 0} nodes with ${Object.keys(template.workflow.connections || {}).length} connections` : ''
95
+ ].filter(Boolean).join('\n');
96
+ return {
97
+ custom_id: `template-${template.templateId}`,
98
+ method: 'POST',
99
+ url: '/v1/chat/completions',
100
+ body: {
101
+ model: this.model,
102
+ temperature: 0.3,
103
+ max_completion_tokens: 1000,
104
+ response_format: {
105
+ type: 'json_schema',
106
+ json_schema: this.getJsonSchema()
107
+ },
108
+ messages: [
109
+ {
110
+ role: 'system',
111
+ content: `Analyze n8n workflow templates and extract metadata. Be concise.`
112
+ },
113
+ {
114
+ role: 'user',
115
+ content: context
116
+ }
117
+ ]
118
+ }
119
+ };
120
+ }
121
+ sanitizeInput(input, maxLength) {
122
+ let sanitized = input.slice(0, maxLength);
123
+ sanitized = sanitized.replace(/[\x00-\x1F\x7F-\x9F]/g, '');
124
+ sanitized = sanitized.replace(/\s+/g, ' ').trim();
125
+ sanitized = sanitized.replace(/\b(system|assistant|user|human|ai):/gi, '');
126
+ sanitized = sanitized.replace(/```[\s\S]*?```/g, '');
127
+ sanitized = sanitized.replace(/\[INST\]|\[\/INST\]/g, '');
128
+ return sanitized;
129
+ }
130
+ summarizeNodes(nodes) {
131
+ const nodeGroups = {};
132
+ for (const node of nodes) {
133
+ const baseName = node.split('.').pop() || node;
134
+ if (baseName.includes('webhook') || baseName.includes('http')) {
135
+ nodeGroups['HTTP/Webhooks'] = (nodeGroups['HTTP/Webhooks'] || 0) + 1;
136
+ }
137
+ else if (baseName.includes('database') || baseName.includes('postgres') || baseName.includes('mysql')) {
138
+ nodeGroups['Database'] = (nodeGroups['Database'] || 0) + 1;
139
+ }
140
+ else if (baseName.includes('slack') || baseName.includes('email') || baseName.includes('gmail')) {
141
+ nodeGroups['Communication'] = (nodeGroups['Communication'] || 0) + 1;
142
+ }
143
+ else if (baseName.includes('ai') || baseName.includes('openai') || baseName.includes('langchain') ||
144
+ baseName.toLowerCase().includes('openai') || baseName.includes('agent')) {
145
+ nodeGroups['AI/ML'] = (nodeGroups['AI/ML'] || 0) + 1;
146
+ }
147
+ else if (baseName.includes('sheet') || baseName.includes('csv') || baseName.includes('excel') ||
148
+ baseName.toLowerCase().includes('googlesheets')) {
149
+ nodeGroups['Spreadsheets'] = (nodeGroups['Spreadsheets'] || 0) + 1;
150
+ }
151
+ else {
152
+ let displayName;
153
+ if (node.includes('.with.') && node.includes('@')) {
154
+ displayName = node.split('/').pop() || baseName;
155
+ }
156
+ else {
157
+ if (baseName.endsWith('Trigger') && baseName.length > 7) {
158
+ displayName = baseName.slice(0, -7);
159
+ }
160
+ else if (baseName.endsWith('Node') && baseName.length > 4 && baseName !== 'unknownNode') {
161
+ displayName = baseName.slice(0, -4);
162
+ }
163
+ else {
164
+ displayName = baseName;
165
+ }
166
+ }
167
+ nodeGroups[displayName] = (nodeGroups[displayName] || 0) + 1;
168
+ }
169
+ }
170
+ const summary = Object.entries(nodeGroups)
171
+ .sort((a, b) => b[1] - a[1])
172
+ .slice(0, 10)
173
+ .map(([name, count]) => count > 1 ? `${name} (${count})` : name)
174
+ .join(', ');
175
+ return summary;
176
+ }
177
+ parseResult(result) {
178
+ try {
179
+ if (result.error) {
180
+ return {
181
+ templateId: parseInt(result.custom_id.replace('template-', '')),
182
+ metadata: this.getDefaultMetadata(),
183
+ error: result.error.message
184
+ };
185
+ }
186
+ const response = result.response;
187
+ if (!response?.body?.choices?.[0]?.message?.content) {
188
+ throw new Error('Invalid response structure');
189
+ }
190
+ const content = response.body.choices[0].message.content;
191
+ const metadata = JSON.parse(content);
192
+ const validated = exports.TemplateMetadataSchema.parse(metadata);
193
+ return {
194
+ templateId: parseInt(result.custom_id.replace('template-', '')),
195
+ metadata: validated
196
+ };
197
+ }
198
+ catch (error) {
199
+ logger_1.logger.error(`Error parsing result for ${result.custom_id}:`, error);
200
+ return {
201
+ templateId: parseInt(result.custom_id.replace('template-', '')),
202
+ metadata: this.getDefaultMetadata(),
203
+ error: error instanceof Error ? error.message : 'Unknown error'
204
+ };
205
+ }
206
+ }
207
+ getDefaultMetadata() {
208
+ return {
209
+ categories: ['automation'],
210
+ complexity: 'medium',
211
+ use_cases: ['Process automation'],
212
+ estimated_setup_minutes: 30,
213
+ required_services: [],
214
+ key_features: ['Workflow automation'],
215
+ target_audience: ['developers']
216
+ };
217
+ }
218
+ async generateSingle(template) {
219
+ try {
220
+ const completion = await this.client.chat.completions.create({
221
+ model: this.model,
222
+ temperature: 0.3,
223
+ max_completion_tokens: 1000,
224
+ response_format: {
225
+ type: 'json_schema',
226
+ json_schema: this.getJsonSchema()
227
+ },
228
+ messages: [
229
+ {
230
+ role: 'system',
231
+ content: `Analyze n8n workflow templates and extract metadata. Be concise.`
232
+ },
233
+ {
234
+ role: 'user',
235
+ content: `Template: ${template.name}\nNodes: ${template.nodes.slice(0, 10).join(', ')}`
236
+ }
237
+ ]
238
+ });
239
+ const content = completion.choices[0].message.content;
240
+ if (!content) {
241
+ logger_1.logger.error('No content in OpenAI response');
242
+ throw new Error('No content in response');
243
+ }
244
+ const metadata = JSON.parse(content);
245
+ return exports.TemplateMetadataSchema.parse(metadata);
246
+ }
247
+ catch (error) {
248
+ logger_1.logger.error('Error generating single metadata:', error);
249
+ return this.getDefaultMetadata();
250
+ }
251
+ }
252
+ }
253
+ exports.MetadataGenerator = MetadataGenerator;
254
+ //# sourceMappingURL=metadata-generator.js.map