@n8n/telemetry 1.4.0 → 1.5.1

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.
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod/v4';
2
+ export declare const WORKFLOW_TELEMETRY: {
3
+ readonly NODE_IDS_HEALED: {
4
+ readonly name: "Workflow node ids healed";
5
+ readonly description: "A published version about to be activated carried duplicate or missing node ids, so a corrected system-authored version was published in its place. `superseded` means the corrected version lost against a concurrent publish or unpublish and was discarded.";
6
+ readonly properties: z.ZodObject<{
7
+ workflow_id: z.ZodString;
8
+ filled_count: z.ZodNumber;
9
+ reassigned_count: z.ZodNumber;
10
+ dropped_count: z.ZodNumber;
11
+ superseded: z.ZodBoolean;
12
+ }, z.core.$strip>;
13
+ } & import("../define").TelemetryEventInput & {
14
+ readonly getValidationError: (properties: unknown) => string | null;
15
+ };
16
+ };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WORKFLOW_TELEMETRY = void 0;
4
+ const v4_1 = require("zod/v4");
5
+ const define_1 = require("../define");
6
+ exports.WORKFLOW_TELEMETRY = (0, define_1.defineTelemetryEvents)({
7
+ NODE_IDS_HEALED: {
8
+ name: 'Workflow node ids healed',
9
+ description: 'A published version about to be activated carried duplicate or missing node ids, so a corrected system-authored version was published in its place. `superseded` means the corrected version lost against a concurrent publish or unpublish and was discarded.',
10
+ properties: v4_1.z.object({
11
+ workflow_id: v4_1.z.string(),
12
+ filled_count: v4_1.z.number().describe('Nodes that had no id and received a fresh one'),
13
+ reassigned_count: v4_1.z
14
+ .number()
15
+ .describe('Nodes that shared their id with another node and received a fresh one'),
16
+ dropped_count: v4_1.z
17
+ .number()
18
+ .describe('Exact same-name duplicates removed in favor of their last occurrence'),
19
+ superseded: v4_1.z
20
+ .boolean()
21
+ .describe('Whether the corrected version lost the publish race and was discarded'),
22
+ }),
23
+ },
24
+ });
25
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/events/workflow.ts"],"names":[],"mappings":";;;AAAA,+BAA2B;AAE3B,sCAAkD;AAErC,QAAA,kBAAkB,GAAG,IAAA,8BAAqB,EAAC;IACvD,eAAe,EAAE;QAChB,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACV,gQAAgQ;QACjQ,UAAU,EAAE,MAAC,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,MAAC,CAAC,MAAM,EAAE;YACvB,YAAY,EAAE,MAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YAClF,gBAAgB,EAAE,MAAC;iBACjB,MAAM,EAAE;iBACR,QAAQ,CAAC,uEAAuE,CAAC;YACnF,aAAa,EAAE,MAAC;iBACd,MAAM,EAAE;iBACR,QAAQ,CAAC,sEAAsE,CAAC;YAClF,UAAU,EAAE,MAAC;iBACX,OAAO,EAAE;iBACT,QAAQ,CAAC,uEAAuE,CAAC;SACnF,CAAC;KACF;CACD,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,5 +3,7 @@ export type { TelemetryCatalogEntry, TelemetryCatalogProperty } from './catalog'
3
3
  export { POSTHOG_EVENTS_BLACKLIST } from './constants';
4
4
  export { defineTelemetryEvents } from './define';
5
5
  export type { InferTelemetryProps, TelemetryEventDef, TelemetryEventInput, TelemetryEventRegistry, } from './define';
6
+ export { redactTelemetryProperties, redactTelemetryText } from './redaction';
7
+ export type { TelemetryTextOptions } from './redaction';
6
8
  export { collectDuplicateNames, validateEntrySchemas } from './registry-checks';
7
9
  export { TELEMETRY_EVENT } from './telemetry-events';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TELEMETRY_EVENT = exports.validateEntrySchemas = exports.collectDuplicateNames = exports.defineTelemetryEvents = exports.POSTHOG_EVENTS_BLACKLIST = exports.formatCatalog = exports.buildCatalog = void 0;
3
+ exports.TELEMETRY_EVENT = exports.validateEntrySchemas = exports.collectDuplicateNames = exports.redactTelemetryText = exports.redactTelemetryProperties = exports.defineTelemetryEvents = exports.POSTHOG_EVENTS_BLACKLIST = exports.formatCatalog = exports.buildCatalog = void 0;
4
4
  var catalog_1 = require("./catalog");
5
5
  Object.defineProperty(exports, "buildCatalog", { enumerable: true, get: function () { return catalog_1.buildCatalog; } });
6
6
  Object.defineProperty(exports, "formatCatalog", { enumerable: true, get: function () { return catalog_1.formatCatalog; } });
@@ -8,6 +8,9 @@ var constants_1 = require("./constants");
8
8
  Object.defineProperty(exports, "POSTHOG_EVENTS_BLACKLIST", { enumerable: true, get: function () { return constants_1.POSTHOG_EVENTS_BLACKLIST; } });
9
9
  var define_1 = require("./define");
10
10
  Object.defineProperty(exports, "defineTelemetryEvents", { enumerable: true, get: function () { return define_1.defineTelemetryEvents; } });
11
+ var redaction_1 = require("./redaction");
12
+ Object.defineProperty(exports, "redactTelemetryProperties", { enumerable: true, get: function () { return redaction_1.redactTelemetryProperties; } });
13
+ Object.defineProperty(exports, "redactTelemetryText", { enumerable: true, get: function () { return redaction_1.redactTelemetryText; } });
11
14
  var registry_checks_1 = require("./registry-checks");
12
15
  Object.defineProperty(exports, "collectDuplicateNames", { enumerable: true, get: function () { return registry_checks_1.collectDuplicateNames; } });
13
16
  Object.defineProperty(exports, "validateEntrySchemas", { enumerable: true, get: function () { return registry_checks_1.validateEntrySchemas; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAwD;AAA/C,uGAAA,YAAY,OAAA;AAAE,wGAAA,aAAa,OAAA;AAEpC,yCAAuD;AAA9C,qHAAA,wBAAwB,OAAA;AACjC,mCAAiD;AAAxC,+GAAA,qBAAqB,OAAA;AAO9B,qDAAgF;AAAvE,wHAAA,qBAAqB,OAAA;AAAE,uHAAA,oBAAoB,OAAA;AACpD,uDAAqD;AAA5C,mHAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAwD;AAA/C,uGAAA,YAAY,OAAA;AAAE,wGAAA,aAAa,OAAA;AAEpC,yCAAuD;AAA9C,qHAAA,wBAAwB,OAAA;AACjC,mCAAiD;AAAxC,+GAAA,qBAAqB,OAAA;AAO9B,yCAA6E;AAApE,sHAAA,yBAAyB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAEvD,qDAAgF;AAAvE,wHAAA,qBAAqB,OAAA;AAAE,uHAAA,oBAAoB,OAAA;AACpD,uDAAqD;AAA5C,mHAAA,eAAe,OAAA"}
@@ -0,0 +1,7 @@
1
+ type TelemetryValue = string | number | boolean | object | null | undefined;
2
+ export interface TelemetryTextOptions {
3
+ maxLength?: number;
4
+ }
5
+ export declare function redactTelemetryText(value: string, opts?: TelemetryTextOptions): string;
6
+ export declare function redactTelemetryProperties<T extends Record<string, TelemetryValue>>(properties: T): Record<string, TelemetryValue>;
7
+ export {};
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redactTelemetryText = redactTelemetryText;
4
+ exports.redactTelemetryProperties = redactTelemetryProperties;
5
+ const pii_patterns_1 = require("@n8n/utils/redaction/pii-patterns");
6
+ const redact_text_1 = require("@n8n/utils/redaction/redact-text");
7
+ const TELEMETRY_REDACTION_OPTIONS = {
8
+ secrets: true,
9
+ detect: pii_patterns_1.SUPPORTED_PII_CATEGORIES,
10
+ preserveUrlStructure: true,
11
+ };
12
+ const MAX_TELEMETRY_TEXT_LENGTH = 8_000;
13
+ const IDENTIFIER_KEY_PATTERN = /(?:^|_)(?:id|ids|hash)$/;
14
+ const SECRET_KEY_PATTERN = /(?:^|_)(?:password|passwd|pwd|secret|token|api_?key|apikey|access_?token|refresh_?token|id_?token|session_?token|auth_?token|authorization|cookie|private_?key)$/i;
15
+ function toSnakeCase(key) {
16
+ return key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/-/g, '_');
17
+ }
18
+ const MAX_PROPERTY_DEPTH = 5;
19
+ const OVER_DEPTH_MARKER = '[REDACTED_DEPTH]';
20
+ function redactTelemetryText(value, opts = {}) {
21
+ const maxLength = opts.maxLength ?? MAX_TELEMETRY_TEXT_LENGTH;
22
+ const redacted = (0, redact_text_1.redactText)(value, TELEMETRY_REDACTION_OPTIONS).text;
23
+ return redacted.length > maxLength ? `${redacted.slice(0, maxLength)}...` : redacted;
24
+ }
25
+ function isNonNullObject(value) {
26
+ return value !== null && typeof value === 'object';
27
+ }
28
+ function redactPropertyValue(key, value, depth) {
29
+ if (SECRET_KEY_PATTERN.test(toSnakeCase(key)) &&
30
+ (typeof value === 'string' || isNonNullObject(value))) {
31
+ return redact_text_1.DEFAULT_PLACEHOLDER;
32
+ }
33
+ if (typeof value === 'string') {
34
+ return IDENTIFIER_KEY_PATTERN.test(key) ? value : redactTelemetryText(value);
35
+ }
36
+ if (Array.isArray(value)) {
37
+ if (depth >= MAX_PROPERTY_DEPTH)
38
+ return OVER_DEPTH_MARKER;
39
+ return value.map((entry) => redactPropertyValue(key, entry, depth + 1));
40
+ }
41
+ if (isNonNullObject(value)) {
42
+ if (depth >= MAX_PROPERTY_DEPTH)
43
+ return OVER_DEPTH_MARKER;
44
+ const redacted = {};
45
+ for (const [nestedKey, nestedValue] of Object.entries(value)) {
46
+ redacted[nestedKey] = redactPropertyValue(nestedKey, nestedValue, depth + 1);
47
+ }
48
+ return redacted;
49
+ }
50
+ return value;
51
+ }
52
+ function redactTelemetryProperties(properties) {
53
+ const redacted = {};
54
+ for (const [key, value] of Object.entries(properties)) {
55
+ redacted[key] = redactPropertyValue(key, value, 0);
56
+ }
57
+ return redacted;
58
+ }
59
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"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"}
@@ -994,16 +994,6 @@ export declare const TELEMETRY_EVENT: {
994
994
  } & import("./define").TelemetryEventInput & {
995
995
  readonly getValidationError: (properties: unknown) => string | null;
996
996
  };
997
- readonly INSTANCE_REFUSED_DURABLE_POLLERS: {
998
- readonly name: "Instance refused durable pollers";
999
- readonly description: "Boot scan found active workflows whose published version has duplicate or missing trigger node ids. Durable poll cursors and durable-scheduler poll triggers were disabled instance-wide and the offending workflows poller_state rows were deleted.";
1000
- readonly properties: import("zod/v4").ZodObject<{
1001
- workflow_ids: import("zod/v4").ZodArray<import("zod/v4").ZodString>;
1002
- deleted_cursor_rows: import("zod/v4").ZodNumber;
1003
- }, import("zod/v4/core").$strip>;
1004
- } & import("./define").TelemetryEventInput & {
1005
- readonly getValidationError: (properties: unknown) => string | null;
1006
- };
1007
997
  };
1008
998
  INSTANCE_AI: {
1009
999
  readonly USER_CLICKED_AI_CREDIT_BALANCE: {
@@ -1013,6 +1003,183 @@ export declare const TELEMETRY_EVENT: {
1013
1003
  } & import("./define").TelemetryEventInput & {
1014
1004
  readonly getValidationError: (properties: unknown) => string | null;
1015
1005
  };
1006
+ readonly FREE_NUDGE_EXPOSED: {
1007
+ readonly name: "Instance AI free nudge exposed";
1008
+ readonly description: "An eligible user reached the Instance AI empty state for the free-use nudge experiment, including the control variant.";
1009
+ readonly properties: import("zod/v4").ZodObject<{
1010
+ variant: import("zod/v4").ZodEnum<{
1011
+ control: "control";
1012
+ "variant-1": "variant-1";
1013
+ "variant-2": "variant-2";
1014
+ }>;
1015
+ '$feature/105_instance_ai_free_nudge': import("zod/v4").ZodEnum<{
1016
+ control: "control";
1017
+ "variant-1": "variant-1";
1018
+ "variant-2": "variant-2";
1019
+ }>;
1020
+ }, import("zod/v4/core").$strip>;
1021
+ } & import("./define").TelemetryEventInput & {
1022
+ readonly getValidationError: (properties: unknown) => string | null;
1023
+ };
1024
+ readonly FREE_NUDGE_DISMISSED: {
1025
+ readonly name: "Instance AI free nudge dismissed";
1026
+ readonly description: "The user dismissed a visible Instance AI free-use nudge.";
1027
+ readonly properties: import("zod/v4").ZodObject<{
1028
+ variant: import("zod/v4").ZodEnum<{
1029
+ "variant-1": "variant-1";
1030
+ "variant-2": "variant-2";
1031
+ }>;
1032
+ '$feature/105_instance_ai_free_nudge': import("zod/v4").ZodEnum<{
1033
+ "variant-1": "variant-1";
1034
+ "variant-2": "variant-2";
1035
+ }>;
1036
+ }, import("zod/v4/core").$strip>;
1037
+ } & import("./define").TelemetryEventInput & {
1038
+ readonly getValidationError: (properties: unknown) => string | null;
1039
+ };
1040
+ readonly USER_CLICKED_AI_ASSISTANT_INPUT_PLUS_BUTTON: {
1041
+ readonly name: "User clicked AI Assistant input plus button";
1042
+ readonly description: "The user clicked the plus button in the AI Assistant input.";
1043
+ readonly properties: import("zod/v4").ZodObject<{}, import("zod/v4/core").$strip>;
1044
+ } & import("./define").TelemetryEventInput & {
1045
+ readonly getValidationError: (properties: unknown) => string | null;
1046
+ };
1047
+ readonly TOOLS_LIST_OPENED: {
1048
+ readonly name: "Instance AI tools list opened";
1049
+ readonly description: "The user opened the AI Assistant tools connection modal.";
1050
+ readonly properties: import("zod/v4").ZodObject<{
1051
+ source: import("zod/v4").ZodEnum<{
1052
+ input_menu: "input_menu";
1053
+ mcp_connect_card: "mcp_connect_card";
1054
+ }>;
1055
+ }, import("zod/v4/core").$strip>;
1056
+ } & import("./define").TelemetryEventInput & {
1057
+ readonly getValidationError: (properties: unknown) => string | null;
1058
+ };
1059
+ readonly MCP_SETTINGS_OPENED: {
1060
+ readonly name: "Instance AI mcp settings opened";
1061
+ readonly description: "The user opened settings for an MCP connection in the AI Assistant.";
1062
+ readonly properties: import("zod/v4").ZodObject<{
1063
+ server_slug: import("zod/v4").ZodString;
1064
+ source: import("zod/v4").ZodEnum<{
1065
+ input_menu: "input_menu";
1066
+ mcp_connect_card: "mcp_connect_card";
1067
+ }>;
1068
+ }, import("zod/v4/core").$strip>;
1069
+ } & import("./define").TelemetryEventInput & {
1070
+ readonly getValidationError: (properties: unknown) => string | null;
1071
+ };
1072
+ readonly MCP_FIRST_CREDENTIAL_CONNECTION_STARTED: {
1073
+ readonly name: "Instance AI mcp first credential connection start";
1074
+ readonly description: "The user started connecting the first credential for an MCP server.";
1075
+ readonly properties: import("zod/v4").ZodObject<{
1076
+ server_slug: import("zod/v4").ZodString;
1077
+ }, import("zod/v4/core").$strip>;
1078
+ } & import("./define").TelemetryEventInput & {
1079
+ readonly getValidationError: (properties: unknown) => string | null;
1080
+ };
1081
+ readonly MCP_CREDENTIAL_DROPDOWN_OPENED: {
1082
+ readonly name: "Instance AI mcp credential dropdown opened";
1083
+ readonly description: "The user opened the credential dropdown for an MCP server.";
1084
+ readonly properties: import("zod/v4").ZodObject<{
1085
+ server_slug: import("zod/v4").ZodString;
1086
+ }, import("zod/v4/core").$strip>;
1087
+ } & import("./define").TelemetryEventInput & {
1088
+ readonly getValidationError: (properties: unknown) => string | null;
1089
+ };
1090
+ readonly MCP_EXISTING_CREDENTIAL_SELECTED: {
1091
+ readonly name: "Instance AI mcp existing credential selected";
1092
+ readonly description: "The user selected an existing credential for an MCP server.";
1093
+ readonly properties: import("zod/v4").ZodObject<{
1094
+ server_slug: import("zod/v4").ZodString;
1095
+ }, import("zod/v4/core").$strip>;
1096
+ } & import("./define").TelemetryEventInput & {
1097
+ readonly getValidationError: (properties: unknown) => string | null;
1098
+ };
1099
+ readonly MCP_NEW_CREDENTIAL_CONNECTION_STARTED: {
1100
+ readonly name: "Instance AI mcp new credential connection start";
1101
+ readonly description: "The user started connecting a new credential for an MCP server.";
1102
+ readonly properties: import("zod/v4").ZodObject<{
1103
+ server_slug: import("zod/v4").ZodString;
1104
+ }, import("zod/v4/core").$strip>;
1105
+ } & import("./define").TelemetryEventInput & {
1106
+ readonly getValidationError: (properties: unknown) => string | null;
1107
+ };
1108
+ readonly MCP_TOOL_FILTER_SETTINGS_UPDATED: {
1109
+ readonly name: "Instance AI mcp tool filter settings updated";
1110
+ readonly description: "The user updated which tools are enabled for an MCP server.";
1111
+ readonly properties: import("zod/v4").ZodObject<{
1112
+ server_slug: import("zod/v4").ZodString;
1113
+ inclusion_mode: import("zod/v4").ZodEnum<{
1114
+ all: "all";
1115
+ except: "except";
1116
+ selected: "selected";
1117
+ }>;
1118
+ }, import("zod/v4/core").$strip>;
1119
+ } & import("./define").TelemetryEventInput & {
1120
+ readonly getValidationError: (properties: unknown) => string | null;
1121
+ };
1122
+ readonly BROWSER_USE_MODAL_OPENED: {
1123
+ readonly name: "Instance AI Connect Browser Use modal opened";
1124
+ readonly description: "The user opened the Browser Use connection interface.";
1125
+ readonly properties: import("zod/v4").ZodObject<{
1126
+ browser_supported: import("zod/v4").ZodBoolean;
1127
+ source: import("zod/v4").ZodEnum<{
1128
+ credential_setup: "credential_setup";
1129
+ input_menu: "input_menu";
1130
+ tools_modal: "tools_modal";
1131
+ }>;
1132
+ }, import("zod/v4/core").$strip>;
1133
+ } & import("./define").TelemetryEventInput & {
1134
+ readonly getValidationError: (properties: unknown) => string | null;
1135
+ };
1136
+ readonly BROWSER_USE_INSTALL_EXTENSION_CLICKED: {
1137
+ readonly name: "Instance AI Install Chrome Browser Extension button clicked";
1138
+ readonly description: "The user clicked the button to install the Browser Use Chrome extension.";
1139
+ readonly properties: import("zod/v4").ZodObject<{}, import("zod/v4/core").$strip>;
1140
+ } & import("./define").TelemetryEventInput & {
1141
+ readonly getValidationError: (properties: unknown) => string | null;
1142
+ };
1143
+ readonly BROWSER_USE_OPEN_EXTENSION_CLICKED: {
1144
+ readonly name: "Instance AI Open Browser Use Extension button clicked";
1145
+ readonly description: "The user clicked the button to open the Browser Use extension.";
1146
+ readonly properties: import("zod/v4").ZodObject<{}, import("zod/v4/core").$strip>;
1147
+ } & import("./define").TelemetryEventInput & {
1148
+ readonly getValidationError: (properties: unknown) => string | null;
1149
+ };
1150
+ readonly BROWSER_USE_DIRECT_CONNECT_REQUESTED: {
1151
+ readonly name: "Instance AI Browser Use direct connect requested";
1152
+ readonly description: "The AI Assistant requested a direct connection through the Browser Use extension.";
1153
+ readonly properties: import("zod/v4").ZodObject<{}, import("zod/v4/core").$strip>;
1154
+ } & import("./define").TelemetryEventInput & {
1155
+ readonly getValidationError: (properties: unknown) => string | null;
1156
+ };
1157
+ readonly COMPUTER_USE_MODAL_OPENED: {
1158
+ readonly name: "User opened computer use connection modal";
1159
+ readonly description: "The user opened the Computer Use connection interface.";
1160
+ readonly properties: import("zod/v4").ZodObject<{
1161
+ is_connected: import("zod/v4").ZodBoolean;
1162
+ source: import("zod/v4").ZodEnum<{
1163
+ input_menu: "input_menu";
1164
+ tools_modal: "tools_modal";
1165
+ }>;
1166
+ }, import("zod/v4/core").$strip>;
1167
+ } & import("./define").TelemetryEventInput & {
1168
+ readonly getValidationError: (properties: unknown) => string | null;
1169
+ };
1170
+ readonly COMPUTER_USE_CONNECTION_COMMAND_COPIED: {
1171
+ readonly name: "User copied computer use connection command";
1172
+ readonly description: "The user copied the Computer Use connection command.";
1173
+ readonly properties: import("zod/v4").ZodObject<{
1174
+ os: import("zod/v4").ZodEnum<{
1175
+ linux: "linux";
1176
+ mac: "mac";
1177
+ windows: "windows";
1178
+ }>;
1179
+ }, import("zod/v4/core").$strip>;
1180
+ } & import("./define").TelemetryEventInput & {
1181
+ readonly getValidationError: (properties: unknown) => string | null;
1182
+ };
1016
1183
  readonly BUILDER_SPECCED_TEMPLATED_CRED: {
1017
1184
  readonly name: "Builder specced templated cred";
1018
1185
  readonly description: "The Instance AI workflow builder composed a Simplified Custom Auth recipe (credentialHints) and suspended to show its setup card. Captures the recipe fields so template and link quality are observable in production — one event per recipe in the suspension. Contains no secrets by construction: recipes are agent-authored before any user input.";
@@ -1190,6 +1357,46 @@ export declare const TELEMETRY_EVENT: {
1190
1357
  } & import("./define").TelemetryEventInput & {
1191
1358
  readonly getValidationError: (properties: unknown) => string | null;
1192
1359
  };
1360
+ readonly USER_CLICKED_CONNECT_CLIENT: {
1361
+ readonly name: "User clicked connect MCP client";
1362
+ readonly description: "A user opened the connect-client dialog. Heads the client setup funnel: sessions carrying this event without a follow-up copy or token fetch are the ones abandoning the one-click setup.";
1363
+ readonly properties: import("zod/v4").ZodObject<{
1364
+ source: import("zod/v4").ZodEnum<{
1365
+ settings: "settings";
1366
+ }>;
1367
+ }, import("zod/v4/core").$strip>;
1368
+ } & import("./define").TelemetryEventInput & {
1369
+ readonly getValidationError: (properties: unknown) => string | null;
1370
+ };
1371
+ readonly USER_VIEWED_ALL_MCP_CLIENTS: {
1372
+ readonly name: "User viewed all MCP clients";
1373
+ readonly description: "An admin switched the connected-clients page from their own consents to the whole instance's. Only the switch is reported, so landing on the page emits nothing.";
1374
+ readonly properties: import("zod/v4").ZodObject<{}, import("zod/v4/core").$strip>;
1375
+ } & import("./define").TelemetryEventInput & {
1376
+ readonly getValidationError: (properties: unknown) => string | null;
1377
+ };
1378
+ readonly USER_REVOKED_MCP_CLIENT_ACCESS: {
1379
+ readonly name: "User revoked MCP client access";
1380
+ readonly description: "A connected client's MCP access was revoked from the connected-clients page. Fires once the revoke succeeds, so opening the confirmation dialog and cancelling emits nothing.";
1381
+ readonly properties: import("zod/v4").ZodObject<{
1382
+ client_id: import("zod/v4").ZodString;
1383
+ client_brand: import("zod/v4").ZodNullable<import("zod/v4").ZodEnum<{
1384
+ claude: "claude";
1385
+ cursor: "cursor";
1386
+ openai: "openai";
1387
+ vscode: "vscode";
1388
+ }>>;
1389
+ client_type: import("zod/v4").ZodNullable<import("zod/v4").ZodEnum<{
1390
+ assistant: "assistant";
1391
+ cli: "cli";
1392
+ editor: "editor";
1393
+ ide: "ide";
1394
+ }>>;
1395
+ revoked_for_other: import("zod/v4").ZodBoolean;
1396
+ }, import("zod/v4/core").$strip>;
1397
+ } & import("./define").TelemetryEventInput & {
1398
+ readonly getValidationError: (properties: unknown) => string | null;
1399
+ };
1193
1400
  readonly AUTO_EXPOSE_NEW_WORKFLOWS_TOGGLED: {
1194
1401
  readonly name: "User toggled auto-expose new workflows to MCP";
1195
1402
  readonly description: "An admin turned the \"Auto-expose new workflows\" MCP setting on or off. Reports the resulting state so enabling and disabling are distinguishable.";
@@ -1204,4 +1411,97 @@ export declare const TELEMETRY_EVENT: {
1204
1411
  readonly getValidationError: (properties: unknown) => string | null;
1205
1412
  };
1206
1413
  };
1414
+ WORKFLOW: {
1415
+ readonly NODE_IDS_HEALED: {
1416
+ readonly name: "Workflow node ids healed";
1417
+ readonly description: "A published version about to be activated carried duplicate or missing node ids, so a corrected system-authored version was published in its place. `superseded` means the corrected version lost against a concurrent publish or unpublish and was discarded.";
1418
+ readonly properties: import("zod/v4").ZodObject<{
1419
+ workflow_id: import("zod/v4").ZodString;
1420
+ filled_count: import("zod/v4").ZodNumber;
1421
+ reassigned_count: import("zod/v4").ZodNumber;
1422
+ dropped_count: import("zod/v4").ZodNumber;
1423
+ superseded: import("zod/v4").ZodBoolean;
1424
+ }, import("zod/v4/core").$strip>;
1425
+ } & import("./define").TelemetryEventInput & {
1426
+ readonly getValidationError: (properties: unknown) => string | null;
1427
+ };
1428
+ };
1429
+ WORKFLOW_REVIEWS: {
1430
+ readonly USER_REQUESTED_WORKFLOW_REVIEW: {
1431
+ readonly name: "User requested workflow review";
1432
+ readonly description: "A workflow was submitted for review, opening a review request. Fires once per opened review, not on a later re-pin.";
1433
+ readonly properties: import("zod/v4").ZodObject<{
1434
+ user_id: import("zod/v4").ZodString;
1435
+ workflow_review_request_id: import("zod/v4").ZodString;
1436
+ project_id: import("zod/v4").ZodString;
1437
+ workflow_id: import("zod/v4").ZodString;
1438
+ workflow_version_id: import("zod/v4").ZodString;
1439
+ reviewer_count: import("zod/v4").ZodNumber;
1440
+ }, import("zod/v4/core").$strip>;
1441
+ } & import("./define").TelemetryEventInput & {
1442
+ readonly getValidationError: (properties: unknown) => string | null;
1443
+ };
1444
+ readonly USER_UPDATED_WORKFLOW_VERSION_UNDER_REVIEW: {
1445
+ readonly name: "User updated workflow version under review";
1446
+ readonly description: "An open review was re-pinned to another version of the workflow it covers. Fires only on a real re-pin, not on a rename or a description edit.";
1447
+ readonly properties: import("zod/v4").ZodObject<{
1448
+ user_id: import("zod/v4").ZodString;
1449
+ workflow_review_request_id: import("zod/v4").ZodString;
1450
+ workflow_id: import("zod/v4").ZodString;
1451
+ workflow_version_id: import("zod/v4").ZodString;
1452
+ }, import("zod/v4/core").$strip>;
1453
+ } & import("./define").TelemetryEventInput & {
1454
+ readonly getValidationError: (properties: unknown) => string | null;
1455
+ };
1456
+ readonly USER_DECIDED_WORKFLOW_REVIEW: {
1457
+ readonly name: "User decided workflow review";
1458
+ readonly description: "A user approved a review or requested changes on it. Fires once per decision, so a review can appear several times.";
1459
+ readonly properties: import("zod/v4").ZodObject<{
1460
+ user_id: import("zod/v4").ZodString;
1461
+ workflow_review_request_id: import("zod/v4").ZodString;
1462
+ workflow_id: import("zod/v4").ZodString;
1463
+ workflow_version_id: import("zod/v4").ZodNullable<import("zod/v4").ZodString>;
1464
+ decision: import("zod/v4").ZodEnum<{
1465
+ approved: "approved";
1466
+ changes_requested: "changes_requested";
1467
+ }>;
1468
+ decided_via: import("zod/v4").ZodEnum<{
1469
+ "admin-override": "admin-override";
1470
+ "assigned-reviewer": "assigned-reviewer";
1471
+ }>;
1472
+ review_created_at: import("zod/v4").ZodString;
1473
+ }, import("zod/v4/core").$strip>;
1474
+ } & import("./define").TelemetryEventInput & {
1475
+ readonly getValidationError: (properties: unknown) => string | null;
1476
+ };
1477
+ readonly WORKFLOW_REVIEW_CLOSED: {
1478
+ readonly name: "Workflow review closed";
1479
+ readonly description: "An open review was closed without a decision because no reviewable workflow was left on it. No user performs it.";
1480
+ readonly properties: import("zod/v4").ZodObject<{
1481
+ workflow_review_request_id: import("zod/v4").ZodString;
1482
+ cause_trigger: import("zod/v4").ZodEnum<{
1483
+ unknown: "unknown";
1484
+ "workflow-archived": "workflow-archived";
1485
+ "workflow-deleted": "workflow-deleted";
1486
+ "workflow-moved": "workflow-moved";
1487
+ }>;
1488
+ cause_actor_kind: import("zod/v4").ZodEnum<{
1489
+ system: "system";
1490
+ user: "user";
1491
+ }>;
1492
+ }, import("zod/v4/core").$strip>;
1493
+ } & import("./define").TelemetryEventInput & {
1494
+ readonly getValidationError: (properties: unknown) => string | null;
1495
+ };
1496
+ readonly USER_COMMENTED_ON_WORKFLOW_REVIEW: {
1497
+ readonly name: "User commented on workflow review";
1498
+ readonly description: "A comment was posted on an open review.";
1499
+ readonly properties: import("zod/v4").ZodObject<{
1500
+ user_id: import("zod/v4").ZodString;
1501
+ workflow_review_request_id: import("zod/v4").ZodString;
1502
+ }, import("zod/v4/core").$strip>;
1503
+ } & import("./define").TelemetryEventInput & {
1504
+ readonly getValidationError: (properties: unknown) => string | null;
1505
+ };
1506
+ };
1207
1507
  };
@@ -7,6 +7,8 @@ const instance_1 = require("./events/instance");
7
7
  const instance_ai_1 = require("./events/instance-ai");
8
8
  const mcp_1 = require("./events/mcp");
9
9
  const platform_1 = require("./events/platform");
10
+ const workflow_1 = require("./events/workflow");
11
+ const workflow_reviews_1 = require("./events/workflow-reviews");
10
12
  exports.TELEMETRY_EVENT = {
11
13
  PLATFORM: platform_1.PLATFORM_TELEMETRY,
12
14
  AGENTS: agents_1.AGENTS_TELEMETRY,
@@ -14,5 +16,7 @@ exports.TELEMETRY_EVENT = {
14
16
  INSTANCE: instance_1.INSTANCE_TELEMETRY,
15
17
  INSTANCE_AI: instance_ai_1.INSTANCE_AI_TELEMETRY,
16
18
  MCP: mcp_1.MCP_TELEMETRY,
19
+ WORKFLOW: workflow_1.WORKFLOW_TELEMETRY,
20
+ WORKFLOW_REVIEWS: workflow_reviews_1.WORKFLOW_REVIEWS_TELEMETRY,
17
21
  };
18
22
  //# sourceMappingURL=telemetry-events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-events.js","sourceRoot":"","sources":["../src/telemetry-events.ts"],"names":[],"mappings":";;;AACA,4CAAmD;AACnD,sDAA6D;AAC7D,gDAAuD;AACvD,sDAA6D;AAC7D,sCAA6C;AAC7C,gDAAuD;AAE1C,QAAA,eAAe,GAAG;IAC9B,QAAQ,EAAE,6BAAkB;IAC5B,MAAM,EAAE,yBAAgB;IACxB,WAAW,EAAE,mCAAqB;IAClC,QAAQ,EAAE,6BAAkB;IAC5B,WAAW,EAAE,mCAAqB;IAClC,GAAG,EAAE,mBAAa;CACe,CAAC"}
1
+ {"version":3,"file":"telemetry-events.js","sourceRoot":"","sources":["../src/telemetry-events.ts"],"names":[],"mappings":";;;AACA,4CAAmD;AACnD,sDAA6D;AAC7D,gDAAuD;AACvD,sDAA6D;AAC7D,sCAA6C;AAC7C,gDAAuD;AACvD,gDAAuD;AACvD,gEAAuE;AAE1D,QAAA,eAAe,GAAG;IAC9B,QAAQ,EAAE,6BAAkB;IAC5B,MAAM,EAAE,yBAAgB;IACxB,WAAW,EAAE,mCAAqB;IAClC,QAAQ,EAAE,6BAAkB;IAC5B,WAAW,EAAE,mCAAqB;IAClC,GAAG,EAAE,mBAAa;IAClB,QAAQ,EAAE,6BAAkB;IAC5B,gBAAgB,EAAE,6CAA0B;CACX,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n8n/telemetry",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "main": "dist/index.js",
5
5
  "module": "src/index.ts",
6
6
  "types": "dist/index.d.ts",
@@ -10,7 +10,8 @@
10
10
  "LICENSE_EE.md"
11
11
  ],
12
12
  "dependencies": {
13
- "zod": "3.25.76"
13
+ "zod": "3.25.76",
14
+ "@n8n/utils": "1.45.1"
14
15
  },
15
16
  "devDependencies": {
16
17
  "@types/node": "24.10.1",
@@ -19,9 +20,9 @@
19
20
  "typescript": "7.0.2",
20
21
  "vite": "^8.0.2",
21
22
  "vitest": "^4.1.9",
22
- "@n8n/eslint-config": "0.0.1",
23
23
  "@n8n/typescript-config": "1.10.0",
24
- "@n8n/vitest-config": "1.21.0"
24
+ "@n8n/vitest-config": "1.21.0",
25
+ "@n8n/eslint-config": "0.0.1"
25
26
  },
26
27
  "license": "SEE LICENSE IN LICENSE.md",
27
28
  "homepage": "https://n8n.io",