n8n-mcp 2.13.1 → 2.14.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.
- package/README.md +45 -0
- package/data/nodes.db +0 -0
- package/dist/database/node-repository.d.ts +5 -0
- package/dist/database/node-repository.d.ts.map +1 -1
- package/dist/database/node-repository.js +90 -0
- package/dist/database/node-repository.js.map +1 -1
- package/dist/errors/validation-service-error.d.ts +10 -0
- package/dist/errors/validation-service-error.d.ts.map +1 -0
- package/dist/errors/validation-service-error.js +26 -0
- package/dist/errors/validation-service-error.js.map +1 -0
- package/dist/mcp/handlers-n8n-manager.d.ts.map +1 -1
- package/dist/mcp/handlers-n8n-manager.js +6 -0
- package/dist/mcp/handlers-n8n-manager.js.map +1 -1
- package/dist/mcp/index.js +32 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +57 -19
- package/dist/mcp/server.js.map +1 -1
- package/dist/services/config-validator.d.ts +1 -0
- package/dist/services/config-validator.d.ts.map +1 -1
- package/dist/services/config-validator.js.map +1 -1
- package/dist/services/enhanced-config-validator.d.ts +6 -0
- package/dist/services/enhanced-config-validator.d.ts.map +1 -1
- package/dist/services/enhanced-config-validator.js +127 -0
- package/dist/services/enhanced-config-validator.js.map +1 -1
- package/dist/services/operation-similarity-service.d.ts +32 -0
- package/dist/services/operation-similarity-service.d.ts.map +1 -0
- package/dist/services/operation-similarity-service.js +341 -0
- package/dist/services/operation-similarity-service.js.map +1 -0
- package/dist/services/resource-similarity-service.d.ts +33 -0
- package/dist/services/resource-similarity-service.d.ts.map +1 -0
- package/dist/services/resource-similarity-service.js +358 -0
- package/dist/services/resource-similarity-service.js.map +1 -0
- package/dist/telemetry/batch-processor.d.ts +32 -0
- package/dist/telemetry/batch-processor.d.ts.map +1 -0
- package/dist/telemetry/batch-processor.js +266 -0
- package/dist/telemetry/batch-processor.js.map +1 -0
- package/dist/telemetry/config-manager.d.ts +28 -0
- package/dist/telemetry/config-manager.d.ts.map +1 -0
- package/dist/telemetry/config-manager.js +211 -0
- package/dist/telemetry/config-manager.js.map +1 -0
- package/dist/telemetry/event-tracker.d.ts +58 -0
- package/dist/telemetry/event-tracker.d.ts.map +1 -0
- package/dist/telemetry/event-tracker.js +295 -0
- package/dist/telemetry/event-tracker.js.map +1 -0
- package/dist/telemetry/event-validator.d.ts +78 -0
- package/dist/telemetry/event-validator.d.ts.map +1 -0
- package/dist/telemetry/event-validator.js +204 -0
- package/dist/telemetry/event-validator.js.map +1 -0
- package/dist/telemetry/index.d.ts +5 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +11 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/performance-monitor.d.ts +113 -0
- package/dist/telemetry/performance-monitor.d.ts.map +1 -0
- package/dist/telemetry/performance-monitor.js +208 -0
- package/dist/telemetry/performance-monitor.js.map +1 -0
- package/dist/telemetry/rate-limiter.d.ts +30 -0
- package/dist/telemetry/rate-limiter.d.ts.map +1 -0
- package/dist/telemetry/rate-limiter.js +103 -0
- package/dist/telemetry/rate-limiter.js.map +1 -0
- package/dist/telemetry/telemetry-error.d.ts +44 -0
- package/dist/telemetry/telemetry-error.d.ts.map +1 -0
- package/dist/telemetry/telemetry-error.js +153 -0
- package/dist/telemetry/telemetry-error.js.map +1 -0
- package/dist/telemetry/telemetry-manager.d.ts +127 -0
- package/dist/telemetry/telemetry-manager.d.ts.map +1 -0
- package/dist/telemetry/telemetry-manager.js +182 -0
- package/dist/telemetry/telemetry-manager.js.map +1 -0
- package/dist/telemetry/telemetry-types.d.ts +69 -0
- package/dist/telemetry/telemetry-types.d.ts.map +1 -0
- package/dist/telemetry/telemetry-types.js +29 -0
- package/dist/telemetry/telemetry-types.js.map +1 -0
- package/dist/telemetry/workflow-sanitizer.d.ts +33 -0
- package/dist/telemetry/workflow-sanitizer.d.ts.map +1 -0
- package/dist/telemetry/workflow-sanitizer.js +190 -0
- package/dist/telemetry/workflow-sanitizer.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TelemetryBatchProcessor = void 0;
|
|
4
|
+
const telemetry_types_1 = require("./telemetry-types");
|
|
5
|
+
const telemetry_error_1 = require("./telemetry-error");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
class TelemetryBatchProcessor {
|
|
8
|
+
constructor(supabase, isEnabled) {
|
|
9
|
+
this.supabase = supabase;
|
|
10
|
+
this.isEnabled = isEnabled;
|
|
11
|
+
this.isFlushingEvents = false;
|
|
12
|
+
this.isFlushingWorkflows = false;
|
|
13
|
+
this.metrics = {
|
|
14
|
+
eventsTracked: 0,
|
|
15
|
+
eventsDropped: 0,
|
|
16
|
+
eventsFailed: 0,
|
|
17
|
+
batchesSent: 0,
|
|
18
|
+
batchesFailed: 0,
|
|
19
|
+
averageFlushTime: 0,
|
|
20
|
+
rateLimitHits: 0
|
|
21
|
+
};
|
|
22
|
+
this.flushTimes = [];
|
|
23
|
+
this.deadLetterQueue = [];
|
|
24
|
+
this.maxDeadLetterSize = 100;
|
|
25
|
+
this.circuitBreaker = new telemetry_error_1.TelemetryCircuitBreaker();
|
|
26
|
+
}
|
|
27
|
+
start() {
|
|
28
|
+
if (!this.isEnabled() || !this.supabase)
|
|
29
|
+
return;
|
|
30
|
+
this.flushTimer = setInterval(() => {
|
|
31
|
+
this.flush();
|
|
32
|
+
}, telemetry_types_1.TELEMETRY_CONFIG.BATCH_FLUSH_INTERVAL);
|
|
33
|
+
this.flushTimer.unref();
|
|
34
|
+
process.on('beforeExit', () => this.flush());
|
|
35
|
+
process.on('SIGINT', () => {
|
|
36
|
+
this.flush();
|
|
37
|
+
process.exit(0);
|
|
38
|
+
});
|
|
39
|
+
process.on('SIGTERM', () => {
|
|
40
|
+
this.flush();
|
|
41
|
+
process.exit(0);
|
|
42
|
+
});
|
|
43
|
+
logger_1.logger.debug('Telemetry batch processor started');
|
|
44
|
+
}
|
|
45
|
+
stop() {
|
|
46
|
+
if (this.flushTimer) {
|
|
47
|
+
clearInterval(this.flushTimer);
|
|
48
|
+
this.flushTimer = undefined;
|
|
49
|
+
}
|
|
50
|
+
logger_1.logger.debug('Telemetry batch processor stopped');
|
|
51
|
+
}
|
|
52
|
+
async flush(events, workflows) {
|
|
53
|
+
if (!this.isEnabled() || !this.supabase)
|
|
54
|
+
return;
|
|
55
|
+
if (!this.circuitBreaker.shouldAllow()) {
|
|
56
|
+
logger_1.logger.debug('Circuit breaker open - skipping flush');
|
|
57
|
+
this.metrics.eventsDropped += (events?.length || 0) + (workflows?.length || 0);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
let hasErrors = false;
|
|
62
|
+
if (events && events.length > 0) {
|
|
63
|
+
hasErrors = !(await this.flushEvents(events)) || hasErrors;
|
|
64
|
+
}
|
|
65
|
+
if (workflows && workflows.length > 0) {
|
|
66
|
+
hasErrors = !(await this.flushWorkflows(workflows)) || hasErrors;
|
|
67
|
+
}
|
|
68
|
+
const flushTime = Date.now() - startTime;
|
|
69
|
+
this.recordFlushTime(flushTime);
|
|
70
|
+
if (hasErrors) {
|
|
71
|
+
this.circuitBreaker.recordFailure();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.circuitBreaker.recordSuccess();
|
|
75
|
+
}
|
|
76
|
+
if (!hasErrors && this.deadLetterQueue.length > 0) {
|
|
77
|
+
await this.processDeadLetterQueue();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async flushEvents(events) {
|
|
81
|
+
if (this.isFlushingEvents || events.length === 0)
|
|
82
|
+
return true;
|
|
83
|
+
this.isFlushingEvents = true;
|
|
84
|
+
try {
|
|
85
|
+
const batches = this.createBatches(events, telemetry_types_1.TELEMETRY_CONFIG.MAX_BATCH_SIZE);
|
|
86
|
+
for (const batch of batches) {
|
|
87
|
+
const result = await this.executeWithRetry(async () => {
|
|
88
|
+
const { error } = await this.supabase
|
|
89
|
+
.from('telemetry_events')
|
|
90
|
+
.insert(batch);
|
|
91
|
+
if (error) {
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
logger_1.logger.debug(`Flushed batch of ${batch.length} telemetry events`);
|
|
95
|
+
return true;
|
|
96
|
+
}, 'Flush telemetry events');
|
|
97
|
+
if (result) {
|
|
98
|
+
this.metrics.eventsTracked += batch.length;
|
|
99
|
+
this.metrics.batchesSent++;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.metrics.eventsFailed += batch.length;
|
|
103
|
+
this.metrics.batchesFailed++;
|
|
104
|
+
this.addToDeadLetterQueue(batch);
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
logger_1.logger.debug('Failed to flush events:', error);
|
|
112
|
+
throw new telemetry_error_1.TelemetryError(telemetry_error_1.TelemetryErrorType.NETWORK_ERROR, 'Failed to flush events', { error: error instanceof Error ? error.message : String(error) }, true);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
this.isFlushingEvents = false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async flushWorkflows(workflows) {
|
|
119
|
+
if (this.isFlushingWorkflows || workflows.length === 0)
|
|
120
|
+
return true;
|
|
121
|
+
this.isFlushingWorkflows = true;
|
|
122
|
+
try {
|
|
123
|
+
const uniqueWorkflows = this.deduplicateWorkflows(workflows);
|
|
124
|
+
logger_1.logger.debug(`Deduplicating workflows: ${workflows.length} -> ${uniqueWorkflows.length}`);
|
|
125
|
+
const batches = this.createBatches(uniqueWorkflows, telemetry_types_1.TELEMETRY_CONFIG.MAX_BATCH_SIZE);
|
|
126
|
+
for (const batch of batches) {
|
|
127
|
+
const result = await this.executeWithRetry(async () => {
|
|
128
|
+
const { error } = await this.supabase
|
|
129
|
+
.from('telemetry_workflows')
|
|
130
|
+
.insert(batch);
|
|
131
|
+
if (error) {
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
logger_1.logger.debug(`Flushed batch of ${batch.length} telemetry workflows`);
|
|
135
|
+
return true;
|
|
136
|
+
}, 'Flush telemetry workflows');
|
|
137
|
+
if (result) {
|
|
138
|
+
this.metrics.eventsTracked += batch.length;
|
|
139
|
+
this.metrics.batchesSent++;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.metrics.eventsFailed += batch.length;
|
|
143
|
+
this.metrics.batchesFailed++;
|
|
144
|
+
this.addToDeadLetterQueue(batch);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logger_1.logger.debug('Failed to flush workflows:', error);
|
|
152
|
+
throw new telemetry_error_1.TelemetryError(telemetry_error_1.TelemetryErrorType.NETWORK_ERROR, 'Failed to flush workflows', { error: error instanceof Error ? error.message : String(error) }, true);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
this.isFlushingWorkflows = false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async executeWithRetry(operation, operationName) {
|
|
159
|
+
let lastError = null;
|
|
160
|
+
let delay = telemetry_types_1.TELEMETRY_CONFIG.RETRY_DELAY;
|
|
161
|
+
for (let attempt = 1; attempt <= telemetry_types_1.TELEMETRY_CONFIG.MAX_RETRIES; attempt++) {
|
|
162
|
+
try {
|
|
163
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
164
|
+
setTimeout(() => reject(new Error('Operation timed out')), telemetry_types_1.TELEMETRY_CONFIG.OPERATION_TIMEOUT);
|
|
165
|
+
});
|
|
166
|
+
const result = await Promise.race([operation(), timeoutPromise]);
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
lastError = error;
|
|
171
|
+
logger_1.logger.debug(`${operationName} attempt ${attempt} failed:`, error);
|
|
172
|
+
if (attempt < telemetry_types_1.TELEMETRY_CONFIG.MAX_RETRIES) {
|
|
173
|
+
const jitter = Math.random() * 0.3 * delay;
|
|
174
|
+
const waitTime = delay + jitter;
|
|
175
|
+
await new Promise(resolve => setTimeout(resolve, waitTime));
|
|
176
|
+
delay *= 2;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
logger_1.logger.debug(`${operationName} failed after ${telemetry_types_1.TELEMETRY_CONFIG.MAX_RETRIES} attempts:`, lastError);
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
createBatches(items, batchSize) {
|
|
184
|
+
const batches = [];
|
|
185
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
186
|
+
batches.push(items.slice(i, i + batchSize));
|
|
187
|
+
}
|
|
188
|
+
return batches;
|
|
189
|
+
}
|
|
190
|
+
deduplicateWorkflows(workflows) {
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
const unique = [];
|
|
193
|
+
for (const workflow of workflows) {
|
|
194
|
+
if (!seen.has(workflow.workflow_hash)) {
|
|
195
|
+
seen.add(workflow.workflow_hash);
|
|
196
|
+
unique.push(workflow);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return unique;
|
|
200
|
+
}
|
|
201
|
+
addToDeadLetterQueue(items) {
|
|
202
|
+
for (const item of items) {
|
|
203
|
+
this.deadLetterQueue.push(item);
|
|
204
|
+
if (this.deadLetterQueue.length > this.maxDeadLetterSize) {
|
|
205
|
+
const dropped = this.deadLetterQueue.shift();
|
|
206
|
+
if (dropped) {
|
|
207
|
+
this.metrics.eventsDropped++;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
logger_1.logger.debug(`Added ${items.length} items to dead letter queue`);
|
|
212
|
+
}
|
|
213
|
+
async processDeadLetterQueue() {
|
|
214
|
+
if (this.deadLetterQueue.length === 0)
|
|
215
|
+
return;
|
|
216
|
+
logger_1.logger.debug(`Processing ${this.deadLetterQueue.length} items from dead letter queue`);
|
|
217
|
+
const events = [];
|
|
218
|
+
const workflows = [];
|
|
219
|
+
for (const item of this.deadLetterQueue) {
|
|
220
|
+
if ('workflow_hash' in item) {
|
|
221
|
+
workflows.push(item);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
events.push(item);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
this.deadLetterQueue = [];
|
|
228
|
+
if (events.length > 0) {
|
|
229
|
+
await this.flushEvents(events);
|
|
230
|
+
}
|
|
231
|
+
if (workflows.length > 0) {
|
|
232
|
+
await this.flushWorkflows(workflows);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
recordFlushTime(time) {
|
|
236
|
+
this.flushTimes.push(time);
|
|
237
|
+
if (this.flushTimes.length > 100) {
|
|
238
|
+
this.flushTimes.shift();
|
|
239
|
+
}
|
|
240
|
+
const sum = this.flushTimes.reduce((a, b) => a + b, 0);
|
|
241
|
+
this.metrics.averageFlushTime = Math.round(sum / this.flushTimes.length);
|
|
242
|
+
this.metrics.lastFlushTime = time;
|
|
243
|
+
}
|
|
244
|
+
getMetrics() {
|
|
245
|
+
return {
|
|
246
|
+
...this.metrics,
|
|
247
|
+
circuitBreakerState: this.circuitBreaker.getState(),
|
|
248
|
+
deadLetterQueueSize: this.deadLetterQueue.length
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
resetMetrics() {
|
|
252
|
+
this.metrics = {
|
|
253
|
+
eventsTracked: 0,
|
|
254
|
+
eventsDropped: 0,
|
|
255
|
+
eventsFailed: 0,
|
|
256
|
+
batchesSent: 0,
|
|
257
|
+
batchesFailed: 0,
|
|
258
|
+
averageFlushTime: 0,
|
|
259
|
+
rateLimitHits: 0
|
|
260
|
+
};
|
|
261
|
+
this.flushTimes = [];
|
|
262
|
+
this.circuitBreaker.reset();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
exports.TelemetryBatchProcessor = TelemetryBatchProcessor;
|
|
266
|
+
//# sourceMappingURL=batch-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-processor.js","sourceRoot":"","sources":["../../src/telemetry/batch-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface TelemetryConfig {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
userId: string;
|
|
4
|
+
firstRun?: string;
|
|
5
|
+
lastModified?: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class TelemetryConfigManager {
|
|
9
|
+
private static instance;
|
|
10
|
+
private readonly configDir;
|
|
11
|
+
private readonly configPath;
|
|
12
|
+
private config;
|
|
13
|
+
private constructor();
|
|
14
|
+
static getInstance(): TelemetryConfigManager;
|
|
15
|
+
private generateUserId;
|
|
16
|
+
loadConfig(): TelemetryConfig;
|
|
17
|
+
private saveConfig;
|
|
18
|
+
isEnabled(): boolean;
|
|
19
|
+
private isDisabledByEnvironment;
|
|
20
|
+
getUserId(): string;
|
|
21
|
+
isFirstRun(): boolean;
|
|
22
|
+
enable(): void;
|
|
23
|
+
disable(): void;
|
|
24
|
+
getStatus(): string;
|
|
25
|
+
private showFirstRunNotice;
|
|
26
|
+
private getPackageVersion;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/telemetry/config-manager.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO;IAKP,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAU5C,OAAO,CAAC,cAAc;IAQtB,UAAU,IAAI,eAAe;IAqD7B,OAAO,CAAC,UAAU;IAmBlB,SAAS,IAAI,OAAO;IAapB,OAAO,CAAC,uBAAuB;IAiC/B,SAAS,IAAI,MAAM;IAQnB,UAAU,IAAI,OAAO;IAOrB,MAAM,IAAI,IAAI;IAWd,OAAO,IAAI,IAAI;IAWf,SAAS,IAAI,MAAM;IA2BnB,OAAO,CAAC,kBAAkB;IA0C1B,OAAO,CAAC,iBAAiB;CA+B1B"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TelemetryConfigManager = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const os_2 = require("os");
|
|
9
|
+
class TelemetryConfigManager {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.config = null;
|
|
12
|
+
this.configDir = (0, path_1.join)((0, os_1.homedir)(), '.n8n-mcp');
|
|
13
|
+
this.configPath = (0, path_1.join)(this.configDir, 'telemetry.json');
|
|
14
|
+
}
|
|
15
|
+
static getInstance() {
|
|
16
|
+
if (!TelemetryConfigManager.instance) {
|
|
17
|
+
TelemetryConfigManager.instance = new TelemetryConfigManager();
|
|
18
|
+
}
|
|
19
|
+
return TelemetryConfigManager.instance;
|
|
20
|
+
}
|
|
21
|
+
generateUserId() {
|
|
22
|
+
const machineId = `${(0, os_2.hostname)()}-${(0, os_2.platform)()}-${(0, os_2.arch)()}-${(0, os_1.homedir)()}`;
|
|
23
|
+
return (0, crypto_1.createHash)('sha256').update(machineId).digest('hex').substring(0, 16);
|
|
24
|
+
}
|
|
25
|
+
loadConfig() {
|
|
26
|
+
if (this.config) {
|
|
27
|
+
return this.config;
|
|
28
|
+
}
|
|
29
|
+
if (!(0, fs_1.existsSync)(this.configPath)) {
|
|
30
|
+
const version = this.getPackageVersion();
|
|
31
|
+
const envDisabled = this.isDisabledByEnvironment();
|
|
32
|
+
this.config = {
|
|
33
|
+
enabled: !envDisabled,
|
|
34
|
+
userId: this.generateUserId(),
|
|
35
|
+
firstRun: new Date().toISOString(),
|
|
36
|
+
version
|
|
37
|
+
};
|
|
38
|
+
this.saveConfig();
|
|
39
|
+
if (!envDisabled) {
|
|
40
|
+
this.showFirstRunNotice();
|
|
41
|
+
}
|
|
42
|
+
return this.config;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const rawConfig = (0, fs_1.readFileSync)(this.configPath, 'utf-8');
|
|
46
|
+
this.config = JSON.parse(rawConfig);
|
|
47
|
+
if (!this.config.userId) {
|
|
48
|
+
this.config.userId = this.generateUserId();
|
|
49
|
+
this.saveConfig();
|
|
50
|
+
}
|
|
51
|
+
return this.config;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error('Failed to load telemetry config, using defaults:', error);
|
|
55
|
+
this.config = {
|
|
56
|
+
enabled: false,
|
|
57
|
+
userId: this.generateUserId()
|
|
58
|
+
};
|
|
59
|
+
return this.config;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
saveConfig() {
|
|
63
|
+
if (!this.config)
|
|
64
|
+
return;
|
|
65
|
+
try {
|
|
66
|
+
if (!(0, fs_1.existsSync)(this.configDir)) {
|
|
67
|
+
(0, fs_1.mkdirSync)(this.configDir, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
this.config.lastModified = new Date().toISOString();
|
|
70
|
+
(0, fs_1.writeFileSync)(this.configPath, JSON.stringify(this.config, null, 2));
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error('Failed to save telemetry config:', error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
isEnabled() {
|
|
77
|
+
if (this.isDisabledByEnvironment()) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
const config = this.loadConfig();
|
|
81
|
+
return config.enabled;
|
|
82
|
+
}
|
|
83
|
+
isDisabledByEnvironment() {
|
|
84
|
+
const envVars = [
|
|
85
|
+
'N8N_MCP_TELEMETRY_DISABLED',
|
|
86
|
+
'TELEMETRY_DISABLED',
|
|
87
|
+
'DISABLE_TELEMETRY'
|
|
88
|
+
];
|
|
89
|
+
for (const varName of envVars) {
|
|
90
|
+
const value = process.env[varName];
|
|
91
|
+
if (value !== undefined) {
|
|
92
|
+
const normalized = value.toLowerCase().trim();
|
|
93
|
+
if (!['true', 'false', '1', '0', ''].includes(normalized)) {
|
|
94
|
+
console.warn(`⚠️ Invalid telemetry environment variable value: ${varName}="${value}"\n` +
|
|
95
|
+
` Use "true" to disable or "false" to enable telemetry.`);
|
|
96
|
+
}
|
|
97
|
+
if (normalized === 'true' || normalized === '1') {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
getUserId() {
|
|
105
|
+
const config = this.loadConfig();
|
|
106
|
+
return config.userId;
|
|
107
|
+
}
|
|
108
|
+
isFirstRun() {
|
|
109
|
+
return !(0, fs_1.existsSync)(this.configPath);
|
|
110
|
+
}
|
|
111
|
+
enable() {
|
|
112
|
+
const config = this.loadConfig();
|
|
113
|
+
config.enabled = true;
|
|
114
|
+
this.config = config;
|
|
115
|
+
this.saveConfig();
|
|
116
|
+
console.log('✓ Anonymous telemetry enabled');
|
|
117
|
+
}
|
|
118
|
+
disable() {
|
|
119
|
+
const config = this.loadConfig();
|
|
120
|
+
config.enabled = false;
|
|
121
|
+
this.config = config;
|
|
122
|
+
this.saveConfig();
|
|
123
|
+
console.log('✓ Anonymous telemetry disabled');
|
|
124
|
+
}
|
|
125
|
+
getStatus() {
|
|
126
|
+
const config = this.loadConfig();
|
|
127
|
+
const envDisabled = this.isDisabledByEnvironment();
|
|
128
|
+
let status = config.enabled ? 'ENABLED' : 'DISABLED';
|
|
129
|
+
if (envDisabled) {
|
|
130
|
+
status = 'DISABLED (via environment variable)';
|
|
131
|
+
}
|
|
132
|
+
return `
|
|
133
|
+
Telemetry Status: ${status}
|
|
134
|
+
Anonymous ID: ${config.userId}
|
|
135
|
+
First Run: ${config.firstRun || 'Unknown'}
|
|
136
|
+
Config Path: ${this.configPath}
|
|
137
|
+
|
|
138
|
+
To opt-out: npx n8n-mcp telemetry disable
|
|
139
|
+
To opt-in: npx n8n-mcp telemetry enable
|
|
140
|
+
|
|
141
|
+
For Docker: Set N8N_MCP_TELEMETRY_DISABLED=true
|
|
142
|
+
`;
|
|
143
|
+
}
|
|
144
|
+
showFirstRunNotice() {
|
|
145
|
+
console.log(`
|
|
146
|
+
╔════════════════════════════════════════════════════════════╗
|
|
147
|
+
║ Anonymous Usage Statistics ║
|
|
148
|
+
╠════════════════════════════════════════════════════════════╣
|
|
149
|
+
║ ║
|
|
150
|
+
║ n8n-mcp collects anonymous usage data to improve the ║
|
|
151
|
+
║ tool and understand how it's being used. ║
|
|
152
|
+
║ ║
|
|
153
|
+
║ We track: ║
|
|
154
|
+
║ • Which MCP tools are used (no parameters) ║
|
|
155
|
+
║ • Workflow structures (sanitized, no sensitive data) ║
|
|
156
|
+
║ • Error patterns (hashed, no details) ║
|
|
157
|
+
║ • Performance metrics (timing, success rates) ║
|
|
158
|
+
║ ║
|
|
159
|
+
║ We NEVER collect: ║
|
|
160
|
+
║ • URLs, API keys, or credentials ║
|
|
161
|
+
║ • Workflow content or actual data ║
|
|
162
|
+
║ • Personal or identifiable information ║
|
|
163
|
+
║ • n8n instance details or locations ║
|
|
164
|
+
║ ║
|
|
165
|
+
║ Your anonymous ID: ${this.config?.userId || 'generating...'} ║
|
|
166
|
+
║ ║
|
|
167
|
+
║ This helps me understand usage patterns and improve ║
|
|
168
|
+
║ n8n-mcp for everyone. Thank you for your support! ║
|
|
169
|
+
║ ║
|
|
170
|
+
║ To opt-out at any time: ║
|
|
171
|
+
║ npx n8n-mcp telemetry disable ║
|
|
172
|
+
║ ║
|
|
173
|
+
║ Data deletion requests: ║
|
|
174
|
+
║ Email romuald@n8n-mcp.com with your anonymous ID ║
|
|
175
|
+
║ ║
|
|
176
|
+
║ Learn more: ║
|
|
177
|
+
║ https://github.com/czlonkowski/n8n-mcp/blob/main/PRIVACY.md ║
|
|
178
|
+
║ ║
|
|
179
|
+
╚════════════════════════════════════════════════════════════╝
|
|
180
|
+
`);
|
|
181
|
+
}
|
|
182
|
+
getPackageVersion() {
|
|
183
|
+
try {
|
|
184
|
+
const possiblePaths = [
|
|
185
|
+
(0, path_1.resolve)(__dirname, '..', '..', 'package.json'),
|
|
186
|
+
(0, path_1.resolve)(process.cwd(), 'package.json'),
|
|
187
|
+
(0, path_1.resolve)(__dirname, '..', '..', '..', 'package.json')
|
|
188
|
+
];
|
|
189
|
+
for (const packagePath of possiblePaths) {
|
|
190
|
+
if ((0, fs_1.existsSync)(packagePath)) {
|
|
191
|
+
const packageJson = JSON.parse((0, fs_1.readFileSync)(packagePath, 'utf-8'));
|
|
192
|
+
if (packageJson.version) {
|
|
193
|
+
return packageJson.version;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
const packageJson = require('../../package.json');
|
|
199
|
+
return packageJson.version || 'unknown';
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
}
|
|
203
|
+
return 'unknown';
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
return 'unknown';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.TelemetryConfigManager = TelemetryConfigManager;
|
|
211
|
+
//# sourceMappingURL=config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/telemetry/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { TelemetryEvent, WorkflowTelemetry } from './telemetry-types';
|
|
2
|
+
export declare class TelemetryEventTracker {
|
|
3
|
+
private getUserId;
|
|
4
|
+
private isEnabled;
|
|
5
|
+
private rateLimiter;
|
|
6
|
+
private validator;
|
|
7
|
+
private eventQueue;
|
|
8
|
+
private workflowQueue;
|
|
9
|
+
private previousTool?;
|
|
10
|
+
private previousToolTimestamp;
|
|
11
|
+
private performanceMetrics;
|
|
12
|
+
constructor(getUserId: () => string, isEnabled: () => boolean);
|
|
13
|
+
trackToolUsage(toolName: string, success: boolean, duration?: number): void;
|
|
14
|
+
trackWorkflowCreation(workflow: any, validationPassed: boolean): Promise<void>;
|
|
15
|
+
trackError(errorType: string, context: string, toolName?: string): void;
|
|
16
|
+
trackEvent(eventName: string, properties: Record<string, any>, checkRateLimit?: boolean): void;
|
|
17
|
+
trackSessionStart(): void;
|
|
18
|
+
trackSearchQuery(query: string, resultsFound: number, searchType: string): void;
|
|
19
|
+
trackValidationDetails(nodeType: string, errorType: string, details: Record<string, any>): void;
|
|
20
|
+
trackToolSequence(previousTool: string, currentTool: string, timeDelta: number): void;
|
|
21
|
+
trackNodeConfiguration(nodeType: string, propertiesSet: number, usedDefaults: boolean): void;
|
|
22
|
+
trackPerformanceMetric(operation: string, duration: number, metadata?: Record<string, any>): void;
|
|
23
|
+
updateToolSequence(toolName: string): void;
|
|
24
|
+
getEventQueue(): TelemetryEvent[];
|
|
25
|
+
getWorkflowQueue(): WorkflowTelemetry[];
|
|
26
|
+
clearEventQueue(): void;
|
|
27
|
+
clearWorkflowQueue(): void;
|
|
28
|
+
getStats(): {
|
|
29
|
+
rateLimiter: {
|
|
30
|
+
currentEvents: number;
|
|
31
|
+
maxEvents: number;
|
|
32
|
+
windowMs: number;
|
|
33
|
+
droppedEvents: number;
|
|
34
|
+
utilizationPercent: number;
|
|
35
|
+
remainingCapacity: number;
|
|
36
|
+
arraySize: number;
|
|
37
|
+
maxArraySize: number;
|
|
38
|
+
memoryUsagePercent: number;
|
|
39
|
+
};
|
|
40
|
+
validator: {
|
|
41
|
+
errors: number;
|
|
42
|
+
successes: number;
|
|
43
|
+
total: number;
|
|
44
|
+
errorRate: number;
|
|
45
|
+
};
|
|
46
|
+
eventQueueSize: number;
|
|
47
|
+
workflowQueueSize: number;
|
|
48
|
+
performanceMetrics: Record<string, any>;
|
|
49
|
+
};
|
|
50
|
+
private recordPerformanceMetric;
|
|
51
|
+
private getPerformanceStats;
|
|
52
|
+
private categorizeError;
|
|
53
|
+
private categorizeConfigComplexity;
|
|
54
|
+
private getPackageVersion;
|
|
55
|
+
private sanitizeErrorType;
|
|
56
|
+
private sanitizeContext;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=event-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-tracker.d.ts","sourceRoot":"","sources":["../../src/telemetry/event-tracker.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAStE,qBAAa,qBAAqB;IAU9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IAVnB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,kBAAkB,CAAoC;gBAGpD,SAAS,EAAE,MAAM,MAAM,EACvB,SAAS,EAAE,MAAM,OAAO;IASlC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAkCrE,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DpF,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcvE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,cAAc,GAAE,OAAc,GAAG,IAAI;IAyBpG,iBAAiB,IAAI,IAAI;IAczB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAe/E,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAc/F,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAerF,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI;IAc5F,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAkBjG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAa1C,aAAa,IAAI,cAAc,EAAE;IAOjC,gBAAgB,IAAI,iBAAiB,EAAE;IAOvC,eAAe,IAAI,IAAI;IAOvB,kBAAkB,IAAI,IAAI;IAO1B,QAAQ;;;;;;;;;;;;;;;;;;;;;;IAaR,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,eAAe;CAMxB"}
|