@elizaos/plugin-n8n-workflow 1.0.11 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -10
- package/dist/actions/createWorkflow.d.ts +7 -1
- package/dist/actions/createWorkflow.d.ts.map +1 -1
- package/dist/actions/createWorkflow.js +43 -11
- package/dist/actions/createWorkflow.js.map +1 -1
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +1 -0
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/modifyExistingWorkflow.d.ts +3 -0
- package/dist/actions/modifyExistingWorkflow.d.ts.map +1 -0
- package/dist/actions/modifyExistingWorkflow.js +199 -0
- package/dist/actions/modifyExistingWorkflow.js.map +1 -0
- package/dist/data/defaultNodes.json +2881 -1374
- package/dist/data/schemaIndex.json +125381 -0
- package/dist/data/triggerSchemaIndex.json +1217 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts/actionResponse.d.ts +1 -1
- package/dist/prompts/actionResponse.d.ts.map +1 -1
- package/dist/prompts/actionResponse.js +1 -1
- package/dist/prompts/fieldCorrection.d.ts +3 -0
- package/dist/prompts/fieldCorrection.d.ts.map +1 -0
- package/dist/prompts/fieldCorrection.js +20 -0
- package/dist/prompts/fieldCorrection.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/parameterCorrection.d.ts +3 -0
- package/dist/prompts/parameterCorrection.d.ts.map +1 -0
- package/dist/prompts/parameterCorrection.js +29 -0
- package/dist/prompts/parameterCorrection.js.map +1 -0
- package/dist/prompts/workflowGeneration.d.ts +1 -1
- package/dist/prompts/workflowGeneration.d.ts.map +1 -1
- package/dist/prompts/workflowGeneration.js +3 -2
- package/dist/prompts/workflowGeneration.js.map +1 -1
- package/dist/services/n8n-workflow-service.d.ts +1 -0
- package/dist/services/n8n-workflow-service.d.ts.map +1 -1
- package/dist/services/n8n-workflow-service.js +78 -17
- package/dist/services/n8n-workflow-service.js.map +1 -1
- package/dist/types/index.d.ts +37 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/catalog.d.ts +5 -3
- package/dist/utils/catalog.d.ts.map +1 -1
- package/dist/utils/catalog.js +87 -9
- package/dist/utils/catalog.js.map +1 -1
- package/dist/utils/credentialResolver.d.ts +1 -1
- package/dist/utils/credentialResolver.d.ts.map +1 -1
- package/dist/utils/credentialResolver.js +5 -4
- package/dist/utils/credentialResolver.js.map +1 -1
- package/dist/utils/generation.d.ts +9 -1
- package/dist/utils/generation.d.ts.map +1 -1
- package/dist/utils/generation.js +220 -9
- package/dist/utils/generation.js.map +1 -1
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/outputSchema.d.ts +26 -0
- package/dist/utils/outputSchema.d.ts.map +1 -0
- package/dist/utils/outputSchema.js +271 -0
- package/dist/utils/outputSchema.js.map +1 -0
- package/dist/utils/workflow.d.ts +33 -1
- package/dist/utils/workflow.d.ts.map +1 -1
- package/dist/utils/workflow.js +259 -13
- package/dist/utils/workflow.js.map +1 -1
- package/package.json +4 -2
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAiO1B,4BAA4B;AAE5B,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB,CAAC;AAkCtE;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAQ,OAAmC,CAAC,OAAO,KAAK,UAAU,CAAC;AAC5E,CAAC;AAED,yBAAyB;AAEzB,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAiO1B,4BAA4B;AAE5B,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB,CAAC;AAkCtE;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAQ,OAAmC,CAAC,OAAO,KAAK,UAAU,CAAC;AAC5E,CAAC;AAED,yBAAyB;AAEzB,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAqDhE,cAAc;AAEd,MAAM,OAAO,WAAY,SAAQ,KAAK;IAG3B;IACA;IAHT,YACE,OAAe,EACR,UAAmB,EACnB,QAAkB;QAEzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAS;QACnB,aAAQ,GAAR,QAAQ,CAAU;QAGzB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAE3C;IACA;IAFT,YACS,mBAA6B,EAC7B,iBAA2B;QAElC,KAAK,CAAC,6BAA6B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAH9D,wBAAmB,GAAnB,mBAAmB,CAAU;QAC7B,sBAAiB,GAAjB,iBAAiB,CAAU;QAGlC,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF"}
|
package/dist/utils/catalog.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { NodeDefinition, NodeSearchResult, IntegrationFilterResult } from '../types/index';
|
|
2
2
|
/**
|
|
3
|
-
* Look up a node definition by its type name
|
|
3
|
+
* Look up a node definition by its type name.
|
|
4
4
|
*
|
|
5
|
-
* Handles
|
|
5
|
+
* Handles full names ("n8n-nodes-base.gmail", "@n8n/n8n-nodes-langchain.openAi")
|
|
6
|
+
* and bare names ("gmail", "openAi").
|
|
6
7
|
*/
|
|
7
8
|
export declare function getNodeDefinition(typeName: string): NodeDefinition | undefined;
|
|
8
9
|
/**
|
|
9
|
-
* Scoring: exact name 10,
|
|
10
|
+
* Scoring: exact name 10, word-boundary 7, substring 3, category 3, description 2, word 1
|
|
10
11
|
*/
|
|
11
12
|
export declare function searchNodes(keywords: string[], limit?: number): NodeSearchResult[];
|
|
12
13
|
export declare function filterNodesByIntegrationSupport(nodes: NodeSearchResult[], supportedCredTypes: Set<string>): IntegrationFilterResult;
|
|
14
|
+
export declare function simplifyNodeForLLM(node: NodeDefinition): NodeDefinition;
|
|
13
15
|
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/utils/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/utils/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AAWxB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAW9E;AAWD;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,GAAG,gBAAgB,EAAE,CAiE9E;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,gBAAgB,EAAE,EACzB,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC9B,uBAAuB,CAuBzB;AAwDD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAgBvE"}
|
package/dist/utils/catalog.js
CHANGED
|
@@ -6,25 +6,32 @@ import defaultNodesData from '../data/defaultNodes.json' assert { type: 'json' }
|
|
|
6
6
|
*/
|
|
7
7
|
const NODE_CATALOG = defaultNodesData;
|
|
8
8
|
/**
|
|
9
|
-
* Look up a node definition by its type name
|
|
9
|
+
* Look up a node definition by its type name.
|
|
10
10
|
*
|
|
11
|
-
* Handles
|
|
11
|
+
* Handles full names ("n8n-nodes-base.gmail", "@n8n/n8n-nodes-langchain.openAi")
|
|
12
|
+
* and bare names ("gmail", "openAi").
|
|
12
13
|
*/
|
|
13
14
|
export function getNodeDefinition(typeName) {
|
|
14
|
-
// Try exact match first
|
|
15
15
|
const exact = NODE_CATALOG.find((n) => n.name === typeName);
|
|
16
16
|
if (exact) {
|
|
17
17
|
return exact;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
const bare = typeName.replace(/^n8n-nodes-base\./, '');
|
|
19
|
+
const bare = typeName.replace(/^(?:n8n-nodes-base|@n8n\/n8n-nodes-langchain)\./, '');
|
|
21
20
|
return NODE_CATALOG.find((n) => {
|
|
22
|
-
const catalogBare = n.name.replace(/^n8n-nodes-base\./, '');
|
|
21
|
+
const catalogBare = n.name.replace(/^(?:n8n-nodes-base|@n8n\/n8n-nodes-langchain)\./, '');
|
|
23
22
|
return catalogBare === bare || n.name === bare;
|
|
24
23
|
});
|
|
25
24
|
}
|
|
25
|
+
/** Split a name into lowercase tokens on camelCase / dot / hyphen / underscore / @ / slash boundaries */
|
|
26
|
+
function tokenize(name) {
|
|
27
|
+
return name
|
|
28
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → words
|
|
29
|
+
.split(/[\s.\-_@/]+/)
|
|
30
|
+
.map((t) => t.toLowerCase())
|
|
31
|
+
.filter(Boolean);
|
|
32
|
+
}
|
|
26
33
|
/**
|
|
27
|
-
* Scoring: exact name 10,
|
|
34
|
+
* Scoring: exact name 10, word-boundary 7, substring 3, category 3, description 2, word 1
|
|
28
35
|
*/
|
|
29
36
|
export function searchNodes(keywords, limit = 15) {
|
|
30
37
|
if (keywords.length === 0) {
|
|
@@ -37,14 +44,22 @@ export function searchNodes(keywords, limit = 15) {
|
|
|
37
44
|
const nodeName = node.name.toLowerCase();
|
|
38
45
|
const nodeDisplayName = node.displayName.toLowerCase();
|
|
39
46
|
const nodeDescription = node.description?.toLowerCase() || '';
|
|
47
|
+
const nameTokens = tokenize(node.name);
|
|
48
|
+
const displayTokens = tokenize(node.displayName);
|
|
40
49
|
for (const keyword of normalizedKeywords) {
|
|
41
50
|
if (nodeName === keyword || nodeDisplayName === keyword) {
|
|
42
51
|
score += 10;
|
|
43
52
|
matchReasons.push(`exact match: "${keyword}"`);
|
|
44
53
|
continue;
|
|
45
54
|
}
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
// Word-boundary match: keyword equals a token in the name
|
|
56
|
+
const isWordMatch = nameTokens.some((t) => t === keyword) || displayTokens.some((t) => t === keyword);
|
|
57
|
+
if (isWordMatch) {
|
|
58
|
+
score += 7;
|
|
59
|
+
matchReasons.push(`word match: "${keyword}"`);
|
|
60
|
+
}
|
|
61
|
+
else if (nodeName.includes(keyword) || nodeDisplayName.includes(keyword)) {
|
|
62
|
+
score += 3;
|
|
48
63
|
matchReasons.push(`name contains: "${keyword}"`);
|
|
49
64
|
}
|
|
50
65
|
if (nodeDescription.includes(keyword)) {
|
|
@@ -92,4 +107,67 @@ export function filterNodesByIntegrationSupport(nodes, supportedCredTypes) {
|
|
|
92
107
|
}
|
|
93
108
|
return { remaining, removed };
|
|
94
109
|
}
|
|
110
|
+
const NOISE_TYPES = new Set(['notice', 'hidden']);
|
|
111
|
+
const STRIP_KEYS = new Set([
|
|
112
|
+
'routing',
|
|
113
|
+
'displayOptions',
|
|
114
|
+
'typeOptions',
|
|
115
|
+
'hint',
|
|
116
|
+
'isNodeSetting',
|
|
117
|
+
'noDataExpression',
|
|
118
|
+
'validateType',
|
|
119
|
+
'ignoreValidationDuringExecution',
|
|
120
|
+
'requiresDataPath',
|
|
121
|
+
'disabledOptions',
|
|
122
|
+
'credentialTypes',
|
|
123
|
+
'modes',
|
|
124
|
+
]);
|
|
125
|
+
function simplifyProperty(prop) {
|
|
126
|
+
if (NOISE_TYPES.has(prop.type)) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const slim = {};
|
|
130
|
+
for (const [key, value] of Object.entries(prop)) {
|
|
131
|
+
if (STRIP_KEYS.has(key)) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
slim[key] = value;
|
|
135
|
+
}
|
|
136
|
+
if (prop.type === 'resourceLocator') {
|
|
137
|
+
slim.type = 'string';
|
|
138
|
+
slim.default = '';
|
|
139
|
+
slim.description = slim.description || `${prop.displayName} ID`;
|
|
140
|
+
}
|
|
141
|
+
if (prop.options && Array.isArray(prop.options)) {
|
|
142
|
+
slim.options = prop.options.map((opt) => {
|
|
143
|
+
if (opt.values && Array.isArray(opt.values)) {
|
|
144
|
+
return {
|
|
145
|
+
name: opt.name,
|
|
146
|
+
displayName: opt.displayName,
|
|
147
|
+
values: opt.values
|
|
148
|
+
.map(simplifyProperty)
|
|
149
|
+
.filter((v) => v !== null),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const { description: _d, ...rest } = opt;
|
|
153
|
+
return rest;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return slim;
|
|
157
|
+
}
|
|
158
|
+
export function simplifyNodeForLLM(node) {
|
|
159
|
+
const cleaned = node.properties
|
|
160
|
+
.map(simplifyProperty)
|
|
161
|
+
.filter((p) => p !== null);
|
|
162
|
+
const seen = new Set();
|
|
163
|
+
const deduped = [];
|
|
164
|
+
for (const prop of cleaned) {
|
|
165
|
+
if (seen.has(prop.name)) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
seen.add(prop.name);
|
|
169
|
+
deduped.push(prop);
|
|
170
|
+
}
|
|
171
|
+
return { ...node, properties: deduped };
|
|
172
|
+
}
|
|
95
173
|
//# sourceMappingURL=catalog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/utils/catalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/utils/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,5 +9,5 @@ import type { N8nApiClient } from './api';
|
|
|
9
9
|
* 3. External provider — registered CredentialProvider service (e.g. cloud OAuth)
|
|
10
10
|
* 4. Missing — reported for manual configuration in n8n
|
|
11
11
|
*/
|
|
12
|
-
export declare function resolveCredentials(workflow: N8nWorkflow, userId: string, config: N8nPluginConfig, credStore: N8nCredentialStoreApi | null, credProvider: CredentialProvider | null, apiClient: N8nApiClient | null): Promise<CredentialResolutionResult>;
|
|
12
|
+
export declare function resolveCredentials(workflow: N8nWorkflow, userId: string, config: N8nPluginConfig, credStore: N8nCredentialStoreApi | null, credProvider: CredentialProvider | null, apiClient: N8nApiClient | null, tagName: string): Promise<CredentialResolutionResult>;
|
|
13
13
|
//# sourceMappingURL=credentialResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentialResolver.d.ts","sourceRoot":"","sources":["../../src/utils/credentialResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,0BAA0B,EAE1B,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,qBAAqB,GAAG,IAAI,EACvC,YAAY,EAAE,kBAAkB,GAAG,IAAI,EACvC,SAAS,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"credentialResolver.d.ts","sourceRoot":"","sources":["../../src/utils/credentialResolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,0BAA0B,EAE1B,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,qBAAqB,GAAG,IAAI,EACvC,YAAY,EAAE,kBAAkB,GAAG,IAAI,EACvC,SAAS,EAAE,YAAY,GAAG,IAAI,EAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,0BAA0B,CAAC,CAsCrC"}
|
|
@@ -8,7 +8,7 @@ import { logger } from '@elizaos/core';
|
|
|
8
8
|
* 3. External provider — registered CredentialProvider service (e.g. cloud OAuth)
|
|
9
9
|
* 4. Missing — reported for manual configuration in n8n
|
|
10
10
|
*/
|
|
11
|
-
export async function resolveCredentials(workflow, userId, config, credStore, credProvider, apiClient) {
|
|
11
|
+
export async function resolveCredentials(workflow, userId, config, credStore, credProvider, apiClient, tagName) {
|
|
12
12
|
const requiredCredTypes = extractRequiredCredentialTypes(workflow);
|
|
13
13
|
if (requiredCredTypes.size === 0) {
|
|
14
14
|
return {
|
|
@@ -20,7 +20,7 @@ export async function resolveCredentials(workflow, userId, config, credStore, cr
|
|
|
20
20
|
const injectedCredentials = new Map();
|
|
21
21
|
const missingConnections = [];
|
|
22
22
|
for (const credType of requiredCredTypes) {
|
|
23
|
-
const credId = await resolveOneCredential(credType, userId, config, credStore, credProvider, apiClient, missingConnections);
|
|
23
|
+
const credId = await resolveOneCredential(credType, userId, config, credStore, credProvider, apiClient, missingConnections, tagName);
|
|
24
24
|
if (credId) {
|
|
25
25
|
injectedCredentials.set(credType, credId);
|
|
26
26
|
}
|
|
@@ -32,7 +32,7 @@ export async function resolveCredentials(workflow, userId, config, credStore, cr
|
|
|
32
32
|
injectedCredentials,
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
async function resolveOneCredential(credType, userId, config, credStore, credProvider, apiClient, missingConnections) {
|
|
35
|
+
async function resolveOneCredential(credType, userId, config, credStore, credProvider, apiClient, missingConnections, tagName) {
|
|
36
36
|
// 1. Credential store DB
|
|
37
37
|
const cachedId = await credStore?.get(userId, credType);
|
|
38
38
|
if (cachedId) {
|
|
@@ -56,8 +56,9 @@ async function resolveOneCredential(credType, userId, config, credStore, credPro
|
|
|
56
56
|
missingConnections.push({ credType });
|
|
57
57
|
return null;
|
|
58
58
|
}
|
|
59
|
+
const credName = `${credType}_${tagName}`;
|
|
59
60
|
const n8nCred = await apiClient.createCredential({
|
|
60
|
-
name:
|
|
61
|
+
name: credName,
|
|
61
62
|
type: credType,
|
|
62
63
|
data: result.data,
|
|
63
64
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentialResolver.js","sourceRoot":"","sources":["../../src/utils/credentialResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAWvC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAqB,EACrB,MAAc,EACd,MAAuB,EACvB,SAAuC,EACvC,YAAuC,EACvC,SAA8B;
|
|
1
|
+
{"version":3,"file":"credentialResolver.js","sourceRoot":"","sources":["../../src/utils/credentialResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type IAgentRuntime } from '@elizaos/core';
|
|
2
|
-
import { N8nWorkflow, WorkflowMatchResult, WorkflowDraft, DraftIntentResult, NodeDefinition, NodeSearchResult, FeasibilityResult } from '../types/index';
|
|
2
|
+
import { N8nWorkflow, WorkflowMatchResult, WorkflowDraft, DraftIntentResult, NodeDefinition, NodeSearchResult, FeasibilityResult, OutputRefValidation } from '../types/index';
|
|
3
|
+
import type { UnknownParamDetection } from './workflow';
|
|
3
4
|
export declare function extractKeywords(runtime: IAgentRuntime, userPrompt: string): Promise<string[]>;
|
|
4
5
|
export declare function matchWorkflow(runtime: IAgentRuntime, userRequest: string, workflows: N8nWorkflow[]): Promise<WorkflowMatchResult>;
|
|
5
6
|
export declare function classifyDraftIntent(runtime: IAgentRuntime, userMessage: string, draft: WorkflowDraft): Promise<DraftIntentResult>;
|
|
@@ -8,4 +9,11 @@ export declare function modifyWorkflow(runtime: IAgentRuntime, existingWorkflow:
|
|
|
8
9
|
export declare function collectExistingNodeDefinitions(workflow: N8nWorkflow): NodeDefinition[];
|
|
9
10
|
export declare function formatActionResponse(runtime: IAgentRuntime, responseType: string, data: Record<string, unknown>): Promise<string>;
|
|
10
11
|
export declare function assessFeasibility(runtime: IAgentRuntime, userPrompt: string, removedNodes: NodeSearchResult[], remainingNodes: NodeSearchResult[]): Promise<FeasibilityResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Auto-corrects invalid field references in expressions using parallel LLM calls.
|
|
14
|
+
* Returns a new workflow with corrected expressions.
|
|
15
|
+
*/
|
|
16
|
+
export declare function correctFieldReferences(runtime: IAgentRuntime, workflow: N8nWorkflow, invalidRefs: OutputRefValidation[]): Promise<N8nWorkflow>;
|
|
17
|
+
/** Deterministic fast path + LLM fallback for parameter name correction. */
|
|
18
|
+
export declare function correctParameterNames(runtime: IAgentRuntime, workflow: N8nWorkflow, detections: UnknownParamDetection[]): Promise<N8nWorkflow>;
|
|
11
19
|
//# sourceMappingURL=generation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../../src/utils/generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,eAAe,CAAC;AACtE,OAAO,EAEL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../../src/utils/generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,eAAe,CAAC;AACtE,OAAO,EAEL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AA2BxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCnB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,WAAW,EAAE,GACvB,OAAO,CAAC,mBAAmB,CAAC,CAqE9B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAyC5B;AAgED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,cAAc,EAAE,GAC9B,OAAO,CAAC,WAAW,CAAC,CAgCtB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,WAAW,EAC7B,mBAAmB,EAAE,MAAM,EAC3B,aAAa,EAAE,cAAc,EAAE,GAC9B,OAAO,CAAC,WAAW,CAAC,CAwCtB;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,EAAE,CAsBtF;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,gBAAgB,EAAE,EAChC,cAAc,EAAE,gBAAgB,EAAE,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAsC5B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,mBAAmB,EAAE,GACjC,OAAO,CAAC,WAAW,CAAC,CAyDtB;AAqDD,4EAA4E;AAC5E,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,qBAAqB,EAAE,GAClC,OAAO,CAAC,WAAW,CAAC,CA4HtB"}
|
package/dist/utils/generation.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ModelType, logger } from '@elizaos/core';
|
|
2
|
-
import { KEYWORD_EXTRACTION_SYSTEM_PROMPT, WORKFLOW_GENERATION_SYSTEM_PROMPT, DRAFT_INTENT_SYSTEM_PROMPT, ACTION_RESPONSE_SYSTEM_PROMPT, FEASIBILITY_CHECK_PROMPT, } from '../prompts/index';
|
|
2
|
+
import { KEYWORD_EXTRACTION_SYSTEM_PROMPT, WORKFLOW_GENERATION_SYSTEM_PROMPT, DRAFT_INTENT_SYSTEM_PROMPT, ACTION_RESPONSE_SYSTEM_PROMPT, FEASIBILITY_CHECK_PROMPT, FIELD_CORRECTION_SYSTEM_PROMPT, FIELD_CORRECTION_USER_PROMPT, PARAM_CORRECTION_SYSTEM_PROMPT, PARAM_CORRECTION_USER_PROMPT, } from '../prompts/index';
|
|
3
3
|
import { WORKFLOW_MATCHING_SYSTEM_PROMPT } from '../prompts/workflowMatching';
|
|
4
4
|
import { keywordExtractionSchema, workflowMatchingSchema, draftIntentSchema, feasibilitySchema, } from '../schemas/index';
|
|
5
|
-
import { getNodeDefinition } from './catalog';
|
|
5
|
+
import { getNodeDefinition, simplifyNodeForLLM } from './catalog';
|
|
6
|
+
import { hasOutputSchema, getAvailableResources, getAvailableOperations, loadOutputSchema, formatSchemaForPrompt, } from './outputSchema';
|
|
6
7
|
export async function extractKeywords(runtime, userPrompt) {
|
|
7
8
|
let result;
|
|
8
9
|
try {
|
|
@@ -113,14 +114,13 @@ ${userMessage}`,
|
|
|
113
114
|
logger.warn({ src: 'plugin:n8n-workflow:generation:intent' }, `Invalid intent from LLM: ${JSON.stringify(result)}, re-showing preview`);
|
|
114
115
|
return { intent: 'show_preview', reason: 'Could not classify intent — re-showing preview' };
|
|
115
116
|
}
|
|
116
|
-
logger.debug({ src: 'plugin:n8n-workflow:generation:intent' }, `Draft intent: ${result.intent} — ${result.reason}`);
|
|
117
117
|
return result;
|
|
118
118
|
}
|
|
119
119
|
function parseWorkflowResponse(response) {
|
|
120
|
+
// Strip markdown code fences (handles ```json, ```, with any whitespace/newlines)
|
|
120
121
|
const cleaned = response
|
|
121
|
-
.replace(
|
|
122
|
-
.replace(
|
|
123
|
-
.replace(/```\s*$/, '')
|
|
122
|
+
.replace(/^[\s\S]*?```(?:json)?\s*\n?/i, '') // Remove everything up to and including opening fence
|
|
123
|
+
.replace(/\n?```[\s\S]*$/i, '') // Remove closing fence and everything after
|
|
124
124
|
.trim();
|
|
125
125
|
let workflow;
|
|
126
126
|
try {
|
|
@@ -137,14 +137,45 @@ function parseWorkflowResponse(response) {
|
|
|
137
137
|
}
|
|
138
138
|
return workflow;
|
|
139
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Build output schema context for relevant nodes so the LLM knows the exact
|
|
142
|
+
* output fields when writing expressions like {{ $json.field }}.
|
|
143
|
+
*/
|
|
144
|
+
function buildOutputSchemaContext(nodes) {
|
|
145
|
+
const sections = [];
|
|
146
|
+
for (const node of nodes) {
|
|
147
|
+
if (!hasOutputSchema(node.name)) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const resources = getAvailableResources(node.name);
|
|
151
|
+
for (const resource of resources) {
|
|
152
|
+
const operations = getAvailableOperations(node.name, resource);
|
|
153
|
+
for (const operation of operations) {
|
|
154
|
+
const result = loadOutputSchema(node.name, resource, operation);
|
|
155
|
+
if (!result) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const formatted = formatSchemaForPrompt(result.schema);
|
|
159
|
+
sections.push(`### ${node.name} (resource: "${resource}", operation: "${operation}")\n${formatted}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (sections.length === 0) {
|
|
164
|
+
return '';
|
|
165
|
+
}
|
|
166
|
+
return `\n## Node Output Schemas\n\nWhen referencing output data from a previous node using expressions like \`{{ $json.field }}\`, use ONLY the field paths listed below. Do NOT invent field names from your training data.\n\n${sections.join('\n\n')}`;
|
|
167
|
+
}
|
|
140
168
|
export async function generateWorkflow(runtime, userPrompt, relevantNodes) {
|
|
169
|
+
const simplifiedNodes = relevantNodes.map(simplifyNodeForLLM);
|
|
170
|
+
const outputSchemaCtx = buildOutputSchemaContext(relevantNodes);
|
|
141
171
|
const fullPrompt = `${WORKFLOW_GENERATION_SYSTEM_PROMPT}
|
|
142
172
|
|
|
143
173
|
## Relevant Nodes Available
|
|
144
174
|
|
|
145
|
-
${JSON.stringify(
|
|
175
|
+
${JSON.stringify(simplifiedNodes, null, 2)}
|
|
146
176
|
|
|
147
177
|
Use these node definitions to generate the workflow. Each node's "properties" field defines the available parameters.
|
|
178
|
+
${outputSchemaCtx}
|
|
148
179
|
|
|
149
180
|
## User Request
|
|
150
181
|
|
|
@@ -164,13 +195,16 @@ Generate a valid n8n workflow JSON that fulfills this request.`;
|
|
|
164
195
|
}
|
|
165
196
|
export async function modifyWorkflow(runtime, existingWorkflow, modificationRequest, relevantNodes) {
|
|
166
197
|
const { _meta, ...workflowForLLM } = existingWorkflow;
|
|
198
|
+
const simplifiedNodes = relevantNodes.map(simplifyNodeForLLM);
|
|
199
|
+
const outputSchemaCtx = buildOutputSchemaContext(relevantNodes);
|
|
167
200
|
const fullPrompt = `${WORKFLOW_GENERATION_SYSTEM_PROMPT}
|
|
168
201
|
|
|
169
202
|
## Relevant Nodes Available
|
|
170
203
|
|
|
171
|
-
${JSON.stringify(
|
|
204
|
+
${JSON.stringify(simplifiedNodes, null, 2)}
|
|
172
205
|
|
|
173
206
|
Use these node definitions to modify the workflow. Each node's "properties" field defines the available parameters.
|
|
207
|
+
${outputSchemaCtx}
|
|
174
208
|
|
|
175
209
|
## Existing Workflow (modify this)
|
|
176
210
|
|
|
@@ -187,7 +221,12 @@ Keep all unchanged nodes and connections intact. Only add, remove, or change wha
|
|
|
187
221
|
temperature: 0,
|
|
188
222
|
responseFormat: { type: 'json_object' },
|
|
189
223
|
});
|
|
190
|
-
|
|
224
|
+
const modified = parseWorkflowResponse(response);
|
|
225
|
+
// Preserve the original workflow ID for updates (LLM doesn't return it)
|
|
226
|
+
if (existingWorkflow.id) {
|
|
227
|
+
modified.id = existingWorkflow.id;
|
|
228
|
+
}
|
|
229
|
+
return modified;
|
|
191
230
|
}
|
|
192
231
|
export function collectExistingNodeDefinitions(workflow) {
|
|
193
232
|
const defs = [];
|
|
@@ -256,4 +295,176 @@ export async function assessFeasibility(runtime, userPrompt, removedNodes, remai
|
|
|
256
295
|
};
|
|
257
296
|
}
|
|
258
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* Auto-corrects invalid field references in expressions using parallel LLM calls.
|
|
300
|
+
* Returns a new workflow with corrected expressions.
|
|
301
|
+
*/
|
|
302
|
+
export async function correctFieldReferences(runtime, workflow, invalidRefs) {
|
|
303
|
+
if (invalidRefs.length === 0) {
|
|
304
|
+
return workflow;
|
|
305
|
+
}
|
|
306
|
+
logger.debug({ src: 'plugin:n8n-workflow:generation:correction' }, `Correcting ${invalidRefs.length} invalid field reference(s)`);
|
|
307
|
+
const corrections = await Promise.all(invalidRefs.map(async (ref) => {
|
|
308
|
+
try {
|
|
309
|
+
const userPrompt = FIELD_CORRECTION_USER_PROMPT.replace('{expression}', ref.expression).replace('{availableFields}', ref.availableFields.join('\n'));
|
|
310
|
+
const corrected = await runtime.useModel(ModelType.TEXT_SMALL, {
|
|
311
|
+
prompt: `${FIELD_CORRECTION_SYSTEM_PROMPT}\n\n${userPrompt}`,
|
|
312
|
+
temperature: 0,
|
|
313
|
+
});
|
|
314
|
+
const cleaned = corrected.trim();
|
|
315
|
+
return { original: ref.expression, corrected: cleaned, nodeName: ref.nodeName };
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
319
|
+
logger.warn({ src: 'plugin:n8n-workflow:generation:correction', error: errMsg }, `Failed to correct expression "${ref.expression}": ${errMsg}`);
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
}));
|
|
323
|
+
const correctedWorkflow = JSON.parse(JSON.stringify(workflow));
|
|
324
|
+
for (const correction of corrections) {
|
|
325
|
+
if (!correction) {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
const node = correctedWorkflow.nodes.find((n) => n.name === correction.nodeName);
|
|
329
|
+
if (!node?.parameters) {
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
replaceInObject(node.parameters, correction.original, correction.corrected);
|
|
333
|
+
logger.debug({ src: 'plugin:n8n-workflow:generation:correction' }, `Corrected "${correction.original}" → "${correction.corrected}" in node "${correction.nodeName}"`);
|
|
334
|
+
}
|
|
335
|
+
return correctedWorkflow;
|
|
336
|
+
}
|
|
337
|
+
function replaceInObject(obj, original, replacement) {
|
|
338
|
+
for (const key of Object.keys(obj)) {
|
|
339
|
+
const value = obj[key];
|
|
340
|
+
if (typeof value === 'string' && value.includes(original)) {
|
|
341
|
+
obj[key] = value.replaceAll(original, replacement);
|
|
342
|
+
}
|
|
343
|
+
else if (Array.isArray(value)) {
|
|
344
|
+
for (let i = 0; i < value.length; i++) {
|
|
345
|
+
if (typeof value[i] === 'string' && value[i].includes(original)) {
|
|
346
|
+
value[i] = value[i].replaceAll(original, replacement);
|
|
347
|
+
}
|
|
348
|
+
else if (typeof value[i] === 'object' && value[i] !== null) {
|
|
349
|
+
replaceInObject(value[i], original, replacement);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
else if (typeof value === 'object' && value !== null) {
|
|
354
|
+
replaceInObject(value, original, replacement);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Try to deterministically rename an unknown key to a valid property name.
|
|
360
|
+
* Returns the matching property name or null if no confident match.
|
|
361
|
+
*/
|
|
362
|
+
function fuzzyMatchParam(unknownKey, validProps) {
|
|
363
|
+
const lower = unknownKey.toLowerCase();
|
|
364
|
+
// Substring match: one valid prop contains the unknown key or vice-versa
|
|
365
|
+
// Guard: shorter string must be ≥ 60% of the longer to avoid false positives (e.g. "url" in "curl")
|
|
366
|
+
const substringMatches = validProps.filter((p) => {
|
|
367
|
+
const pLower = p.name.toLowerCase();
|
|
368
|
+
if (!(pLower.includes(lower) || lower.includes(pLower))) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
const ratio = Math.min(lower.length, pLower.length) / Math.max(lower.length, pLower.length);
|
|
372
|
+
return ratio >= 0.6;
|
|
373
|
+
});
|
|
374
|
+
if (substringMatches.length === 1) {
|
|
375
|
+
return substringMatches[0].name;
|
|
376
|
+
}
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
/** Deterministic fast path + LLM fallback for parameter name correction. */
|
|
380
|
+
export async function correctParameterNames(runtime, workflow, detections) {
|
|
381
|
+
if (detections.length === 0) {
|
|
382
|
+
return workflow;
|
|
383
|
+
}
|
|
384
|
+
const correctedWorkflow = JSON.parse(JSON.stringify(workflow));
|
|
385
|
+
// Phase 1: deterministic renames (no LLM cost)
|
|
386
|
+
const needsLLM = [];
|
|
387
|
+
for (const detection of detections) {
|
|
388
|
+
const node = correctedWorkflow.nodes.find((n) => n.name === detection.nodeName);
|
|
389
|
+
if (!node) {
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
const remainingUnknowns = [];
|
|
393
|
+
for (const key of detection.unknownKeys) {
|
|
394
|
+
const match = fuzzyMatchParam(key, detection.propertyDefs);
|
|
395
|
+
if (match) {
|
|
396
|
+
logger.debug({ src: 'plugin:n8n-workflow:generation:paramCorrection' }, `Node "${detection.nodeName}": ${key} → ${match} (deterministic)`);
|
|
397
|
+
node.parameters[match] = node.parameters[key];
|
|
398
|
+
delete node.parameters[key];
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
remainingUnknowns.push(key);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (remainingUnknowns.length > 0) {
|
|
405
|
+
needsLLM.push({
|
|
406
|
+
...detection,
|
|
407
|
+
unknownKeys: remainingUnknowns,
|
|
408
|
+
currentParams: node.parameters,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (needsLLM.length === 0) {
|
|
413
|
+
return correctedWorkflow;
|
|
414
|
+
}
|
|
415
|
+
// Phase 2: LLM correction for complex cases (restructuring)
|
|
416
|
+
logger.debug({ src: 'plugin:n8n-workflow:generation:paramCorrection' }, `LLM correction needed for ${needsLLM.length} node(s): ${needsLLM.map((d) => `"${d.nodeName}" (${d.unknownKeys.join(', ')})`).join('; ')}`);
|
|
417
|
+
const corrections = await Promise.all(needsLLM.map(async (detection) => {
|
|
418
|
+
try {
|
|
419
|
+
const userPrompt = PARAM_CORRECTION_USER_PROMPT.replace('{nodeType}', detection.nodeType)
|
|
420
|
+
.replace('{currentParams}', JSON.stringify(detection.currentParams, null, 2))
|
|
421
|
+
.replace('{propertyDefs}', JSON.stringify(detection.propertyDefs, null, 2));
|
|
422
|
+
const response = await runtime.useModel(ModelType.TEXT_SMALL, {
|
|
423
|
+
prompt: `${PARAM_CORRECTION_SYSTEM_PROMPT}\n\n${userPrompt}`,
|
|
424
|
+
temperature: 0,
|
|
425
|
+
});
|
|
426
|
+
const cleaned = response
|
|
427
|
+
.replace(/^[\s\S]*?```(?:json)?\s*\n?/i, '')
|
|
428
|
+
.replace(/\n?```[\s\S]*$/i, '')
|
|
429
|
+
.trim();
|
|
430
|
+
const correctedParams = JSON.parse(cleaned);
|
|
431
|
+
// Validate: corrected params should only contain valid property names
|
|
432
|
+
const validNames = new Set(detection.propertyDefs.map((p) => p.name));
|
|
433
|
+
validNames.add('resource');
|
|
434
|
+
validNames.add('operation');
|
|
435
|
+
const invalidKeys = Object.keys(correctedParams).filter((k) => !validNames.has(k));
|
|
436
|
+
if (invalidKeys.length > 0) {
|
|
437
|
+
logger.warn({ src: 'plugin:n8n-workflow:generation:paramCorrection' }, `LLM returned invalid keys for "${detection.nodeName}": ${invalidKeys.join(', ')} — dropping them`);
|
|
438
|
+
for (const k of invalidKeys) {
|
|
439
|
+
delete correctedParams[k];
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return { nodeName: detection.nodeName, correctedParams };
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
446
|
+
logger.warn({ src: 'plugin:n8n-workflow:generation:paramCorrection', error: errMsg }, `Failed to correct parameters for node "${detection.nodeName}": ${errMsg}`);
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
}));
|
|
450
|
+
for (const correction of corrections) {
|
|
451
|
+
if (!correction) {
|
|
452
|
+
continue;
|
|
453
|
+
}
|
|
454
|
+
const node = correctedWorkflow.nodes.find((n) => n.name === correction.nodeName);
|
|
455
|
+
if (!node) {
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
// Preserve resource/operation (already corrected by correctOptionParameters)
|
|
459
|
+
if (node.parameters.resource !== undefined) {
|
|
460
|
+
correction.correctedParams.resource = node.parameters.resource;
|
|
461
|
+
}
|
|
462
|
+
if (node.parameters.operation !== undefined) {
|
|
463
|
+
correction.correctedParams.operation = node.parameters.operation;
|
|
464
|
+
}
|
|
465
|
+
logger.debug({ src: 'plugin:n8n-workflow:generation:paramCorrection' }, `Node "${correction.nodeName}": params corrected via LLM — keys: ${Object.keys(correction.correctedParams).join(', ')}`);
|
|
466
|
+
node.parameters = correction.correctedParams;
|
|
467
|
+
}
|
|
468
|
+
return correctedWorkflow;
|
|
469
|
+
}
|
|
259
470
|
//# sourceMappingURL=generation.js.map
|