n8n-nodes-trusera 0.2.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 (55) hide show
  1. package/README.md +76 -0
  2. package/dist/credentials/TruseraApi.credentials.d.ts +9 -0
  3. package/dist/credentials/TruseraApi.credentials.d.ts.map +1 -0
  4. package/dist/credentials/TruseraApi.credentials.js +39 -0
  5. package/dist/credentials/TruseraApi.credentials.js.map +1 -0
  6. package/dist/index.d.ts +7 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +23 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/config.d.ts +30 -0
  11. package/dist/lib/config.d.ts.map +1 -0
  12. package/dist/lib/config.js +254 -0
  13. package/dist/lib/config.js.map +1 -0
  14. package/dist/lib/dashboardHtml.d.ts +13 -0
  15. package/dist/lib/dashboardHtml.d.ts.map +1 -0
  16. package/dist/lib/dashboardHtml.js +605 -0
  17. package/dist/lib/dashboardHtml.js.map +1 -0
  18. package/dist/lib/models.d.ts +93 -0
  19. package/dist/lib/models.d.ts.map +1 -0
  20. package/dist/lib/models.js +101 -0
  21. package/dist/lib/models.js.map +1 -0
  22. package/dist/lib/policyEngine.d.ts +22 -0
  23. package/dist/lib/policyEngine.d.ts.map +1 -0
  24. package/dist/lib/policyEngine.js +52 -0
  25. package/dist/lib/policyEngine.js.map +1 -0
  26. package/dist/lib/riskScorer.d.ts +13 -0
  27. package/dist/lib/riskScorer.d.ts.map +1 -0
  28. package/dist/lib/riskScorer.js +72 -0
  29. package/dist/lib/riskScorer.js.map +1 -0
  30. package/dist/lib/scanner.d.ts +33 -0
  31. package/dist/lib/scanner.d.ts.map +1 -0
  32. package/dist/lib/scanner.js +590 -0
  33. package/dist/lib/scanner.js.map +1 -0
  34. package/dist/nodes/TruseraDashboard/TruseraDashboard.node.d.ts +6 -0
  35. package/dist/nodes/TruseraDashboard/TruseraDashboard.node.d.ts.map +1 -0
  36. package/dist/nodes/TruseraDashboard/TruseraDashboard.node.js +66 -0
  37. package/dist/nodes/TruseraDashboard/TruseraDashboard.node.js.map +1 -0
  38. package/dist/nodes/TruseraDashboard/trusera.png +0 -0
  39. package/dist/nodes/TruseraDashboard/trusera.svg +4 -0
  40. package/dist/nodes/TruseraPolicy/TruseraPolicy.node.d.ts +6 -0
  41. package/dist/nodes/TruseraPolicy/TruseraPolicy.node.d.ts.map +1 -0
  42. package/dist/nodes/TruseraPolicy/TruseraPolicy.node.js +114 -0
  43. package/dist/nodes/TruseraPolicy/TruseraPolicy.node.js.map +1 -0
  44. package/dist/nodes/TruseraPolicy/trusera.svg +4 -0
  45. package/dist/nodes/TruseraReport/TruseraReport.node.d.ts +6 -0
  46. package/dist/nodes/TruseraReport/TruseraReport.node.d.ts.map +1 -0
  47. package/dist/nodes/TruseraReport/TruseraReport.node.js +201 -0
  48. package/dist/nodes/TruseraReport/TruseraReport.node.js.map +1 -0
  49. package/dist/nodes/TruseraReport/trusera.svg +4 -0
  50. package/dist/nodes/TruseraScan/TruseraScan.node.d.ts +6 -0
  51. package/dist/nodes/TruseraScan/TruseraScan.node.d.ts.map +1 -0
  52. package/dist/nodes/TruseraScan/TruseraScan.node.js +140 -0
  53. package/dist/nodes/TruseraScan/TruseraScan.node.js.map +1 -0
  54. package/dist/nodes/TruseraScan/trusera.svg +4 -0
  55. package/package.json +62 -0
@@ -0,0 +1,590 @@
1
+ "use strict";
2
+ /**
3
+ * n8n workflow scanner for detecting AI agents and MCP usage.
4
+ * Ported from the Python n8n_scanner.py.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isValidWorkflow = isValidWorkflow;
8
+ exports.parseConnections = parseConnections;
9
+ exports.extractWorkflowInfo = extractWorkflowInfo;
10
+ exports.scanWorkflow = scanWorkflow;
11
+ exports.scanWorkflows = scanWorkflows;
12
+ const config_1 = require("./config");
13
+ const models_1 = require("./models");
14
+ const riskScorer_1 = require("./riskScorer");
15
+ // ---------------------------------------------------------------------------
16
+ // Validation
17
+ // ---------------------------------------------------------------------------
18
+ /** Check whether an object looks like a valid n8n workflow. */
19
+ function isValidWorkflow(data) {
20
+ if (typeof data !== 'object' || data === null)
21
+ return false;
22
+ const obj = data;
23
+ return Array.isArray(obj['nodes']) && typeof obj['connections'] === 'object' && obj['connections'] !== null;
24
+ }
25
+ // ---------------------------------------------------------------------------
26
+ // Connection parsing
27
+ // ---------------------------------------------------------------------------
28
+ /** Parse n8n connections object into a simple node-name -> node-names mapping. */
29
+ function parseConnections(connections) {
30
+ const result = {};
31
+ for (const [sourceNode, connectionTypes] of Object.entries(connections)) {
32
+ const connectedNodes = new Set();
33
+ if (typeof connectionTypes === 'object' && connectionTypes !== null) {
34
+ for (const connList of Object.values(connectionTypes)) {
35
+ if (!Array.isArray(connList))
36
+ continue;
37
+ for (const connGroup of connList) {
38
+ if (!Array.isArray(connGroup))
39
+ continue;
40
+ for (const conn of connGroup) {
41
+ if (typeof conn === 'object' && conn !== null) {
42
+ const target = conn['node'];
43
+ if (typeof target === 'string') {
44
+ connectedNodes.add(target);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ result[sourceNode] = [...connectedNodes];
52
+ }
53
+ return result;
54
+ }
55
+ /** Get all outgoing connected node names for a given node. */
56
+ function getAllConnectedNodes(nodeName, connections) {
57
+ const connected = [];
58
+ const connectionTypes = connections[nodeName];
59
+ if (typeof connectionTypes !== 'object' || connectionTypes === null)
60
+ return connected;
61
+ for (const connList of Object.values(connectionTypes)) {
62
+ if (!Array.isArray(connList))
63
+ continue;
64
+ for (const connGroup of connList) {
65
+ if (!Array.isArray(connGroup))
66
+ continue;
67
+ for (const conn of connGroup) {
68
+ if (typeof conn === 'object' && conn !== null) {
69
+ const target = conn['node'];
70
+ if (typeof target === 'string') {
71
+ connected.push(target);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+ return connected;
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Trigger detection
81
+ // ---------------------------------------------------------------------------
82
+ function detectTriggerType(nodes) {
83
+ for (const node of nodes) {
84
+ const nodeType = (node.type ?? '').toLowerCase();
85
+ if (nodeType.includes('webhook'))
86
+ return 'webhook';
87
+ if (nodeType.includes('schedule') || nodeType.includes('cron'))
88
+ return 'schedule';
89
+ if (nodeType.includes('trigger') && nodeType.includes('manual'))
90
+ return 'manual';
91
+ }
92
+ return 'unknown';
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // Agent helpers
96
+ // ---------------------------------------------------------------------------
97
+ function isAgentNode(nodeType) {
98
+ return nodeType.toLowerCase().includes('.agent');
99
+ }
100
+ function extractAgentChains(nodes, connections) {
101
+ const agentNodes = new Set();
102
+ for (const node of nodes) {
103
+ if (isAgentNode(node.type ?? '')) {
104
+ agentNodes.add(node.name ?? '');
105
+ }
106
+ }
107
+ const chains = [];
108
+ for (const agent of agentNodes) {
109
+ const chain = [agent];
110
+ let current = agent;
111
+ while (connections[current]) {
112
+ const nextAgents = connections[current].filter((n) => agentNodes.has(n));
113
+ if (nextAgents.length === 0)
114
+ break;
115
+ const nextAgent = nextAgents[0];
116
+ if (chain.includes(nextAgent))
117
+ break;
118
+ chain.push(nextAgent);
119
+ current = nextAgent;
120
+ }
121
+ if (chain.length > 1) {
122
+ chains.push(chain);
123
+ }
124
+ }
125
+ return chains;
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Workflow info extraction
129
+ // ---------------------------------------------------------------------------
130
+ function extractWorkflowInfo(workflow, filePath) {
131
+ const nodes = workflow.nodes ?? [];
132
+ const nodeTypes = nodes.map((n) => n.type ?? '');
133
+ const connections = parseConnections(workflow.connections ?? {});
134
+ const triggerType = detectTriggerType(nodes);
135
+ const agentChains = extractAgentChains(nodes, connections);
136
+ return {
137
+ workflowName: workflow.name ?? filePath,
138
+ workflowId: typeof workflow.id === 'string' ? workflow.id : '',
139
+ nodes: nodeTypes,
140
+ connections,
141
+ triggerType,
142
+ agentChains,
143
+ };
144
+ }
145
+ function mapNodeType(nodeType) {
146
+ if (nodeType.includes('.agent'))
147
+ return [models_1.ComponentType.AgentFramework, models_1.UsageType.Agent, 'n8n'];
148
+ if (nodeType.includes('.lmChatOpenAi'))
149
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'OpenAI'];
150
+ if (nodeType.includes('.lmChatAnthropic'))
151
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'Anthropic'];
152
+ if (nodeType.includes('.lmChatGoogleGemini'))
153
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'Google'];
154
+ if (nodeType.includes('.lmChatOllama'))
155
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'Ollama'];
156
+ if (nodeType.includes('.lmChatAzureOpenAi'))
157
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'Azure OpenAI'];
158
+ if (nodeType.includes('.lmChatMistralCloud'))
159
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'Mistral'];
160
+ if (nodeType.includes('.lmChatGroq'))
161
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'Groq'];
162
+ if (nodeType.includes('.lmChatCohere'))
163
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'Cohere'];
164
+ if (nodeType.includes('.lmChatHuggingFace'))
165
+ return [models_1.ComponentType.LlmProvider, models_1.UsageType.Completion, 'HuggingFace'];
166
+ if (nodeType.includes('.mcpClientTool'))
167
+ return [models_1.ComponentType.McpClient, models_1.UsageType.ToolUse, 'MCP'];
168
+ if (nodeType.includes('.toolHttpRequest'))
169
+ return [models_1.ComponentType.Tool, models_1.UsageType.ToolUse, 'n8n'];
170
+ if (nodeType.includes('.toolCode'))
171
+ return [models_1.ComponentType.Tool, models_1.UsageType.ToolUse, 'n8n'];
172
+ if (nodeType.includes('.toolWorkflow'))
173
+ return [models_1.ComponentType.Tool, models_1.UsageType.ToolUse, 'n8n'];
174
+ if (nodeType.includes('.toolCalculator'))
175
+ return [models_1.ComponentType.Tool, models_1.UsageType.ToolUse, 'n8n'];
176
+ if (nodeType.includes('.toolWikipedia'))
177
+ return [models_1.ComponentType.Tool, models_1.UsageType.ToolUse, 'n8n'];
178
+ if (nodeType.toLowerCase().includes('embedding')) {
179
+ let provider = 'unknown';
180
+ if (nodeType.includes('OpenAi'))
181
+ provider = 'OpenAI';
182
+ else if (nodeType.includes('Azure'))
183
+ provider = 'Azure OpenAI';
184
+ else if (nodeType.includes('Cohere'))
185
+ provider = 'Cohere';
186
+ else if (nodeType.includes('HuggingFace'))
187
+ provider = 'HuggingFace';
188
+ else if (nodeType.includes('GoogleGemini'))
189
+ provider = 'Google';
190
+ else if (nodeType.includes('Ollama'))
191
+ provider = 'Ollama';
192
+ return [models_1.ComponentType.Model, models_1.UsageType.Embedding, provider];
193
+ }
194
+ if (nodeType.includes('vectorStore')) {
195
+ let provider = 'unknown';
196
+ if (nodeType.includes('Chroma'))
197
+ provider = 'ChromaDB';
198
+ else if (nodeType.includes('Pinecone'))
199
+ provider = 'Pinecone';
200
+ else if (nodeType.includes('Qdrant'))
201
+ provider = 'Qdrant';
202
+ else if (nodeType.includes('Supabase'))
203
+ provider = 'Supabase';
204
+ else if (nodeType.includes('InMemory'))
205
+ provider = 'in-memory';
206
+ else if (nodeType.includes('Weaviate'))
207
+ provider = 'Weaviate';
208
+ return [models_1.ComponentType.Tool, models_1.UsageType.Embedding, provider];
209
+ }
210
+ if (nodeType.toLowerCase().includes('chain'))
211
+ return [models_1.ComponentType.AgentFramework, models_1.UsageType.Orchestration, 'n8n'];
212
+ if (nodeType.toLowerCase().includes('memory'))
213
+ return [models_1.ComponentType.Tool, models_1.UsageType.ToolUse, 'n8n'];
214
+ return null;
215
+ }
216
+ function extractModelName(parameters) {
217
+ const modelKeys = ['model', 'modelId', 'modelName', 'modelVersion'];
218
+ for (const key of modelKeys) {
219
+ const value = parameters[key];
220
+ if (typeof value === 'string')
221
+ return value;
222
+ }
223
+ const resource = parameters['resource'];
224
+ if (typeof resource === 'object' && resource !== null) {
225
+ for (const key of modelKeys) {
226
+ const value = resource[key];
227
+ if (typeof value === 'string')
228
+ return value;
229
+ }
230
+ }
231
+ return '';
232
+ }
233
+ // ---------------------------------------------------------------------------
234
+ // Credential detection
235
+ // ---------------------------------------------------------------------------
236
+ const CREDENTIAL_KEYS = [
237
+ 'apiKey', 'api_key', 'token', 'accessToken', 'access_token',
238
+ 'secret', 'secretKey', 'secret_key', 'password', 'authToken', 'auth_token',
239
+ ];
240
+ const PLACEHOLDER_VALUES = new Set([
241
+ 'your_api_key', 'your-api-key', 'placeholder', 'example',
242
+ ]);
243
+ function hasHardcodedCredentials(parameters) {
244
+ for (const key of CREDENTIAL_KEYS) {
245
+ const value = parameters[key];
246
+ if (typeof value === 'string' &&
247
+ value.length > 5 &&
248
+ !PLACEHOLDER_VALUES.has(value.toLowerCase())) {
249
+ return true;
250
+ }
251
+ }
252
+ const paramsStr = JSON.stringify(parameters);
253
+ return config_1.API_KEY_PATTERNS.some((p) => p.pattern.test(paramsStr));
254
+ }
255
+ // ---------------------------------------------------------------------------
256
+ // MCP risk checks
257
+ // ---------------------------------------------------------------------------
258
+ function checkMcpRisks(parameters, component) {
259
+ const urlKeys = ['sseEndpoint', 'sseUrl', 'serverUrl', 'url', 'endpoint'];
260
+ for (const key of urlKeys) {
261
+ const urlValue = parameters[key];
262
+ if (typeof urlValue === 'string' && urlValue) {
263
+ const lower = urlValue.toLowerCase();
264
+ if (!lower.includes('localhost') && !urlValue.includes('127.0.0.1') && !urlValue.includes('::1')) {
265
+ component.flags.push('mcp_unknown_server');
266
+ break;
267
+ }
268
+ }
269
+ }
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ // Node -> AIComponent conversion
273
+ // ---------------------------------------------------------------------------
274
+ function nodeToComponent(node, filePath, workflowInfo) {
275
+ const nodeType = node.type ?? '';
276
+ const nodeName = node.name ?? '';
277
+ const parameters = (node.parameters ?? {});
278
+ const mapping = mapNodeType(nodeType);
279
+ if (!mapping)
280
+ return null;
281
+ const [compType, usageType, provider] = mapping;
282
+ const modelName = extractModelName(parameters);
283
+ const component = (0, models_1.createComponent)({
284
+ name: nodeName || nodeType,
285
+ type: compType,
286
+ provider,
287
+ modelName,
288
+ usageType,
289
+ location: {
290
+ filePath,
291
+ contextSnippet: `Workflow: ${workflowInfo.workflowName}, Node: ${nodeName}`,
292
+ },
293
+ metadata: {
294
+ workflow_name: workflowInfo.workflowName,
295
+ workflow_id: workflowInfo.workflowId,
296
+ node_type: nodeType,
297
+ trigger_type: workflowInfo.triggerType,
298
+ },
299
+ });
300
+ if (hasHardcodedCredentials(parameters)) {
301
+ component.flags.push('hardcoded_credentials');
302
+ }
303
+ if (compType === models_1.ComponentType.McpClient) {
304
+ checkMcpRisks(parameters, component);
305
+ }
306
+ return component;
307
+ }
308
+ // ---------------------------------------------------------------------------
309
+ // Base-node inspection (non-AI nodes with security risks)
310
+ // ---------------------------------------------------------------------------
311
+ function inspectBaseNodes(workflow, filePath, workflowInfo, components) {
312
+ const compiledDangerPatterns = config_1.DANGEROUS_CODE_PATTERNS.map((p) => new RegExp(p));
313
+ for (const node of workflow.nodes) {
314
+ const nodeType = node.type ?? '';
315
+ const nodeName = node.name ?? '';
316
+ const parameters = (node.parameters ?? {});
317
+ if (config_1.N8N_AI_NODE_TYPES.has(nodeType))
318
+ continue;
319
+ // Check httpRequest nodes for hardcoded API keys
320
+ if (nodeType === 'n8n-nodes-base.httpRequest') {
321
+ const paramsStr = JSON.stringify(parameters);
322
+ for (const { pattern, provider } of config_1.API_KEY_PATTERNS) {
323
+ if (pattern.test(paramsStr)) {
324
+ components.push((0, models_1.createComponent)({
325
+ name: `${provider} API Key in HTTP Request`,
326
+ type: models_1.ComponentType.LlmProvider,
327
+ provider,
328
+ usageType: models_1.UsageType.Unknown,
329
+ flags: ['hardcoded_credentials'],
330
+ location: {
331
+ filePath,
332
+ contextSnippet: `Workflow: ${workflowInfo.workflowName}, Node: ${nodeName}`,
333
+ },
334
+ metadata: {
335
+ workflow_name: workflowInfo.workflowName,
336
+ workflow_id: workflowInfo.workflowId,
337
+ node_type: nodeType,
338
+ node_name: nodeName,
339
+ trigger_type: workflowInfo.triggerType,
340
+ },
341
+ }));
342
+ break;
343
+ }
344
+ }
345
+ }
346
+ // Check code nodes for dangerous patterns
347
+ if (nodeType === 'n8n-nodes-base.code') {
348
+ const codeContent = (typeof parameters['jsCode'] === 'string' ? parameters['jsCode'] : '') ||
349
+ (typeof parameters['code'] === 'string' ? parameters['code'] : '');
350
+ if (codeContent) {
351
+ for (const dangerPattern of compiledDangerPatterns) {
352
+ if (dangerPattern.test(codeContent)) {
353
+ components.push((0, models_1.createComponent)({
354
+ name: `Dangerous Code: ${nodeName}`,
355
+ type: models_1.ComponentType.Tool,
356
+ provider: 'n8n',
357
+ usageType: models_1.UsageType.ToolUse,
358
+ flags: ['code_http_tools'],
359
+ location: {
360
+ filePath,
361
+ contextSnippet: `Workflow: ${workflowInfo.workflowName}, Node: ${nodeName}`,
362
+ },
363
+ metadata: {
364
+ workflow_name: workflowInfo.workflowName,
365
+ workflow_id: workflowInfo.workflowId,
366
+ node_type: nodeType,
367
+ node_name: nodeName,
368
+ trigger_type: workflowInfo.triggerType,
369
+ },
370
+ }));
371
+ break;
372
+ }
373
+ }
374
+ }
375
+ }
376
+ }
377
+ }
378
+ // ---------------------------------------------------------------------------
379
+ // Workflow-level risks
380
+ // ---------------------------------------------------------------------------
381
+ function hasInsecureWebhook(nodes) {
382
+ for (const node of nodes) {
383
+ if ((node.type ?? '').toLowerCase().includes('webhook')) {
384
+ const auth = (node.parameters ?? {})['authentication'];
385
+ if (auth === undefined || auth === null || auth === 'none') {
386
+ return true;
387
+ }
388
+ }
389
+ }
390
+ return false;
391
+ }
392
+ function checkAgentToolRisks(nodes, connections, components) {
393
+ const nodeMap = new Map();
394
+ for (const node of nodes) {
395
+ nodeMap.set(node.name ?? '', node);
396
+ }
397
+ for (const node of nodes) {
398
+ if (!isAgentNode(node.type ?? ''))
399
+ continue;
400
+ const nodeName = node.name ?? '';
401
+ const connectedNames = getAllConnectedNodes(nodeName, connections);
402
+ let hasCodeTool = false;
403
+ let hasHttpTool = false;
404
+ for (const connectedName of connectedNames) {
405
+ const connectedNode = nodeMap.get(connectedName);
406
+ if (!connectedNode)
407
+ continue;
408
+ const connType = connectedNode.type ?? '';
409
+ if (connType.includes('.toolCode') || connType === 'n8n-nodes-base.code')
410
+ hasCodeTool = true;
411
+ if (connType.includes('.toolHttpRequest') || connType === 'n8n-nodes-base.httpRequest')
412
+ hasHttpTool = true;
413
+ }
414
+ if (hasCodeTool && hasHttpTool) {
415
+ for (const component of components) {
416
+ if (component.type === models_1.ComponentType.AgentFramework && component.name === nodeName) {
417
+ component.flags.push('code_http_tools');
418
+ }
419
+ }
420
+ }
421
+ }
422
+ }
423
+ function checkAgentChainRisks(nodes, connections, components) {
424
+ const nodeMap = new Map();
425
+ for (const node of nodes) {
426
+ nodeMap.set(node.name ?? '', node);
427
+ }
428
+ for (const node of nodes) {
429
+ const nodeType = node.type ?? '';
430
+ if (!nodeType.includes('executeWorkflow'))
431
+ continue;
432
+ const nodeName = node.name ?? '';
433
+ let hasAgentInput = false;
434
+ let hasAgentOutput = false;
435
+ // Check incoming connections
436
+ for (const [sourceNode, targets] of Object.entries(connections)) {
437
+ if (typeof targets !== 'object' || targets === null)
438
+ continue;
439
+ for (const connList of Object.values(targets)) {
440
+ if (!Array.isArray(connList))
441
+ continue;
442
+ for (const connGroup of connList) {
443
+ if (!Array.isArray(connGroup))
444
+ continue;
445
+ for (const conn of connGroup) {
446
+ if (typeof conn === 'object' && conn !== null && conn['node'] === nodeName) {
447
+ const source = nodeMap.get(sourceNode);
448
+ if (source && isAgentNode(source.type ?? '')) {
449
+ hasAgentInput = true;
450
+ }
451
+ }
452
+ }
453
+ }
454
+ }
455
+ }
456
+ // Check outgoing connections
457
+ const connectedNames = getAllConnectedNodes(nodeName, connections);
458
+ for (const connectedName of connectedNames) {
459
+ const connectedNode = nodeMap.get(connectedName);
460
+ if (connectedNode && isAgentNode(connectedNode.type ?? '')) {
461
+ hasAgentOutput = true;
462
+ }
463
+ }
464
+ if (hasAgentInput && hasAgentOutput) {
465
+ for (const component of components) {
466
+ if (component.type === models_1.ComponentType.AgentFramework) {
467
+ component.flags.push('agent_chain_no_validation');
468
+ }
469
+ }
470
+ }
471
+ }
472
+ }
473
+ function applyWorkflowRisks(workflow, components) {
474
+ const nodes = workflow.nodes ?? [];
475
+ const connections = workflow.connections ?? {};
476
+ if (hasInsecureWebhook(nodes)) {
477
+ for (const component of components) {
478
+ if (component.type === models_1.ComponentType.AgentFramework) {
479
+ component.flags.push('webhook_no_auth');
480
+ }
481
+ }
482
+ }
483
+ checkAgentToolRisks(nodes, connections, components);
484
+ checkAgentChainRisks(nodes, connections, components);
485
+ }
486
+ // ---------------------------------------------------------------------------
487
+ // Cross-workflow agent chain detection
488
+ // ---------------------------------------------------------------------------
489
+ function detectCrossWorkflowChains(workflows, components) {
490
+ const workflowComponents = new Map();
491
+ for (const component of components) {
492
+ const wfName = component.metadata['workflow_name'] ?? '';
493
+ if (!workflowComponents.has(wfName)) {
494
+ workflowComponents.set(wfName, []);
495
+ }
496
+ workflowComponents.get(wfName).push(component);
497
+ }
498
+ for (const workflowInfo of workflows.values()) {
499
+ const wfComps = workflowComponents.get(workflowInfo.workflowName) ?? [];
500
+ const agentCount = wfComps.filter((c) => c.type === models_1.ComponentType.AgentFramework).length;
501
+ if (agentCount > 1 && workflowInfo.agentChains.length > 0) {
502
+ for (const component of wfComps) {
503
+ if (component.type === models_1.ComponentType.AgentFramework &&
504
+ !component.flags.includes('agent_chain_no_validation')) {
505
+ component.flags.push('multi_agent_no_trust');
506
+ }
507
+ }
508
+ }
509
+ }
510
+ }
511
+ // ---------------------------------------------------------------------------
512
+ // Public scan API
513
+ // ---------------------------------------------------------------------------
514
+ /** Scan a single n8n workflow JSON object and return AI components. */
515
+ function scanWorkflow(workflowData, filePath) {
516
+ if (!isValidWorkflow(workflowData))
517
+ return [];
518
+ const workflowInfo = extractWorkflowInfo(workflowData, filePath);
519
+ const components = [];
520
+ // Extract AI components from AI node types
521
+ for (const node of workflowData.nodes) {
522
+ const nodeType = node.type ?? '';
523
+ if (!config_1.N8N_AI_NODE_TYPES.has(nodeType))
524
+ continue;
525
+ const component = nodeToComponent(node, filePath, workflowInfo);
526
+ if (component)
527
+ components.push(component);
528
+ }
529
+ // Inspect base nodes for security risks
530
+ inspectBaseNodes(workflowData, filePath, workflowInfo, components);
531
+ // Apply workflow-level risk patterns
532
+ applyWorkflowRisks(workflowData, components);
533
+ // Score all components
534
+ for (const component of components) {
535
+ component.risk = (0, riskScorer_1.scoreComponent)(component);
536
+ }
537
+ return components;
538
+ }
539
+ /** Scan multiple n8n workflow JSON objects and return a full ScanResult. */
540
+ function scanWorkflows(workflows) {
541
+ const startTime = Date.now();
542
+ const allComponents = [];
543
+ const workflowInfoMap = new Map();
544
+ for (const { data, filePath } of workflows) {
545
+ if (!isValidWorkflow(data))
546
+ continue;
547
+ const workflowInfo = extractWorkflowInfo(data, filePath);
548
+ workflowInfoMap.set(filePath, workflowInfo);
549
+ const components = [];
550
+ for (const node of data.nodes) {
551
+ const nodeType = node.type ?? '';
552
+ if (!config_1.N8N_AI_NODE_TYPES.has(nodeType))
553
+ continue;
554
+ const component = nodeToComponent(node, filePath, workflowInfo);
555
+ if (component)
556
+ components.push(component);
557
+ }
558
+ inspectBaseNodes(data, filePath, workflowInfo, components);
559
+ applyWorkflowRisks(data, components);
560
+ allComponents.push(...components);
561
+ }
562
+ // Cross-workflow chain detection
563
+ detectCrossWorkflowChains(workflowInfoMap, allComponents);
564
+ // Score all components
565
+ for (const component of allComponents) {
566
+ component.risk = (0, riskScorer_1.scoreComponent)(component);
567
+ }
568
+ const elapsed = (Date.now() - startTime) / 1000;
569
+ const result = {
570
+ targetPath: workflows.length === 1 ? workflows[0].filePath : 'multiple',
571
+ scanTimestamp: new Date().toISOString(),
572
+ aiBomVersion: '0.1.0',
573
+ components: allComponents,
574
+ n8nWorkflows: [...workflowInfoMap.values()],
575
+ summary: {
576
+ totalComponents: 0,
577
+ totalFilesScanned: workflows.length,
578
+ byType: {},
579
+ byProvider: {},
580
+ bySeverity: {},
581
+ highestRiskScore: 0,
582
+ scanDurationSeconds: elapsed,
583
+ },
584
+ };
585
+ result.summary = (0, models_1.buildSummary)(result);
586
+ result.summary.totalFilesScanned = workflows.length;
587
+ result.summary.scanDurationSeconds = elapsed;
588
+ return result;
589
+ }
590
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../lib/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class TruseraDashboard implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
6
+ //# sourceMappingURL=TruseraDashboard.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TruseraDashboard.node.d.ts","sourceRoot":"","sources":["../../../nodes/TruseraDashboard/TruseraDashboard.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAKtB,qBAAa,gBAAiB,YAAW,SAAS;IAChD,WAAW,EAAE,oBAAoB,CA+B/B;IAEI,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;CAkCxE"}