@rolealpha/n8n-nodes-rolealpha 0.8.1 → 0.9.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.
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ /**
3
+ * Code nodes a model writes. A model's code is pure data shaping: it may read its input and
4
+ * the output of nodes in the same workflow, and return items. Everything else is refused
5
+ * by an allow list on the syntax tree, not by searching for bad words: an unknown syntax
6
+ * form or an unknown global fails. Dynamic keys (`row[key]`) fail too, because they are the
7
+ * way around any list of forbidden properties; `new Map(Object.entries(row)).get(key)` does
8
+ * the same without reaching `constructor`.
9
+ *
10
+ * This is one layer, not the sandbox: n8n has to block environment access for Code nodes
11
+ * and a person has to approve the code.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.MAX_CODE_CHARS = void 0;
15
+ exports.checkCode = checkCode;
16
+ exports.runCodeTests = runCodeTests;
17
+ const acorn_1 = require("acorn");
18
+ const vm_1 = require("vm");
19
+ const seal_1 = require("./seal");
20
+ exports.MAX_CODE_CHARS = 8000;
21
+ const MAX_TESTS = 10;
22
+ const TEST_TIMEOUT_MS = 1000;
23
+ const SYNTAX = new Set([
24
+ 'Program', 'ExpressionStatement', 'BlockStatement', 'EmptyStatement', 'VariableDeclaration', 'VariableDeclarator',
25
+ 'FunctionDeclaration', 'FunctionExpression', 'ArrowFunctionExpression', 'ReturnStatement', 'IfStatement', 'ForStatement',
26
+ 'ForOfStatement', 'ForInStatement', 'WhileStatement', 'DoWhileStatement', 'BreakStatement', 'ContinueStatement',
27
+ 'SwitchStatement', 'SwitchCase', 'TryStatement', 'CatchClause', 'ThrowStatement', 'Literal', 'Identifier', 'TemplateLiteral',
28
+ 'TemplateElement', 'ArrayExpression', 'ObjectExpression', 'Property', 'SpreadElement', 'RestElement', 'ArrayPattern',
29
+ 'ObjectPattern', 'AssignmentPattern', 'MemberExpression', 'ChainExpression', 'CallExpression', 'NewExpression',
30
+ 'UnaryExpression', 'UpdateExpression', 'BinaryExpression', 'LogicalExpression', 'AssignmentExpression',
31
+ 'ConditionalExpression', 'SequenceExpression',
32
+ ]);
33
+ /** Globals the code may name, with the static members it may use where that matters. */
34
+ const GLOBALS = {
35
+ JSON: ['parse', 'stringify'],
36
+ Math: null,
37
+ Date: ['now', 'parse', 'UTC'],
38
+ Array: ['from', 'isArray', 'of'],
39
+ Object: ['keys', 'values', 'entries', 'fromEntries', 'assign'],
40
+ String: ['fromCharCode'],
41
+ Number: null,
42
+ Boolean: [],
43
+ RegExp: [],
44
+ Map: [],
45
+ Set: [],
46
+ Error: [],
47
+ parseInt: [],
48
+ parseFloat: [],
49
+ isNaN: [],
50
+ isFinite: [],
51
+ encodeURIComponent: [],
52
+ decodeURIComponent: [],
53
+ undefined: [],
54
+ NaN: [],
55
+ Infinity: [],
56
+ $input: ['all', 'first', 'last', 'item'],
57
+ $json: null,
58
+ };
59
+ const NEWABLE = new Set(['Map', 'Set', 'Date', 'RegExp', 'Error']);
60
+ /** Only these may be passed around by name, as in `.map(String)`; an alias of the others would slip past their list of statics. */
61
+ const PASSABLE = new Set(['String', 'Number', 'Boolean', 'parseInt', 'parseFloat', 'isNaN', 'isFinite', 'encodeURIComponent', 'decodeURIComponent', 'undefined', 'NaN', 'Infinity', '$input', '$json']);
62
+ const NODE_READS = new Set(['all', 'first', 'last', 'item']);
63
+ /** Property names that reach the runtime instead of data, wherever they appear. */
64
+ const DENIED = new Set([
65
+ 'constructor', '__proto__', 'prototype', '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__',
66
+ 'getPrototypeOf', 'setPrototypeOf', 'defineProperty', 'defineProperties', 'getOwnPropertyDescriptor',
67
+ 'getOwnPropertyDescriptors', 'getOwnPropertyNames', 'getOwnPropertySymbols', 'callee', 'caller', 'bind', 'call', 'apply',
68
+ 'helpers', 'getCredentials', 'env', 'mainModule', 'prepareStackTrace', 'captureStackTrace', 'stackTraceLimit', 'getFunction', 'getThis',
69
+ ]);
70
+ class Scope {
71
+ parent;
72
+ isFunction;
73
+ names = new Set();
74
+ constructor(parent, isFunction) {
75
+ this.parent = parent;
76
+ this.isFunction = isFunction;
77
+ }
78
+ add(name) {
79
+ this.names.add(name);
80
+ }
81
+ has(name) {
82
+ return this.names.has(name) || (this.parent?.has(name) ?? false);
83
+ }
84
+ }
85
+ function patternNames(pattern, out = []) {
86
+ if (!pattern)
87
+ return out;
88
+ if (pattern.type === 'Identifier')
89
+ out.push(pattern.name);
90
+ else if (pattern.type === 'ObjectPattern')
91
+ pattern.properties.forEach((p) => patternNames(p.type === 'RestElement' ? p.argument : p.value, out));
92
+ else if (pattern.type === 'ArrayPattern')
93
+ pattern.elements.forEach((e) => patternNames(e, out));
94
+ else if (pattern.type === 'AssignmentPattern')
95
+ patternNames(pattern.left, out);
96
+ else if (pattern.type === 'RestElement')
97
+ patternNames(pattern.argument, out);
98
+ return out;
99
+ }
100
+ const isNode = (v) => !!v && typeof v === 'object' && typeof v.type === 'string';
101
+ function childrenOf(node) {
102
+ const out = [];
103
+ for (const [key, value] of Object.entries(node)) {
104
+ if (key === 'type' || key === 'start' || key === 'end')
105
+ continue;
106
+ if (Array.isArray(value))
107
+ value.forEach((v) => isNode(v) && out.push(v));
108
+ else if (isNode(value))
109
+ out.push(value);
110
+ }
111
+ return out;
112
+ }
113
+ /** `var` belongs to the enclosing function, wherever it is written. */
114
+ function hoistVars(node, scope) {
115
+ for (const child of childrenOf(node)) {
116
+ if (/Function/.test(child.type))
117
+ continue;
118
+ if (child.type === 'VariableDeclaration' && child.kind === 'var')
119
+ child.declarations.forEach((d) => patternNames(d.id).forEach((n) => scope.add(n)));
120
+ hoistVars(child, scope);
121
+ }
122
+ }
123
+ /** let, const and functions belong to the block they are written in. */
124
+ function declareBlock(statements, scope) {
125
+ for (const s of statements) {
126
+ if (s.type === 'FunctionDeclaration' && s.id)
127
+ scope.add(s.id.name);
128
+ if (s.type === 'VariableDeclaration' && s.kind !== 'var')
129
+ s.declarations.forEach((d) => patternNames(d.id).forEach((n) => scope.add(n)));
130
+ }
131
+ }
132
+ function checkCode(code, opts = {}) {
133
+ const problems = [];
134
+ const refuse = (message) => void (problems.includes(message) || problems.push(message));
135
+ if (typeof code !== 'string' || code.trim() === '')
136
+ return ['has no code'];
137
+ if (code.length > exports.MAX_CODE_CHARS)
138
+ return [`has ${code.length} characters of code; at most ${exports.MAX_CODE_CHARS} are allowed`];
139
+ let ast;
140
+ try {
141
+ ast = (0, acorn_1.parse)(code, { ecmaVersion: 2023, sourceType: 'script', allowReturnOutsideFunction: true });
142
+ }
143
+ catch (error) {
144
+ return [`does not parse: ${error.message}`];
145
+ }
146
+ const nodeNames = new Set(opts.nodeNames ?? []);
147
+ const denied = (name, where) => {
148
+ if (typeof name === 'string' && DENIED.has(name))
149
+ refuse(`uses ${where} "${name}", which is not allowed`);
150
+ };
151
+ const walkPattern = (p, scope) => {
152
+ if (!p)
153
+ return;
154
+ if (p.type === 'ObjectPattern') {
155
+ for (const prop of p.properties) {
156
+ if (prop.type === 'RestElement') {
157
+ walkPattern(prop.argument, scope);
158
+ continue;
159
+ }
160
+ if (prop.computed)
161
+ refuse('uses a dynamic key in a destructuring, which is not allowed');
162
+ denied(prop.key.name ?? prop.key.value, 'the property');
163
+ walkPattern(prop.value, scope);
164
+ }
165
+ }
166
+ else if (p.type === 'ArrayPattern')
167
+ p.elements.forEach((e) => walkPattern(e, scope));
168
+ else if (p.type === 'AssignmentPattern') {
169
+ walkPattern(p.left, scope);
170
+ walk(p.right, scope);
171
+ }
172
+ else if (p.type === 'RestElement')
173
+ walkPattern(p.argument, scope);
174
+ else {
175
+ // An identifier or a member on the left of an assignment: only what the code owns, or its input.
176
+ let root = p;
177
+ while (root.type === 'MemberExpression')
178
+ root = root.object;
179
+ if (root.type === 'Identifier' && !scope.has(root.name) && root.name !== '$json')
180
+ refuse(`assigns to the global "${root.name}", which is not allowed`);
181
+ walk(p, scope);
182
+ }
183
+ };
184
+ const walkFunction = (fn, scope) => {
185
+ if (fn.async || fn.generator)
186
+ refuse('uses an async or generator function, which is not allowed');
187
+ const inner = new Scope(scope, true);
188
+ if (fn.type === 'FunctionExpression' && fn.id)
189
+ inner.add(fn.id.name);
190
+ fn.params.forEach((p) => patternNames(p).forEach((n) => inner.add(n)));
191
+ fn.params.forEach((p) => walkPattern(p, inner));
192
+ hoistVars(fn.body, inner);
193
+ if (fn.body.type === 'BlockStatement') {
194
+ declareBlock(fn.body.body, inner);
195
+ fn.body.body.forEach((s) => walk(s, inner));
196
+ }
197
+ else
198
+ walk(fn.body, inner);
199
+ };
200
+ const known = (name) => {
201
+ if (!Object.prototype.hasOwnProperty.call(GLOBALS, name))
202
+ refuse(`uses "${name}", which is not allowed`);
203
+ };
204
+ const isNodeRead = (n) => n.type === 'CallExpression' && n.callee.type === 'Identifier' && n.callee.name === '$';
205
+ const walkMember = (m, scope) => {
206
+ if (m.computed) {
207
+ const key = m.property;
208
+ const literal = key.type === 'Literal' && (typeof key.value === 'number' || typeof key.value === 'string');
209
+ if (!literal)
210
+ refuse('uses a dynamic key (obj[key]), which is not allowed; use for...of, Object.entries or a Map');
211
+ else
212
+ denied(key.value, 'the property');
213
+ }
214
+ else {
215
+ denied(m.property.name, 'the property');
216
+ }
217
+ const name = m.computed ? m.property.value : m.property.name;
218
+ if (isNodeRead(m.object) && !NODE_READS.has(String(name)))
219
+ refuse(`reads "${name}" of another node; only all, first, last and item are allowed`);
220
+ if (m.object.type === 'Identifier' && !scope.has(m.object.name)) {
221
+ // Instances are checked by DENIED; only the statics of a global are listed.
222
+ const allowed = GLOBALS[m.object.name];
223
+ if (Array.isArray(allowed) && !allowed.includes(String(name)))
224
+ refuse(`uses ${m.object.name}.${String(name)}, which is not allowed`);
225
+ }
226
+ if (m.object.type !== 'Identifier' || scope.has(m.object.name))
227
+ walk(m.object, scope);
228
+ else
229
+ known(m.object.name);
230
+ };
231
+ function walk(node, scope) {
232
+ if (!node)
233
+ return;
234
+ if (!SYNTAX.has(node.type))
235
+ return refuse(`uses ${node.type}, which is not allowed`);
236
+ switch (node.type) {
237
+ case 'Identifier':
238
+ if (node.name === '$')
239
+ return refuse('uses $ other than as $(\'Node name\')');
240
+ if (scope.has(node.name))
241
+ return;
242
+ known(node.name);
243
+ if (Object.prototype.hasOwnProperty.call(GLOBALS, node.name) && !PASSABLE.has(node.name))
244
+ refuse(`passes "${node.name}" around, which is not allowed; use it directly`);
245
+ return;
246
+ case 'Program':
247
+ case 'BlockStatement': {
248
+ const inner = new Scope(scope, false);
249
+ declareBlock(node.body, inner);
250
+ node.body.forEach((s) => walk(s, inner));
251
+ return;
252
+ }
253
+ case 'FunctionDeclaration':
254
+ case 'FunctionExpression':
255
+ case 'ArrowFunctionExpression':
256
+ return walkFunction(node, scope);
257
+ case 'VariableDeclarator':
258
+ walkPattern(node.id, scope);
259
+ return walk(node.init, scope);
260
+ case 'AssignmentExpression':
261
+ walkPattern(node.left, scope);
262
+ return walk(node.right, scope);
263
+ case 'ForStatement':
264
+ case 'ForOfStatement':
265
+ case 'ForInStatement': {
266
+ if (node.await)
267
+ refuse('uses for await, which is not allowed');
268
+ const inner = new Scope(scope, false);
269
+ const head = node.init ?? node.left;
270
+ if (head?.type === 'VariableDeclaration' && head.kind !== 'var')
271
+ declareBlock([head], inner);
272
+ childrenOf(node).forEach((c) => walk(c, inner));
273
+ return;
274
+ }
275
+ case 'SwitchStatement': {
276
+ walk(node.discriminant, scope);
277
+ const inner = new Scope(scope, false);
278
+ node.cases.forEach((c) => declareBlock(c.consequent, inner));
279
+ node.cases.forEach((c) => {
280
+ walk(c.test, inner);
281
+ c.consequent.forEach((s) => walk(s, inner));
282
+ });
283
+ return;
284
+ }
285
+ case 'CatchClause': {
286
+ const inner = new Scope(scope, false);
287
+ patternNames(node.param).forEach((n) => inner.add(n));
288
+ walkPattern(node.param, inner);
289
+ return walk(node.body, inner);
290
+ }
291
+ case 'MemberExpression':
292
+ return walkMember(node, scope);
293
+ case 'Property':
294
+ if (node.kind !== 'init')
295
+ refuse('uses a getter or setter, which is not allowed');
296
+ if (node.computed)
297
+ walk(node.key, scope);
298
+ else
299
+ denied(node.key.name ?? node.key.value, 'the property');
300
+ return walk(node.value, scope);
301
+ case 'CallExpression':
302
+ if (isNodeRead(node)) {
303
+ const arg = node.arguments[0];
304
+ if (node.arguments.length !== 1 || arg?.type !== 'Literal' || typeof arg.value !== 'string')
305
+ return refuse('uses $() with anything but the literal name of a node');
306
+ if (!nodeNames.has(arg.value))
307
+ refuse(`reads node "${arg.value}", which is not in this workflow`);
308
+ return;
309
+ }
310
+ if (node.callee.type === 'Identifier' && !scope.has(node.callee.name)) {
311
+ if (node.callee.name === '$')
312
+ return refuse('uses $ other than as $(\'Node name\')');
313
+ known(node.callee.name);
314
+ }
315
+ else
316
+ walk(node.callee, scope);
317
+ node.arguments.forEach((a) => walk(a, scope));
318
+ return;
319
+ case 'NewExpression':
320
+ if (node.callee.type !== 'Identifier' || !NEWABLE.has(node.callee.name) || scope.has(node.callee.name))
321
+ return refuse('uses new with anything but Map, Set, Date, RegExp or Error');
322
+ node.arguments.forEach((a) => walk(a, scope));
323
+ return;
324
+ case 'BreakStatement':
325
+ case 'ContinueStatement':
326
+ if (node.label)
327
+ refuse('uses a label, which is not allowed');
328
+ return;
329
+ default:
330
+ childrenOf(node).forEach((c) => walk(c, scope));
331
+ }
332
+ }
333
+ const root = new Scope(null, true);
334
+ hoistVars(ast, root);
335
+ walk(ast, root);
336
+ return problems;
337
+ }
338
+ /** Items as n8n takes them from a Code node: `{ json }` or the plain object. */
339
+ function jsonOf(item) {
340
+ return item && typeof item === 'object' && 'json' in item ? item.json : item;
341
+ }
342
+ const SETUP = `
343
+ const __data = JSON.parse(__payload);
344
+ const __wrap = (rows) => (rows || []).map((json) => ({ json }));
345
+ const __reader = (items) => ({ all: () => items, first: () => items[0], last: () => items[items.length - 1], get item() { return items[0]; } });
346
+ const __nodes = Object.fromEntries(Object.entries(__data.nodes || {}).map(([k, v]) => [k, __reader(__wrap(v))]));
347
+ const $ = (name) => __nodes[name] || __reader([]);
348
+ `;
349
+ /** Runs code that passed checkCode against the model's own test cases. */
350
+ function runCodeTests(code, mode, tests) {
351
+ if (!Array.isArray(tests) || tests.length === 0)
352
+ return ['has no test; add at least one under codeTests'];
353
+ if (tests.length > MAX_TESTS)
354
+ return [`has ${tests.length} tests; at most ${MAX_TESTS} are allowed`];
355
+ const problems = [];
356
+ tests.forEach((raw, index) => {
357
+ const test = (raw && typeof raw === 'object' ? raw : {});
358
+ const label = `test "${test.name ?? index + 1}"`;
359
+ if (!Array.isArray(test.expected))
360
+ return void problems.push(`${label} has no expected output`);
361
+ const body = mode === 'runOnceForEachItem'
362
+ ? `__wrap(__data.input).flatMap((__item) => { const $json = __item.json; const $input = { item: __item }; const __out = (function () {\n${code}\n})(); return __out === undefined || __out === null ? [] : [__out]; })`
363
+ : `(() => { const __items = __wrap(__data.input); const $input = __reader(__items); const $json = __items[0] ? __items[0].json : undefined; return (function () {\n${code}\n})(); })()`;
364
+ try {
365
+ const payload = JSON.stringify({ input: test.input ?? [], nodes: test.nodes ?? {} });
366
+ const text = (0, vm_1.runInNewContext)(`${SETUP}\nJSON.stringify(${body})`, { __payload: payload }, { timeout: TEST_TIMEOUT_MS });
367
+ const result = text === undefined ? undefined : JSON.parse(text);
368
+ if (!Array.isArray(result))
369
+ return void problems.push(`${label} returned no array of items`);
370
+ const got = (0, seal_1.canonicalJson)(result.map(jsonOf));
371
+ const want = (0, seal_1.canonicalJson)(test.expected.map(jsonOf));
372
+ if (got !== want)
373
+ problems.push(`${label} expected ${want.slice(0, 300)} but got ${got.slice(0, 300)}`);
374
+ }
375
+ catch (error) {
376
+ problems.push(`${label} failed: ${error.message}`);
377
+ }
378
+ });
379
+ return problems;
380
+ }
381
+ //# sourceMappingURL=codeCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeCheck.js","sourceRoot":"","sources":["../../lib/codeCheck.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Workflows the builder writes itself. Most steps that need a workflow need the same one:
3
+ * a trigger, then the agents responsible for the step, then the runner. The model only picks
4
+ * the template and its few values, so these drafts look the same every time.
5
+ * Agents and step are read at run time; only the custom ID and the runner stay fixed.
6
+ */
7
+ export declare const TEMPLATES: readonly ["schedule", "event"];
8
+ export type TemplateName = (typeof TEMPLATES)[number];
9
+ export interface RunnerInfo {
10
+ id: string;
11
+ name: string;
12
+ /** Inputs the runner declares; null when it takes whatever it gets. */
13
+ inputs: string[] | null;
14
+ }
15
+ export interface TemplateContext {
16
+ stepName: string;
17
+ customId: string | null;
18
+ runner?: RunnerInfo | null;
19
+ endpointUrl?: string;
20
+ organisation?: string;
21
+ /** The roleALPHA credential of the builder itself. */
22
+ mcpCredential?: {
23
+ id: string;
24
+ name: string;
25
+ };
26
+ /** A header credential known from other workflows, for the webhook. */
27
+ webhookCredential?: {
28
+ id: string;
29
+ name: string;
30
+ };
31
+ }
32
+ export interface TemplateResult {
33
+ workflow: {
34
+ name: string;
35
+ nodes: unknown[];
36
+ connections: unknown;
37
+ } | null;
38
+ problems: string[];
39
+ notes: string[];
40
+ }
41
+ export declare function expandTemplate(name: unknown, values: unknown, t: TemplateContext): TemplateResult;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /**
3
+ * Workflows the builder writes itself. Most steps that need a workflow need the same one:
4
+ * a trigger, then the agents responsible for the step, then the runner. The model only picks
5
+ * the template and its few values, so these drafts look the same every time.
6
+ * Agents and step are read at run time; only the custom ID and the runner stay fixed.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TEMPLATES = void 0;
10
+ exports.expandTemplate = expandTemplate;
11
+ const CRON = /^(\S+\s+){4}\S+$/;
12
+ const FIELD = /^[\d*,/\-A-Za-z]+$/;
13
+ exports.TEMPLATES = ['schedule', 'event'];
14
+ const DEFAULT_INPUTS = ['agentUuid', 'stepUuid', 'stepCustomId', 'triggerType', 'event', 'organisation'];
15
+ function expandTemplate(name, values, t) {
16
+ const problems = [];
17
+ const notes = [];
18
+ const v = (values && typeof values === 'object' ? values : {});
19
+ if (!exports.TEMPLATES.includes(name))
20
+ problems.push(`Unknown template "${String(name)}"; use ${exports.TEMPLATES.join(' or ')}`);
21
+ if (!t.customId)
22
+ problems.push('A template needs a step with a custom ID; give the step one in roleALPHA');
23
+ if (!t.runner)
24
+ problems.push('A template needs the runner; set Runner Workflow on Propose to an existing workflow');
25
+ const inputs = t.runner?.inputs ?? DEFAULT_INPUTS;
26
+ if (t.runner && !inputs.includes('agentUuid'))
27
+ problems.push(`Runner "${t.runner.name}" takes no agentUuid`);
28
+ const cron = String(v.cron ?? '').trim();
29
+ if (name === 'schedule' && !(CRON.test(cron) && cron.split(/\s+/).every((f) => FIELD.test(f))))
30
+ problems.push('The schedule template needs a cron expression with five fields');
31
+ if (problems.length > 0)
32
+ return { workflow: null, problems, notes };
33
+ const kind = name;
34
+ const customId = t.customId;
35
+ const slug = customId.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
36
+ const triggerName = kind === 'schedule' ? 'Schedule' : 'Event';
37
+ const trigger = kind === 'schedule'
38
+ ? { name: triggerName, type: 'n8n-nodes-base.scheduleTrigger', typeVersion: 1.2, position: [0, 0], parameters: { rule: { interval: [{ field: 'cronExpression', expression: cron }] } } }
39
+ : {
40
+ name: triggerName,
41
+ type: 'n8n-nodes-base.webhook',
42
+ typeVersion: 2,
43
+ position: [0, 0],
44
+ parameters: { httpMethod: 'POST', path: `rolealpha-${slug}`, authentication: 'headerAuth', responseMode: 'onReceived', options: {} },
45
+ ...(t.webhookCredential ? { credentials: { httpHeaderAuth: t.webhookCredential } } : {}),
46
+ };
47
+ if (kind === 'event') {
48
+ if (!t.webhookCredential)
49
+ notes.push(`Webhook "${triggerName}": set a Header Auth credential before activating; without it the webhook answers nothing`);
50
+ notes.push(`The sending system has to call POST /webhook/rolealpha-${slug} with that header; set this up there`);
51
+ }
52
+ if (!t.mcpCredential)
53
+ notes.push('Node "Get step": set the roleALPHA credential before activating');
54
+ const given = {
55
+ agentUuid: '={{ $json.uuid }}',
56
+ stepUuid: "={{ $('Get step').first().json.step.uuid }}",
57
+ stepCustomId: customId,
58
+ step: customId,
59
+ triggerType: kind,
60
+ trigger: kind,
61
+ event: kind === 'schedule' ? '={{ { reason: "schedule" } }}' : `={{ $('${triggerName}').first().json.body }}`,
62
+ organisation: t.organisation ?? '',
63
+ };
64
+ const value = Object.fromEntries(inputs.map((input) => [input, given[input] ?? '']));
65
+ const schema = inputs.map((input) => ({ id: input, displayName: input, required: false, defaultMatch: false, display: true, type: input === 'event' ? 'any' : 'string', canBeUsedToMatch: true }));
66
+ const nodes = [
67
+ trigger,
68
+ {
69
+ name: 'Get step',
70
+ type: '@rolealpha/n8n-nodes-rolealpha.roleAlpha',
71
+ typeVersion: 1,
72
+ position: [240, 0],
73
+ parameters: { resource: 'responsibility', operation: 'getStep', endpointUrl: t.endpointUrl ?? '', organisation: t.organisation ?? '', step: customId, responsibilityOptions: { resolveHolders: true } },
74
+ ...(t.mcpCredential ? { credentials: { mcpOAuth2Api: t.mcpCredential } } : {}),
75
+ },
76
+ { name: 'Responsible roles', type: 'n8n-nodes-base.splitOut', typeVersion: 1, position: [480, 0], parameters: { fieldToSplitOut: 'step.responsibleRoles', options: {} } },
77
+ { name: 'Agents', type: 'n8n-nodes-base.splitOut', typeVersion: 1, position: [720, 0], parameters: { fieldToSplitOut: 'holders.agents', options: {} } },
78
+ {
79
+ name: 'Run agent',
80
+ type: 'n8n-nodes-base.executeWorkflow',
81
+ typeVersion: 1.3,
82
+ position: [960, 0],
83
+ parameters: {
84
+ mode: 'each',
85
+ source: 'database',
86
+ workflowId: { __rl: true, mode: 'id', value: t.runner.id, cachedResultName: t.runner.name },
87
+ workflowInputs: { mappingMode: 'defineBelow', value, matchingColumns: [], schema, attemptToConvertTypes: false, convertFieldsToString: true },
88
+ options: { waitForSubWorkflow: false },
89
+ },
90
+ },
91
+ ];
92
+ const to = (node) => ({ main: [[{ node, type: 'main', index: 0 }]] });
93
+ const connections = { [triggerName]: to('Get step'), 'Get step': to('Responsible roles'), 'Responsible roles': to('Agents'), Agents: to('Run agent') };
94
+ return { workflow: { name: `roleALPHA: ${t.stepName || customId} (${customId})`, nodes, connections }, problems, notes };
95
+ }
96
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../lib/templates.ts"],"names":[],"mappings":"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"}