@loopthink/n8n-nodes-loopthink 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.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +259 -0
  3. package/dist/credentials/LoopthinkRunnerApi.credentials.d.ts +8 -0
  4. package/dist/credentials/LoopthinkRunnerApi.credentials.js +53 -0
  5. package/dist/credentials/LoopthinkRunnerApi.credentials.js.map +1 -0
  6. package/dist/credentials/LoopthinkTargetApi.credentials.d.ts +7 -0
  7. package/dist/credentials/LoopthinkTargetApi.credentials.js +46 -0
  8. package/dist/credentials/LoopthinkTargetApi.credentials.js.map +1 -0
  9. package/dist/nodes/Loopthink/Loopthink.node.d.ts +5 -0
  10. package/dist/nodes/Loopthink/Loopthink.node.js +87 -0
  11. package/dist/nodes/Loopthink/Loopthink.node.js.map +1 -0
  12. package/dist/nodes/Loopthink/execute.operation.d.ts +3 -0
  13. package/dist/nodes/Loopthink/execute.operation.js +89 -0
  14. package/dist/nodes/Loopthink/execute.operation.js.map +1 -0
  15. package/dist/nodes/Loopthink/loopthink-mark.svg +1 -0
  16. package/dist/nodes/Loopthink/prepare.operation.d.ts +3 -0
  17. package/dist/nodes/Loopthink/prepare.operation.js +144 -0
  18. package/dist/nodes/Loopthink/prepare.operation.js.map +1 -0
  19. package/dist/nodes/Loopthink/query.d.ts +29 -0
  20. package/dist/nodes/Loopthink/query.js +63 -0
  21. package/dist/nodes/Loopthink/query.js.map +1 -0
  22. package/dist/nodes/Loopthink/result.operation.d.ts +3 -0
  23. package/dist/nodes/Loopthink/result.operation.js +137 -0
  24. package/dist/nodes/Loopthink/result.operation.js.map +1 -0
  25. package/dist/nodes/LoopthinkRunner/LoopthinkRunner.node.d.ts +5 -0
  26. package/dist/nodes/LoopthinkRunner/LoopthinkRunner.node.js +143 -0
  27. package/dist/nodes/LoopthinkRunner/LoopthinkRunner.node.js.map +1 -0
  28. package/dist/nodes/LoopthinkRunner/loopthink-mark.svg +1 -0
  29. package/dist/nodes/LoopthinkRunner/masking.d.ts +10 -0
  30. package/dist/nodes/LoopthinkRunner/masking.js +95 -0
  31. package/dist/nodes/LoopthinkRunner/masking.js.map +1 -0
  32. package/dist/nodes/LoopthinkRunner/secrets.d.ts +7 -0
  33. package/dist/nodes/LoopthinkRunner/secrets.js +63 -0
  34. package/dist/nodes/LoopthinkRunner/secrets.js.map +1 -0
  35. package/dist/nodes/LoopthinkRunner/socket.d.ts +13 -0
  36. package/dist/nodes/LoopthinkRunner/socket.js +94 -0
  37. package/dist/nodes/LoopthinkRunner/socket.js.map +1 -0
  38. package/dist/nodes/LoopthinkRunner/workflowTools.d.ts +26 -0
  39. package/dist/nodes/LoopthinkRunner/workflowTools.js +27 -0
  40. package/dist/nodes/LoopthinkRunner/workflowTools.js.map +1 -0
  41. package/package.json +76 -0
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareFields = void 0;
4
+ exports.executePrepare = executePrepare;
5
+ const query_1 = require("./query");
6
+ exports.prepareFields = [
7
+ {
8
+ displayName: 'Parameters',
9
+ name: 'params',
10
+ type: 'json',
11
+ default: '={{ $json.params }}',
12
+ description: 'What the model sent. Leave this as it is unless the branch reshapes the item first.',
13
+ },
14
+ {
15
+ displayName: 'Rows per Answer',
16
+ name: 'defaultLimit',
17
+ type: 'number',
18
+ typeOptions: { minValue: 1, maxValue: 500 },
19
+ default: 20,
20
+ description: 'The most rows a single answer carries. Used when the call sends no limit, and a larger limit is capped to it.',
21
+ },
22
+ {
23
+ displayName: 'Order',
24
+ name: 'order',
25
+ type: 'options',
26
+ default: 'DESC',
27
+ options: [
28
+ { name: 'Newest First', value: 'DESC' },
29
+ { name: 'Oldest First', value: 'ASC' },
30
+ ],
31
+ description: 'Used unless the call sends a sort parameter of "oldest" or "newest". Ascending by id is also what lets a model read a long list in order.',
32
+ },
33
+ {
34
+ displayName: 'Optional Ranges',
35
+ name: 'ranges',
36
+ placeholder: 'Add range',
37
+ type: 'fixedCollection',
38
+ typeOptions: { multipleValues: true },
39
+ default: {},
40
+ description: 'One entry per column the tool can narrow down. Each yields a min and a max, filled from the call or opened all the way up. A range on id is what lets a model continue past the last row it saw.',
41
+ options: [
42
+ {
43
+ name: 'range',
44
+ displayName: 'Range',
45
+ values: [
46
+ {
47
+ displayName: 'Column',
48
+ name: 'column',
49
+ type: 'string',
50
+ default: '',
51
+ placeholder: 'createdAt',
52
+ description: 'Also the stem of the two keys it appears under, as q.createdAt_min and q.createdAt_max',
53
+ },
54
+ {
55
+ displayName: 'Type',
56
+ name: 'type',
57
+ type: 'options',
58
+ default: 'date',
59
+ options: [
60
+ { name: 'Date', value: 'date' },
61
+ { name: 'Number', value: 'number' },
62
+ ],
63
+ },
64
+ {
65
+ displayName: 'Parameter Prefix',
66
+ name: 'parameter',
67
+ type: 'string',
68
+ default: '',
69
+ placeholder: 'created',
70
+ description: 'Only when the parameters are not named after the column. Empty means the column name is the prefix, so a column "check_in" reads check_in_after and check_in_before.',
71
+ },
72
+ ],
73
+ },
74
+ ],
75
+ },
76
+ {
77
+ displayName: 'Optional Exact Matches',
78
+ name: 'matches',
79
+ placeholder: 'Add match',
80
+ type: 'fixedCollection',
81
+ typeOptions: { multipleValues: true },
82
+ default: {},
83
+ description: 'One entry per column the tool can pin to a value. Compare the row with "contains": an equals row has no value that means "no filter", a wildcard does.',
84
+ options: [
85
+ {
86
+ name: 'match',
87
+ displayName: 'Match',
88
+ values: [
89
+ {
90
+ displayName: 'Column',
91
+ name: 'column',
92
+ type: 'string',
93
+ default: '',
94
+ placeholder: 'status',
95
+ description: 'Also the key it appears under, as q.status',
96
+ },
97
+ {
98
+ displayName: 'Parameter',
99
+ name: 'parameter',
100
+ type: 'string',
101
+ default: '',
102
+ description: 'Only when the parameter is not named after the column',
103
+ },
104
+ ],
105
+ },
106
+ ],
107
+ },
108
+ {
109
+ displayName: 'Each key holds one value, so a condition row is <b>column</b>, a comparison you pick once, and <code>{{ $json.q.&lt;key&gt; }}</code> in <b>Value</b>. A range yields two keys, <code>q.&lt;column&gt;_min</code> and <code>q.&lt;column&gt;_max</code>; a match yields one, <code>q.&lt;column&gt;</code>, compared with <b>contains</b>. Set <b>Limit</b> to <code>q.fetch</code> and <b>Order</b> to <code>q.order</code>. Every key holds a value on every call, so no row has to be removed for a parameter the model left out, and <code>q.unused</code> names any the tool offers that no row reads.',
110
+ name: 'prepareNotice',
111
+ type: 'notice',
112
+ default: '',
113
+ },
114
+ ];
115
+ function parseParams(value) {
116
+ if (typeof value === 'string') {
117
+ try {
118
+ return JSON.parse(value);
119
+ }
120
+ catch {
121
+ return {};
122
+ }
123
+ }
124
+ return (value ?? {});
125
+ }
126
+ async function executePrepare() {
127
+ const out = [];
128
+ for (let i = 0; i < this.getInputData().length; i += 1) {
129
+ const params = parseParams(this.getNodeParameter('params', i));
130
+ const ranges = (this.getNodeParameter('ranges', i, {}).range ??
131
+ []);
132
+ const matches = (this.getNodeParameter('matches', i, {}).match ??
133
+ []);
134
+ const q = (0, query_1.prepareQuery)(params, {
135
+ defaultLimit: this.getNodeParameter('defaultLimit', i),
136
+ order: this.getNodeParameter('order', i),
137
+ ranges,
138
+ matches,
139
+ });
140
+ out.push({ json: { ...this.getInputData()[i].json, q } });
141
+ }
142
+ return [out];
143
+ }
144
+ //# sourceMappingURL=prepare.operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.operation.js","sourceRoot":"","sources":["../../../nodes/Loopthink/prepare.operation.ts"],"names":[],"mappings":";;;AA+JA,wCAuBC;AA/KD,mCAAuE;AAiB1D,QAAA,aAAa,GAAsB;IAC/C;QACC,WAAW,EAAE,YAAY;QACzB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EACV,qFAAqF;KACtF;IACD;QACC,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;QAC3C,OAAO,EAAE,EAAE;QACX,WAAW,EACV,+GAA+G;KAChH;IACD;QACC,WAAW,EAAE,OAAO;QACpB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,MAAM;QACf,OAAO,EAAE;YACR,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;YACvC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;SACtC;QAID,WAAW,EACV,2IAA2I;KAC5I;IACD;QACC,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;QACrC,OAAO,EAAE,EAAE;QAIX,WAAW,EACV,kMAAkM;QACnM,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE;oBACP;wBACC,WAAW,EAAE,QAAQ;wBACrB,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;wBACX,WAAW,EAAE,WAAW;wBACxB,WAAW,EACZ,wFAAwF;qBACvF;oBACD;wBACC,WAAW,EAAE,MAAM;wBACnB,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,MAAM;wBACf,OAAO,EAAE;4BACR,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;4BAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;yBACnC;qBACD;oBACD;wBACC,WAAW,EAAE,kBAAkB;wBAC/B,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;wBACX,WAAW,EAAE,SAAS;wBACtB,WAAW,EACV,sKAAsK;qBACvK;iBACD;aACD;SACD;KACD;IACD;QACC,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;QACrC,OAAO,EAAE,EAAE;QACX,WAAW,EACV,wJAAwJ;QACzJ,OAAO,EAAE;YACR;gBACC,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE;oBACP;wBACC,WAAW,EAAE,QAAQ;wBACrB,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;wBACX,WAAW,EAAE,QAAQ;wBACrB,WAAW,EAAE,4CAA4C;qBACzD;oBACD;wBACC,WAAW,EAAE,WAAW;wBACxB,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;wBACX,WAAW,EAAE,uDAAuD;qBACpE;iBACD;aACD;SACD;KACD;IACD;QACC,WAAW,EACV,6kBAA6kB;QAC9kB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;KACX;CACD,CAAC;AAEF,SAAS,WAAW,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IACD,OAAO,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;AACjD,CAAC;AAEM,KAAK,UAAU,cAAc;IACnC,MAAM,GAAG,GAAyB,EAAE,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,CAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAiB,CAAC,KAAK;YAC5E,EAAE,CAA2B,CAAC;QAC/B,MAAM,OAAO,GAAG,CAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAiB,CAAC,KAAK;YAC9E,EAAE,CAA2B,CAAC;QAE/B,MAAM,CAAC,GAAG,IAAA,oBAAY,EAAC,MAAM,EAAE;YAC9B,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAW;YAChE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAmB;YAC1D,MAAM;YACN,OAAO;SACP,CAAC,CAAC;QAIH,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,29 @@
1
+ export declare const DATE_MIN = "0001-01-01T00:00:00.000Z";
2
+ export declare const DATE_MAX = "9999-12-31T23:59:59.999Z";
3
+ export declare const NUMBER_MIN = -9007199254740991;
4
+ export declare const NUMBER_MAX = 9007199254740991;
5
+ export type RangeType = 'date' | 'number';
6
+ export interface RangeSpec {
7
+ column: string;
8
+ parameter?: string;
9
+ type: RangeType;
10
+ }
11
+ export interface MatchSpec {
12
+ column: string;
13
+ parameter?: string;
14
+ }
15
+ export interface PreparedQuery {
16
+ limit: number;
17
+ fetch: number;
18
+ order: 'ASC' | 'DESC';
19
+ unused: string[];
20
+ [key: string]: number | string | string[];
21
+ }
22
+ export declare function sortDirection(value: unknown, configured: 'ASC' | 'DESC'): 'ASC' | 'DESC';
23
+ export declare function likeValue(value: unknown): string;
24
+ export declare function prepareQuery(params: Record<string, unknown>, options: {
25
+ defaultLimit: number;
26
+ order: 'ASC' | 'DESC';
27
+ ranges?: RangeSpec[];
28
+ matches?: MatchSpec[];
29
+ }): PreparedQuery;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NUMBER_MAX = exports.NUMBER_MIN = exports.DATE_MAX = exports.DATE_MIN = void 0;
4
+ exports.sortDirection = sortDirection;
5
+ exports.likeValue = likeValue;
6
+ exports.prepareQuery = prepareQuery;
7
+ exports.DATE_MIN = '0001-01-01T00:00:00.000Z';
8
+ exports.DATE_MAX = '9999-12-31T23:59:59.999Z';
9
+ exports.NUMBER_MIN = -9007199254740991;
10
+ exports.NUMBER_MAX = 9007199254740991;
11
+ const RESERVED = ['limit', 'sort'];
12
+ const RANGE_SUFFIXES = { min: ['_after', '_from', '_min'], max: ['_before', '_to', '_max'] };
13
+ function firstDefined(params, names) {
14
+ for (const name of names) {
15
+ const value = params[name];
16
+ if (value !== undefined && value !== null && value !== '')
17
+ return value;
18
+ }
19
+ return undefined;
20
+ }
21
+ function sortDirection(value, configured) {
22
+ const asked = String(value ?? '').toLowerCase();
23
+ if (['oldest', 'asc', 'ascending'].includes(asked))
24
+ return 'ASC';
25
+ if (['newest', 'desc', 'descending'].includes(asked))
26
+ return 'DESC';
27
+ return configured;
28
+ }
29
+ function likeValue(value) {
30
+ if (value === undefined || value === null || value === '')
31
+ return '%';
32
+ return String(value).replace(/([%_\\])/g, '\\$1');
33
+ }
34
+ function prepareQuery(params, options) {
35
+ const asked = Number(params.limit);
36
+ const limit = Number.isFinite(asked) && asked > 0
37
+ ? Math.min(asked, options.defaultLimit)
38
+ : options.defaultLimit;
39
+ const consumed = new Set(RESERVED);
40
+ const query = {
41
+ limit,
42
+ fetch: limit + 1,
43
+ order: sortDirection(params.sort, options.order),
44
+ unused: [],
45
+ };
46
+ for (const range of options.ranges ?? []) {
47
+ const prefix = range.parameter || range.column;
48
+ [...RANGE_SUFFIXES.min, ...RANGE_SUFFIXES.max].forEach((s) => consumed.add(prefix + s));
49
+ const min = firstDefined(params, RANGE_SUFFIXES.min.map((s) => prefix + s));
50
+ const max = firstDefined(params, RANGE_SUFFIXES.max.map((s) => prefix + s));
51
+ const wide = range.type === 'date' ? [exports.DATE_MIN, exports.DATE_MAX] : [exports.NUMBER_MIN, exports.NUMBER_MAX];
52
+ query[`${range.column}_min`] = (min ?? wide[0]);
53
+ query[`${range.column}_max`] = (max ?? wide[1]);
54
+ }
55
+ for (const match of options.matches ?? []) {
56
+ const name = match.parameter || match.column;
57
+ consumed.add(name);
58
+ query[match.column] = likeValue(params[name]);
59
+ }
60
+ query.unused = Object.keys(params).filter((name) => !consumed.has(name));
61
+ return query;
62
+ }
63
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../nodes/Loopthink/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeProperties } from 'n8n-workflow';
2
+ export declare const resultFields: INodeProperties[];
3
+ export declare function executeResult(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resultFields = void 0;
4
+ exports.executeResult = executeResult;
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ const masking_1 = require("../LoopthinkRunner/masking");
7
+ function pagePayload(ctx, respondWith, items) {
8
+ if (respondWith === 'object')
9
+ return (items[0]?.json ?? {});
10
+ const rows = items.map((item) => item.json);
11
+ if (respondWith === 'list')
12
+ return rows;
13
+ const limit = Number(ctx.getNodeParameter('pageSize', 0));
14
+ const capped = Number.isFinite(limit) && limit > 0;
15
+ return { items: capped ? rows.slice(0, limit) : rows, truncated: capped && rows.length > limit };
16
+ }
17
+ function parseRequest(value) {
18
+ if (typeof value === 'string') {
19
+ try {
20
+ return JSON.parse(value);
21
+ }
22
+ catch {
23
+ return {};
24
+ }
25
+ }
26
+ return (value ?? {});
27
+ }
28
+ exports.resultFields = [
29
+ {
30
+ displayName: 'Request',
31
+ name: 'request',
32
+ type: 'json',
33
+ default: "={{ $('loopthink Runner').first().json }}",
34
+ description: 'The queued request this answers. Leave this as it is unless you renamed the Runner node, in which case put its name in the expression.',
35
+ },
36
+ {
37
+ displayName: 'Respond With',
38
+ name: 'respondWith',
39
+ type: 'options',
40
+ default: 'object',
41
+ options: [
42
+ {
43
+ name: 'One Object',
44
+ value: 'object',
45
+ description: 'The first input item: a single record, or an envelope the branch built',
46
+ },
47
+ {
48
+ name: 'List of Objects',
49
+ value: 'list',
50
+ description: 'Every input item as an array',
51
+ },
52
+ {
53
+ name: 'Capped List',
54
+ value: 'page',
55
+ description: 'Up to the limit, plus a flag saying whether there was more. What a listing tool answers with.',
56
+ },
57
+ {
58
+ name: 'Error',
59
+ value: 'error',
60
+ description: 'Report a failure so the waiting caller gets a reason instead of a timeout',
61
+ },
62
+ ],
63
+ },
64
+ {
65
+ displayName: 'Limit',
66
+ name: 'pageSize',
67
+ type: 'number',
68
+ default: "={{ $('Prepare query').first().json.q.limit }}",
69
+ displayOptions: { show: { respondWith: ['page'] } },
70
+ description: 'How many rows to answer with. Read one more than this in the branch: if the extra row arrives, the answer is marked truncated.',
71
+ },
72
+ {
73
+ displayName: 'Status',
74
+ name: 'status',
75
+ type: 'number',
76
+ default: 200,
77
+ displayOptions: { hide: { respondWith: ['error'] } },
78
+ },
79
+ {
80
+ displayName: 'Error Message',
81
+ name: 'error',
82
+ type: 'string',
83
+ default: '={{ $json.error }}',
84
+ displayOptions: { show: { respondWith: ['error'] } },
85
+ },
86
+ {
87
+ displayName: 'The masking rules configured for this tool in loopthink are applied here, inside your network, before anything is sent. They travel with each request, so changing them needs no change to this workflow.',
88
+ name: 'notice',
89
+ type: 'notice',
90
+ default: '',
91
+ },
92
+ ];
93
+ async function executeResult() {
94
+ const items = this.getInputData();
95
+ const credentials = await this.getCredentials('loopthinkRunnerApi');
96
+ const queueUrl = String(credentials.queueUrl || '').replace(/\/+$/, '');
97
+ const request = parseRequest(this.getNodeParameter('request', 0));
98
+ const requestId = request.requestId;
99
+ if (!requestId) {
100
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'No requestId in the Request parameter', {
101
+ description: 'It should point at the loopthink Runner node that claimed this call. If you renamed that node, update the expression to match.',
102
+ });
103
+ }
104
+ const respondWith = this.getNodeParameter('respondWith', 0);
105
+ let body;
106
+ if (respondWith === 'error') {
107
+ body = { error: String(this.getNodeParameter('error', 0) ?? 'Tool execution failed') };
108
+ }
109
+ else {
110
+ const payload = pagePayload(this, respondWith, items);
111
+ body = {
112
+ status: this.getNodeParameter('status', 0),
113
+ data: (0, masking_1.applyMasking)(payload, (0, masking_1.rulesForScope)(request.masking ?? [], request.scope ?? undefined)),
114
+ };
115
+ }
116
+ const response = await this.helpers.httpRequest({
117
+ method: 'POST',
118
+ url: `${queueUrl}/group/${credentials.workspaceId}/${credentials.groupId}/runner/request/${requestId}/result`,
119
+ headers: { Authorization: `Bearer ${credentials.secret}` },
120
+ body,
121
+ json: true,
122
+ });
123
+ return [
124
+ this.helpers.returnJsonArray([
125
+ {
126
+ requestId,
127
+ status: body.status ?? null,
128
+ error: body.error ?? null,
129
+ maskingRules: (request.masking ?? []).length,
130
+ accepted: response?.accepted ?? null,
131
+ duplicate: response?.duplicate ?? null,
132
+ sent: body.data ?? null,
133
+ },
134
+ ]),
135
+ ];
136
+ }
137
+ //# sourceMappingURL=result.operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.operation.js","sourceRoot":"","sources":["../../../nodes/Loopthink/result.operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { INodeType, INodeTypeDescription, ITriggerFunctions, ITriggerResponse } from 'n8n-workflow';
2
+ export declare class LoopthinkRunner implements INodeType {
3
+ description: INodeTypeDescription;
4
+ trigger(this: ITriggerFunctions): Promise<ITriggerResponse>;
5
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoopthinkRunner = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const socket_1 = require("./socket");
6
+ const workflowTools_1 = require("./workflowTools");
7
+ class LoopthinkRunner {
8
+ constructor() {
9
+ this.description = {
10
+ displayName: 'loopthink Runner',
11
+ name: 'loopthinkRunner',
12
+ icon: 'file:loopthink-mark.svg',
13
+ group: ['trigger'],
14
+ version: 1,
15
+ subtitle: '={{$parameter["transport"] === "websocket" ? "pushed" : $parameter["pollInterval"] + "s poll"}}',
16
+ description: 'Claims loopthink MCP tool calls and executes the HTTP ones inside your network',
17
+ defaults: { name: 'loopthink Runner' },
18
+ inputs: ['main'],
19
+ outputs: workflowTools_1.RUNNER_OUTPUTS,
20
+ credentials: [
21
+ { name: 'loopthinkRunnerApi', required: true, displayName: 'Authentication' },
22
+ ],
23
+ properties: [
24
+ {
25
+ displayName: 'Transport',
26
+ name: 'transport',
27
+ type: 'options',
28
+ noDataExpression: true,
29
+ default: 'polling',
30
+ options: [
31
+ {
32
+ name: 'Polling',
33
+ value: 'polling',
34
+ description: 'Asks for work over plain HTTPS. Works through any proxy.',
35
+ },
36
+ {
37
+ name: 'WebSocket',
38
+ value: 'websocket',
39
+ description: 'Holds one outbound connection and is pushed work the moment it is queued. No poll latency, far cheaper, but the network has to allow WebSocket upgrades.',
40
+ },
41
+ ],
42
+ },
43
+ {
44
+ displayName: 'Poll Interval (Seconds)',
45
+ displayOptions: { show: { transport: ['polling'] } },
46
+ name: 'pollInterval',
47
+ type: 'number',
48
+ typeOptions: { minValue: 1, maxValue: 60 },
49
+ default: 2,
50
+ description: 'How often to check for work. This is the latency added to every tool call, so lower is snappier, and every poll is a request you pay for. 1 to 5 seconds is the sensible range.',
51
+ },
52
+ {
53
+ displayName: 'Every claimed call leaves here. Route it with a Switch on <code>{{$json.tool}}</code>: a workflow tool goes to the branch that answers it, an HTTP tool to a branch with <b>loopthink → Execute Request</b>. Every branch ends in <b>loopthink → Send Result</b>. Give the Switch a fallback, or a tool nobody answers leaves the caller waiting out its timeout.',
54
+ name: 'workflowNotice',
55
+ type: 'notice',
56
+ default: '',
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ async trigger() {
62
+ const credentials = await this.getCredentials('loopthinkRunnerApi');
63
+ const pollInterval = this.getNodeParameter('pollInterval', 2) * 1000;
64
+ const transport = this.getNodeParameter('transport', 'polling');
65
+ const queueUrl = String(credentials.queueUrl || '').replace(/\/+$/, '');
66
+ const workspaceId = String(credentials.workspaceId);
67
+ const groupId = String(credentials.groupId);
68
+ const secret = String(credentials.secret);
69
+ for (const [label, value] of [
70
+ ['Queue URL', queueUrl],
71
+ ['Workspace ID', workspaceId],
72
+ ['Group ID', groupId],
73
+ ['Secret', secret],
74
+ ]) {
75
+ if (!value) {
76
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `${label} is missing from the loopthink Runner credential`, { description: 'Open the credential and fill it in. The values are shown when the runner is created in loopthink.' });
77
+ }
78
+ }
79
+ const base = `${queueUrl}/group/${workspaceId}/${groupId}/runner`;
80
+ let stopped = false;
81
+ let timer;
82
+ const claim = async () => {
83
+ const response = await this.helpers.httpRequest({
84
+ method: 'POST',
85
+ url: `${base}/next`,
86
+ headers: { Authorization: `Bearer ${secret}` },
87
+ json: true,
88
+ returnFullResponse: true,
89
+ ignoreHttpStatusErrors: true,
90
+ });
91
+ if (response.statusCode === 204)
92
+ return null;
93
+ if (response.statusCode !== 200) {
94
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), response.body, {
95
+ message: `loopthink returned ${response.statusCode} when claiming work`,
96
+ description: 'Check the runner secret and the queue URL on the credential. A 401 means the secret was revoked or belongs to another server.',
97
+ httpCode: String(response.statusCode),
98
+ });
99
+ }
100
+ return response.body;
101
+ };
102
+ const handle = async (job) => {
103
+ (0, workflowTools_1.emitJob)(this, job);
104
+ };
105
+ if (transport === 'websocket') {
106
+ const socket = await (0, socket_1.startSocket)(this, { queueUrl, workspaceId, groupId, secret, handle });
107
+ return { closeFunction: async () => socket.close() };
108
+ }
109
+ const tick = async () => {
110
+ if (stopped)
111
+ return;
112
+ try {
113
+ const job = await claim();
114
+ if (job) {
115
+ await handle(job);
116
+ if (!stopped) {
117
+ setImmediate(() => void tick());
118
+ return;
119
+ }
120
+ }
121
+ }
122
+ catch (error) {
123
+ this.logger.warn(`loopthink Runner: ${error.message}`);
124
+ }
125
+ if (!stopped) {
126
+ timer = setTimeout(() => void tick(), pollInterval);
127
+ }
128
+ };
129
+ void tick();
130
+ return {
131
+ closeFunction: async () => {
132
+ stopped = true;
133
+ if (timer)
134
+ clearTimeout(timer);
135
+ },
136
+ manualTriggerFunction: async () => {
137
+ await tick();
138
+ },
139
+ };
140
+ }
141
+ }
142
+ exports.LoopthinkRunner = LoopthinkRunner;
143
+ //# sourceMappingURL=LoopthinkRunner.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoopthinkRunner.node.js","sourceRoot":"","sources":["../../../nodes/LoopthinkRunner/LoopthinkRunner.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 256 256" width="256" height="256"><image width="256" height="256" xlink:href="data:image/png;base64,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"/></svg>
@@ -0,0 +1,10 @@
1
+ export type MaskingStrategy = 'mask' | 'pseudonymize' | 'remove';
2
+ export type MaskingPattern = 'email' | 'iban' | 'phone';
3
+ export interface MaskingRule {
4
+ field?: string;
5
+ pattern?: MaskingPattern;
6
+ strategy: MaskingStrategy;
7
+ scope?: string;
8
+ }
9
+ export declare function rulesForScope(rules: MaskingRule[], scope?: string): MaskingRule[];
10
+ export declare function applyMasking<T = any>(data: T, rules: MaskingRule[]): T;