@n8n/instance-ai 1.12.3 → 1.13.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 (250) hide show
  1. package/dist/agent/apply-agent-thinking.d.ts +2 -0
  2. package/dist/agent/apply-agent-thinking.js +41 -0
  3. package/dist/agent/apply-agent-thinking.js.map +1 -0
  4. package/dist/agent/instance-agent.js +10 -2
  5. package/dist/agent/instance-agent.js.map +1 -1
  6. package/dist/agent/sanitize-mcp-schemas.js +133 -125
  7. package/dist/agent/sanitize-mcp-schemas.js.map +1 -1
  8. package/dist/agent/shared-prompts.d.ts +0 -1
  9. package/dist/agent/shared-prompts.js +4 -11
  10. package/dist/agent/shared-prompts.js.map +1 -1
  11. package/dist/agent/sub-agent-debriefing.d.ts +4 -4
  12. package/dist/agent/system-prompt.js +3 -10
  13. package/dist/agent/system-prompt.js.map +1 -1
  14. package/dist/build.tsbuildinfo +1 -1
  15. package/dist/debug/run-debug-buffer.d.ts +63 -0
  16. package/dist/debug/run-debug-buffer.js +177 -0
  17. package/dist/debug/run-debug-buffer.js.map +1 -0
  18. package/dist/debug/sanitize-debug-snapshot.d.ts +2 -0
  19. package/dist/debug/sanitize-debug-snapshot.js +88 -0
  20. package/dist/debug/sanitize-debug-snapshot.js.map +1 -0
  21. package/dist/error-formatting.js +3 -5
  22. package/dist/error-formatting.js.map +1 -1
  23. package/dist/index.d.ts +5 -2
  24. package/dist/index.js +8 -3
  25. package/dist/index.js.map +1 -1
  26. package/dist/knowledge-base/build-templates-index.d.ts +1 -0
  27. package/dist/knowledge-base/build-templates-index.js +18 -2
  28. package/dist/knowledge-base/build-templates-index.js.map +1 -1
  29. package/dist/knowledge-base/materialize-knowledge-base.d.ts +2 -3
  30. package/dist/knowledge-base/materialize-knowledge-base.js +10 -7
  31. package/dist/knowledge-base/materialize-knowledge-base.js.map +1 -1
  32. package/dist/mcp/mcp-client-manager.d.ts +1 -1
  33. package/dist/mcp/mcp-client-manager.js +13 -9
  34. package/dist/mcp/mcp-client-manager.js.map +1 -1
  35. package/dist/runtime/memory-task-registry.d.ts +8 -0
  36. package/dist/runtime/memory-task-registry.js +42 -0
  37. package/dist/runtime/memory-task-registry.js.map +1 -0
  38. package/dist/runtime/resumable-stream-executor.d.ts +3 -0
  39. package/dist/runtime/resumable-stream-executor.js +171 -90
  40. package/dist/runtime/resumable-stream-executor.js.map +1 -1
  41. package/dist/runtime/run-state-registry.d.ts +2 -0
  42. package/dist/runtime/run-state-registry.js +3 -0
  43. package/dist/runtime/run-state-registry.js.map +1 -1
  44. package/dist/runtime/stream-runner.d.ts +3 -0
  45. package/dist/runtime/stream-runner.js +3 -0
  46. package/dist/runtime/stream-runner.js.map +1 -1
  47. package/dist/skills/materialize-runtime-skills.d.ts +3 -3
  48. package/dist/skills/materialize-runtime-skills.js +1 -1
  49. package/dist/skills/materialize-runtime-skills.js.map +1 -1
  50. package/dist/source-map-filter.js +0 -1
  51. package/dist/source-map-filter.js.map +1 -1
  52. package/dist/storage/terminal-outcome-storage.d.ts +2 -2
  53. package/dist/storage/workflow-loop-storage.d.ts +75 -4
  54. package/dist/stream/map-chunk.js +198 -237
  55. package/dist/stream/map-chunk.js.map +1 -1
  56. package/dist/stream/output-redaction.js +2 -2
  57. package/dist/stream/output-redaction.js.map +1 -1
  58. package/dist/stream/usage-accumulator.d.ts +90 -0
  59. package/dist/stream/usage-accumulator.js +89 -0
  60. package/dist/stream/usage-accumulator.js.map +1 -0
  61. package/dist/stream/work-summary-accumulator.d.ts +6 -6
  62. package/dist/tools/attachments/parse-file.tool.js +1 -1
  63. package/dist/tools/attachments/parse-file.tool.js.map +1 -1
  64. package/dist/tools/credentials.tool.js +4 -1
  65. package/dist/tools/credentials.tool.js.map +1 -1
  66. package/dist/tools/data-tables.tool.js +5 -2
  67. package/dist/tools/data-tables.tool.js.map +1 -1
  68. package/dist/tools/evals/column-ref-utils.d.ts +1 -2
  69. package/dist/tools/evals/column-ref-utils.js +19 -18
  70. package/dist/tools/evals/column-ref-utils.js.map +1 -1
  71. package/dist/tools/evals/describe-metric-for-workflow.service.js +7 -25
  72. package/dist/tools/evals/describe-metric-for-workflow.service.js.map +1 -1
  73. package/dist/tools/evals/detect-tool-refs.service.js +2 -1
  74. package/dist/tools/evals/detect-tool-refs.service.js.map +1 -1
  75. package/dist/tools/evals/eval-data-requirements.service.js +10 -9
  76. package/dist/tools/evals/eval-data-requirements.service.js.map +1 -1
  77. package/dist/tools/evals/evals.tool.js +2 -2
  78. package/dist/tools/evals/evals.tool.js.map +1 -1
  79. package/dist/tools/evals/extract-rows-from-history.service.js +8 -8
  80. package/dist/tools/evals/extract-rows-from-history.service.js.map +1 -1
  81. package/dist/tools/evals/generate-sample-rows.service.d.ts +2 -2
  82. package/dist/tools/evals/generate-sample-rows.service.js +30 -49
  83. package/dist/tools/evals/generate-sample-rows.service.js.map +1 -1
  84. package/dist/tools/evals/generate-tool-ref-pin-data.service.js +10 -23
  85. package/dist/tools/evals/generate-tool-ref-pin-data.service.js.map +1 -1
  86. package/dist/tools/evals/metric-catalog.js +3 -3
  87. package/dist/tools/evals/metric-catalog.js.map +1 -1
  88. package/dist/tools/executions.tool.js +10 -2
  89. package/dist/tools/executions.tool.js.map +1 -1
  90. package/dist/tools/filesystem/create-tools-from-mcp-server.d.ts +1 -1
  91. package/dist/tools/filesystem/create-tools-from-mcp-server.js +8 -10
  92. package/dist/tools/filesystem/create-tools-from-mcp-server.js.map +1 -1
  93. package/dist/tools/index.js +1 -1
  94. package/dist/tools/index.js.map +1 -1
  95. package/dist/tools/nodes/node-search-engine.js +21 -42
  96. package/dist/tools/nodes/node-search-engine.js.map +1 -1
  97. package/dist/tools/nodes/node-search-engine.types.d.ts +2 -0
  98. package/dist/tools/nodes/preferred-chat-model.d.ts +1 -0
  99. package/dist/tools/nodes/preferred-chat-model.js +19 -0
  100. package/dist/tools/nodes/preferred-chat-model.js.map +1 -0
  101. package/dist/tools/nodes/suggested-nodes-data.js +13 -3
  102. package/dist/tools/nodes/suggested-nodes-data.js.map +1 -1
  103. package/dist/tools/nodes.tool.js +32 -7
  104. package/dist/tools/nodes.tool.js.map +1 -1
  105. package/dist/tools/orchestration/complete-checkpoint.tool.js +3 -5
  106. package/dist/tools/orchestration/complete-checkpoint.tool.js.map +1 -1
  107. package/dist/tools/orchestration/eval-data-agent.tool.js +2 -1
  108. package/dist/tools/orchestration/eval-data-agent.tool.js.map +1 -1
  109. package/dist/tools/orchestration/eval-setup-agent.prompt.d.ts +1 -1
  110. package/dist/tools/orchestration/eval-setup-agent.prompt.js +3 -3
  111. package/dist/tools/orchestration/report-verification-verdict.tool.d.ts +2 -2
  112. package/dist/tools/orchestration/report-verification-verdict.tool.js +1 -1
  113. package/dist/tools/orchestration/report-verification-verdict.tool.js.map +1 -1
  114. package/dist/tools/orchestration/verify-built-workflow.tool.js +320 -307
  115. package/dist/tools/orchestration/verify-built-workflow.tool.js.map +1 -1
  116. package/dist/tools/research.tool.js +1 -1
  117. package/dist/tools/research.tool.js.map +1 -1
  118. package/dist/tools/shared/ask-user.tool.d.ts +4 -4
  119. package/dist/tools/shared/ask-user.tool.js +6 -1
  120. package/dist/tools/shared/ask-user.tool.js.map +1 -1
  121. package/dist/tools/tool-ids.d.ts +0 -1
  122. package/dist/tools/tool-ids.js +0 -1
  123. package/dist/tools/tool-ids.js.map +1 -1
  124. package/dist/tools/workflows/build-workflow.tool.d.ts +4 -22
  125. package/dist/tools/workflows/build-workflow.tool.js +373 -317
  126. package/dist/tools/workflows/build-workflow.tool.js.map +1 -1
  127. package/dist/tools/workflows/classify-node-destructiveness.service.d.ts +7 -0
  128. package/dist/tools/workflows/classify-node-destructiveness.service.js +307 -0
  129. package/dist/tools/workflows/classify-node-destructiveness.service.js.map +1 -0
  130. package/dist/tools/workflows/generate-simulation-fixtures.service.d.ts +8 -0
  131. package/dist/tools/workflows/generate-simulation-fixtures.service.js +95 -0
  132. package/dist/tools/workflows/generate-simulation-fixtures.service.js.map +1 -0
  133. package/dist/tools/workflows/plan-verification-simulation.d.ts +15 -0
  134. package/dist/tools/workflows/plan-verification-simulation.js +32 -0
  135. package/dist/tools/workflows/plan-verification-simulation.js.map +1 -0
  136. package/dist/tools/workflows/resolve-credentials.d.ts +0 -2
  137. package/dist/tools/workflows/resolve-credentials.js +0 -13
  138. package/dist/tools/workflows/resolve-credentials.js.map +1 -1
  139. package/dist/tools/workflows/setup-workflow.service.js +259 -215
  140. package/dist/tools/workflows/setup-workflow.service.js.map +1 -1
  141. package/dist/tools/workflows/validate-workflow.service.js +81 -66
  142. package/dist/tools/workflows/validate-workflow.service.js.map +1 -1
  143. package/dist/tools/workflows/workflow-build-context.d.ts +33 -0
  144. package/dist/tools/workflows/workflow-build-context.js +80 -0
  145. package/dist/tools/workflows/workflow-build-context.js.map +1 -0
  146. package/dist/tools/workflows/workflow-build-remediation.d.ts +11 -0
  147. package/dist/tools/workflows/workflow-build-remediation.js +89 -0
  148. package/dist/tools/workflows/workflow-build-remediation.js.map +1 -0
  149. package/dist/tools/workflows/workflow-build-reporting.d.ts +19 -0
  150. package/dist/tools/workflows/workflow-build-reporting.js +78 -0
  151. package/dist/tools/workflows/workflow-build-reporting.js.map +1 -0
  152. package/dist/tools/workflows/workflow-build-routing.d.ts +2 -0
  153. package/dist/tools/workflows/workflow-build-routing.js +83 -0
  154. package/dist/tools/workflows/workflow-build-routing.js.map +1 -0
  155. package/dist/tools/workflows/workflow-build-telemetry.d.ts +18 -0
  156. package/dist/tools/workflows/workflow-build-telemetry.js +33 -0
  157. package/dist/tools/workflows/workflow-build-telemetry.js.map +1 -0
  158. package/dist/tools/workflows/workflow-file-bindings.d.ts +28 -0
  159. package/dist/tools/workflows/workflow-file-bindings.js +104 -0
  160. package/dist/tools/workflows/workflow-file-bindings.js.map +1 -0
  161. package/dist/tools/workflows/workflow-json-utils.d.ts +3 -0
  162. package/dist/tools/workflows/workflow-json-utils.js +54 -5
  163. package/dist/tools/workflows/workflow-json-utils.js.map +1 -1
  164. package/dist/tools/workflows/workflow-source-compiler.d.ts +19 -0
  165. package/dist/tools/workflows/workflow-source-compiler.js +217 -0
  166. package/dist/tools/workflows/workflow-source-compiler.js.map +1 -0
  167. package/dist/tools/workflows/workflow-validation-warnings.d.ts +14 -0
  168. package/dist/tools/workflows/workflow-validation-warnings.js +28 -0
  169. package/dist/tools/workflows/workflow-validation-warnings.js.map +1 -0
  170. package/dist/tools/workflows.tool.js +107 -99
  171. package/dist/tools/workflows.tool.js.map +1 -1
  172. package/dist/tracing/langsmith-tracing.js +7 -7
  173. package/dist/tracing/langsmith-tracing.js.map +1 -1
  174. package/dist/tracing/trace-payloads.d.ts +2 -1
  175. package/dist/tracing/trace-payloads.js +152 -114
  176. package/dist/tracing/trace-payloads.js.map +1 -1
  177. package/dist/types.d.ts +24 -4
  178. package/dist/types.js.map +1 -1
  179. package/dist/utils/eval-agents.d.ts +0 -3
  180. package/dist/utils/eval-agents.js +3 -11
  181. package/dist/utils/eval-agents.js.map +1 -1
  182. package/dist/utils/generate-validated-json.d.ts +16 -0
  183. package/dist/utils/generate-validated-json.js +38 -0
  184. package/dist/utils/generate-validated-json.js.map +1 -0
  185. package/dist/utils/stream-helpers.d.ts +0 -1
  186. package/dist/utils/stream-helpers.js +5 -8
  187. package/dist/utils/stream-helpers.js.map +1 -1
  188. package/dist/workflow-builder/build-failure-tracker.js +25 -1
  189. package/dist/workflow-builder/build-failure-tracker.js.map +1 -1
  190. package/dist/workflow-builder/index.d.ts +0 -4
  191. package/dist/workflow-builder/index.js +1 -11
  192. package/dist/workflow-builder/index.js.map +1 -1
  193. package/dist/workflow-loop/guidance.js +14 -15
  194. package/dist/workflow-loop/guidance.js.map +1 -1
  195. package/dist/workflow-loop/runtime.js +1 -0
  196. package/dist/workflow-loop/runtime.js.map +1 -1
  197. package/dist/workflow-loop/verification-obligation.js +8 -1
  198. package/dist/workflow-loop/verification-obligation.js.map +1 -1
  199. package/dist/workflow-loop/workflow-loop-controller.js +17 -1
  200. package/dist/workflow-loop/workflow-loop-controller.js.map +1 -1
  201. package/dist/workflow-loop/workflow-loop-state.d.ts +90 -6
  202. package/dist/workflow-loop/workflow-loop-state.js +13 -1
  203. package/dist/workflow-loop/workflow-loop-state.js.map +1 -1
  204. package/dist/workspace/builder-templates-service.d.ts +5 -5
  205. package/dist/workspace/builder-templates-service.js +17 -14
  206. package/dist/workspace/builder-templates-service.js.map +1 -1
  207. package/dist/workspace/create-workspace.js +8 -1
  208. package/dist/workspace/create-workspace.js.map +1 -1
  209. package/dist/workspace/prebaked-workspace-bundle.d.ts +2 -2
  210. package/dist/workspace/prebaked-workspace-bundle.js +5 -5
  211. package/dist/workspace/prebaked-workspace-bundle.js.map +1 -1
  212. package/dist/workspace/sandbox-setup.d.ts +1 -1
  213. package/dist/workspace/sandbox-setup.js +10 -37
  214. package/dist/workspace/sandbox-setup.js.map +1 -1
  215. package/dist/workspace/snapshot-manager.d.ts +1 -1
  216. package/dist/workspace/template-telemetry.js +2 -5
  217. package/dist/workspace/template-telemetry.js.map +1 -1
  218. package/dist/workspace/workspace-files.d.ts +1 -1
  219. package/dist/workspace/workspace-files.js +3 -3
  220. package/dist/workspace/workspace-files.js.map +1 -1
  221. package/dist/workspace/workspace-manifest.js +2 -2
  222. package/dist/workspace/workspace-manifest.js.map +1 -1
  223. package/dist/workspace/workspace-paths.d.ts +4 -0
  224. package/dist/workspace/workspace-paths.js +25 -0
  225. package/dist/workspace/workspace-paths.js.map +1 -0
  226. package/knowledge-base/reference/open-ai-output-shape.md +79 -0
  227. package/knowledge-base/reference/workflow-builder-guardrails.md +15 -0
  228. package/package.json +13 -12
  229. package/skills/planned-task-runtime/SKILL.md +3 -2
  230. package/skills/planning/SKILL.md +5 -0
  231. package/skills/post-build-flow/SKILL.md +25 -9
  232. package/skills/workflow-builder/SKILL.md +89 -134
  233. package/dist/tools/workflows/submit-workflow-identity.d.ts +0 -39
  234. package/dist/tools/workflows/submit-workflow-identity.js +0 -181
  235. package/dist/tools/workflows/submit-workflow-identity.js.map +0 -1
  236. package/dist/tools/workflows/submit-workflow.tool.d.ts +0 -223
  237. package/dist/tools/workflows/submit-workflow.tool.js +0 -491
  238. package/dist/tools/workflows/submit-workflow.tool.js.map +0 -1
  239. package/dist/workflow-builder/extract-code.d.ts +0 -5
  240. package/dist/workflow-builder/extract-code.js +0 -105
  241. package/dist/workflow-builder/extract-code.js.map +0 -1
  242. package/dist/workflow-builder/parse-validate.d.ts +0 -10
  243. package/dist/workflow-builder/parse-validate.js +0 -50
  244. package/dist/workflow-builder/parse-validate.js.map +0 -1
  245. package/dist/workflow-builder/patch-code.d.ts +0 -14
  246. package/dist/workflow-builder/patch-code.js +0 -117
  247. package/dist/workflow-builder/patch-code.js.map +0 -1
  248. package/dist/workflow-builder/types.d.ts +0 -11
  249. package/dist/workflow-builder/types.js +0 -3
  250. package/dist/workflow-builder/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-credentials.js","sourceRoot":"","sources":["../../../src/tools/workflows/resolve-credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-credentials.js","sourceRoot":"","sources":["../../../src/tools/workflows/resolve-credentials.ts"],"names":[],"mappings":"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"}
@@ -40,7 +40,7 @@ async function getValidCredentialTypes(context, node) {
40
40
  types.add(t);
41
41
  }
42
42
  catch (error) {
43
- context.logger?.warn('[setup-workflow] getNodeCredentialTypes threw during credential validation', {
43
+ context.logger.warn('[setup-workflow] getNodeCredentialTypes threw during credential validation', {
44
44
  nodeType: node.type,
45
45
  typeVersion,
46
46
  error: error instanceof Error ? error.message : String(error),
@@ -86,21 +86,7 @@ async function stripStaleCredentialsFromNode(context, node, preserveTypes) {
86
86
  async function stripStaleCredentialsFromWorkflow(context, json) {
87
87
  await Promise.all((json.nodes ?? []).map(async (node) => await stripStaleCredentialsFromNode(context, node)));
88
88
  }
89
- async function buildSetupRequests(context, node, triggerTestResult, cache, workflowId) {
90
- if (!node.name)
91
- return [];
92
- if (node.disabled)
93
- return [];
94
- const typeVersion = node.typeVersion ?? 1;
95
- const parameters = node.parameters ?? {};
96
- const nodeDesc = await context.nodeService
97
- .getDescription(node.type, typeVersion)
98
- .catch(() => undefined);
99
- const isTrigger = nodeDesc?.group?.includes('trigger') ?? false;
100
- const isTestable = isTrigger &&
101
- ((nodeDesc?.webhooks !== undefined && nodeDesc.webhooks.length > 0) ||
102
- nodeDesc?.polling === true ||
103
- nodeDesc?.triggerPanel !== undefined);
89
+ async function computeParameterIssues(context, node, parameters, typeVersion) {
104
90
  let parameterIssues = {};
105
91
  if (context.nodeService.getParameterIssues) {
106
92
  parameterIssues = await context.nodeService
@@ -119,27 +105,32 @@ async function buildSetupRequests(context, node, triggerTestResult, cache, workf
119
105
  }
120
106
  }
121
107
  }
122
- let editableParameters;
123
- if (Object.keys(parameterIssues).length > 0 && nodeDesc?.properties) {
124
- editableParameters = [];
125
- for (const paramName of Object.keys(parameterIssues)) {
126
- const prop = nodeDesc.properties.find((p) => p.name === paramName);
127
- if (!prop)
128
- continue;
129
- editableParameters.push({
130
- name: prop.name,
131
- displayName: prop.displayName,
132
- type: prop.type,
133
- ...(prop.required !== undefined ? { required: prop.required } : {}),
134
- ...(prop.default !== undefined ? { default: prop.default } : {}),
135
- ...(prop.options
136
- ? {
137
- options: prop.options,
138
- }
139
- : {}),
140
- });
141
- }
108
+ return parameterIssues;
109
+ }
110
+ function buildEditableParameters(parameterIssues, nodeDesc) {
111
+ if (Object.keys(parameterIssues).length === 0 || !nodeDesc?.properties)
112
+ return undefined;
113
+ const editableParameters = [];
114
+ for (const paramName of Object.keys(parameterIssues)) {
115
+ const prop = nodeDesc.properties.find((p) => p.name === paramName);
116
+ if (!prop)
117
+ continue;
118
+ editableParameters.push({
119
+ name: prop.name,
120
+ displayName: prop.displayName,
121
+ type: prop.type,
122
+ ...(prop.required !== undefined ? { required: prop.required } : {}),
123
+ ...(prop.default !== undefined ? { default: prop.default } : {}),
124
+ ...(prop.options
125
+ ? {
126
+ options: prop.options,
127
+ }
128
+ : {}),
129
+ });
142
130
  }
131
+ return editableParameters;
132
+ }
133
+ async function resolveCredentialTypes(context, node, parameters, typeVersion, nodeDesc) {
143
134
  let credentialTypes = [];
144
135
  if (context.nodeService.getNodeCredentialTypes) {
145
136
  credentialTypes = await context.nodeService
@@ -167,156 +158,202 @@ async function buildSetupRequests(context, node, triggerTestResult, cache, workf
167
158
  credentialTypes = [parameters.nodeCredentialType];
168
159
  }
169
160
  }
161
+ return credentialTypes;
162
+ }
163
+ async function resolveCredentialState(context, node, credentialType, cache, workflowId) {
164
+ const cacheKey = listCacheKey(workflowId, credentialType);
165
+ let listPromise = cache?.lists.get(cacheKey);
166
+ if (!listPromise) {
167
+ listPromise = context.credentialService
168
+ .list({ type: credentialType, ...(workflowId ? { workflowId } : {}) })
169
+ .then((creds) => creds.map((c) => ({ id: c.id, name: c.name })));
170
+ cache?.lists.set(cacheKey, listPromise);
171
+ }
172
+ const sortedCreds = await listPromise;
173
+ const existingCredentials = sortedCreds.map((c) => ({ id: c.id, name: c.name }));
174
+ const existingOnNode = node.credentials?.[credentialType];
175
+ const isAutoApplied = !existingOnNode?.id && existingCredentials.length === 1;
176
+ const credToTest = existingOnNode?.id ?? (isAutoApplied ? existingCredentials[0]?.id : undefined);
177
+ if (!credToTest)
178
+ return { existingCredentials, isAutoApplied };
179
+ let testabilityPromise = cache?.testability.get(credentialType);
180
+ if (!testabilityPromise) {
181
+ testabilityPromise = context.credentialService.isTestable
182
+ ? context.credentialService.isTestable(credentialType).catch(() => true)
183
+ : Promise.resolve(true);
184
+ cache?.testability.set(credentialType, testabilityPromise);
185
+ }
186
+ const canTest = await testabilityPromise;
187
+ if (!canTest)
188
+ return { existingCredentials, isAutoApplied };
189
+ let testPromise = cache?.tests.get(credToTest);
190
+ if (!testPromise) {
191
+ testPromise = context.credentialService.test(credToTest).catch((testError) => ({
192
+ success: false,
193
+ message: testError instanceof Error ? testError.message : 'Test failed',
194
+ }));
195
+ cache?.tests.set(credToTest, testPromise);
196
+ }
197
+ const credentialTestResult = await testPromise;
198
+ return { existingCredentials, isAutoApplied, credentialTestResult };
199
+ }
200
+ function buildRequestCredentials(nodeCredentials, isAutoApplied, credentialType, existingCredentials) {
201
+ const autoCredential = isAutoApplied && credentialType && existingCredentials.length > 0
202
+ ? { [credentialType]: { id: existingCredentials[0].id, name: existingCredentials[0].name } }
203
+ : undefined;
204
+ if (nodeCredentials && Object.keys(nodeCredentials).length > 0) {
205
+ return {
206
+ credentials: (autoCredential
207
+ ? { ...nodeCredentials, ...autoCredential }
208
+ : nodeCredentials),
209
+ };
210
+ }
211
+ return autoCredential ? { credentials: autoCredential } : {};
212
+ }
213
+ async function resolveAppliedCredentialState(context, node, credentialType, cache, workflowId, nodeCredentials) {
214
+ if (!credentialType) {
215
+ return { existingCredentials: [], isAutoApplied: false };
216
+ }
217
+ const state = await resolveCredentialState(context, node, credentialType, cache, workflowId);
218
+ if (state.isAutoApplied && nodeCredentials) {
219
+ nodeCredentials[credentialType] = {
220
+ id: state.existingCredentials[0].id,
221
+ name: state.existingCredentials[0].name,
222
+ };
223
+ }
224
+ return state;
225
+ }
226
+ async function buildRequestForCredentialType(context, node, credentialType, cache, workflowId, nodeCtx) {
227
+ const nodeCredentials = node.credentials
228
+ ? Object.fromEntries(Object.entries(node.credentials)
229
+ .filter(([, v]) => v.id !== undefined)
230
+ .map(([k, v]) => [k, { id: v.id, name: v.name }]))
231
+ : undefined;
232
+ const { existingCredentials, isAutoApplied, credentialTestResult } = await resolveAppliedCredentialState(context, node, credentialType, cache, workflowId, nodeCredentials);
233
+ const { isTrigger, isTestable, hasParamIssues } = nodeCtx;
234
+ if (!credentialType && !isTrigger && !hasParamIssues)
235
+ return null;
236
+ if (!credentialType && isTrigger && !isTestable && !hasParamIssues)
237
+ return null;
238
+ let needsAction = false;
239
+ if (credentialType) {
240
+ const existingOnNode = node.credentials?.[credentialType];
241
+ const hasValidCredential = existingOnNode?.id !== undefined &&
242
+ (credentialTestResult === undefined || credentialTestResult.success);
243
+ needsAction = !hasValidCredential;
244
+ }
245
+ if (hasParamIssues) {
246
+ needsAction = true;
247
+ }
248
+ return {
249
+ node: {
250
+ name: nodeCtx.nodeName,
251
+ type: node.type,
252
+ typeVersion: nodeCtx.typeVersion,
253
+ parameters: nodeCtx.parameters,
254
+ position: nodeCtx.nodePosition,
255
+ id: nodeCtx.nodeId,
256
+ ...buildRequestCredentials(nodeCredentials, isAutoApplied, credentialType, existingCredentials),
257
+ },
258
+ ...(credentialType ? { credentialType } : {}),
259
+ ...(existingCredentials.length > 0 ? { existingCredentials } : {}),
260
+ isTrigger,
261
+ ...(isTestable ? { isTestable } : {}),
262
+ ...(isAutoApplied ? { isAutoApplied } : {}),
263
+ ...(credentialTestResult ? { credentialTestResult } : {}),
264
+ ...(nodeCtx.triggerTestResult ? { triggerTestResult: nodeCtx.triggerTestResult } : {}),
265
+ ...(hasParamIssues ? { parameterIssues: nodeCtx.parameterIssues } : {}),
266
+ ...(nodeCtx.editableParameters && nodeCtx.editableParameters.length > 0
267
+ ? { editableParameters: nodeCtx.editableParameters }
268
+ : {}),
269
+ needsAction,
270
+ };
271
+ }
272
+ async function buildSetupRequests(context, node, triggerTestResult, cache, workflowId) {
273
+ if (!node.name)
274
+ return [];
275
+ if (node.disabled)
276
+ return [];
277
+ const typeVersion = node.typeVersion ?? 1;
278
+ const parameters = node.parameters ?? {};
279
+ const nodeDesc = await context.nodeService
280
+ .getDescription(node.type, typeVersion)
281
+ .catch(() => undefined);
282
+ const isTrigger = nodeDesc?.group?.includes('trigger') ?? false;
283
+ const isTestable = isTrigger &&
284
+ ((nodeDesc?.webhooks !== undefined && nodeDesc.webhooks.length > 0) ||
285
+ nodeDesc?.polling === true ||
286
+ nodeDesc?.triggerPanel !== undefined);
287
+ const parameterIssues = await computeParameterIssues(context, node, parameters, typeVersion);
288
+ const editableParameters = buildEditableParameters(parameterIssues, nodeDesc);
289
+ const credentialTypes = await resolveCredentialTypes(context, node, parameters, typeVersion, nodeDesc);
170
290
  const nodeId = node.id ?? (0, nanoid_1.nanoid)();
171
291
  const nodePosition = node.position ?? [0, 0];
172
292
  const hasParamIssues = Object.keys(parameterIssues).length > 0;
173
293
  const requests = [];
174
294
  const processedCredTypes = credentialTypes.length > 0 ? credentialTypes : [undefined];
295
+ const nodeCtx = {
296
+ nodeName: node.name,
297
+ isTrigger,
298
+ isTestable,
299
+ hasParamIssues,
300
+ parameterIssues,
301
+ editableParameters,
302
+ triggerTestResult,
303
+ nodeId,
304
+ nodePosition,
305
+ typeVersion,
306
+ parameters,
307
+ };
175
308
  for (const credentialType of processedCredTypes) {
176
- let existingCredentials = [];
177
- let isAutoApplied = false;
178
- let credentialTestResult;
179
- const nodeCredentials = node.credentials
180
- ? Object.fromEntries(Object.entries(node.credentials)
181
- .filter(([, v]) => v.id !== undefined)
182
- .map(([k, v]) => [k, { id: v.id, name: v.name }]))
183
- : undefined;
184
- if (credentialType) {
185
- const cacheKey = listCacheKey(workflowId, credentialType);
186
- let listPromise = cache?.lists.get(cacheKey);
187
- if (!listPromise) {
188
- listPromise = context.credentialService
189
- .list({ type: credentialType, ...(workflowId ? { workflowId } : {}) })
190
- .then((creds) => creds.map((c) => ({ id: c.id, name: c.name })));
191
- cache?.lists.set(cacheKey, listPromise);
192
- }
193
- const sortedCreds = await listPromise;
194
- existingCredentials = sortedCreds.map((c) => ({ id: c.id, name: c.name }));
195
- const existingOnNode = node.credentials?.[credentialType];
196
- if (!existingOnNode?.id && existingCredentials.length === 1) {
197
- isAutoApplied = true;
198
- if (nodeCredentials) {
199
- nodeCredentials[credentialType] = {
200
- id: existingCredentials[0].id,
201
- name: existingCredentials[0].name,
202
- };
203
- }
204
- }
205
- const credToTest = existingOnNode?.id ?? (isAutoApplied ? existingCredentials[0]?.id : undefined);
206
- if (credToTest) {
207
- let testabilityPromise = cache?.testability.get(credentialType);
208
- if (!testabilityPromise) {
209
- testabilityPromise = context.credentialService.isTestable
210
- ? context.credentialService.isTestable(credentialType).catch(() => true)
211
- : Promise.resolve(true);
212
- cache?.testability.set(credentialType, testabilityPromise);
213
- }
214
- const canTest = await testabilityPromise;
215
- if (canTest) {
216
- let testPromise = cache?.tests.get(credToTest);
217
- if (!testPromise) {
218
- testPromise = context.credentialService.test(credToTest).catch((testError) => ({
219
- success: false,
220
- message: testError instanceof Error ? testError.message : 'Test failed',
221
- }));
222
- cache?.tests.set(credToTest, testPromise);
223
- }
224
- credentialTestResult = await testPromise;
225
- }
226
- }
227
- }
228
- if (!credentialType && !isTrigger && !hasParamIssues)
229
- continue;
230
- if (!credentialType && isTrigger && !isTestable && !hasParamIssues)
309
+ const request = await buildRequestForCredentialType(context, node, credentialType, cache, workflowId, nodeCtx);
310
+ if (request)
311
+ requests.push(request);
312
+ }
313
+ return requests;
314
+ }
315
+ function addConnectionEdge(mainOutgoing, nonMainIncoming, sourceName, connType, conn) {
316
+ if (typeof conn !== 'object' || conn === null || !('node' in conn))
317
+ return;
318
+ const destName = conn.node;
319
+ if (connType === 'main') {
320
+ const existing = mainOutgoing.get(sourceName) ?? [];
321
+ if (!existing.includes(destName))
322
+ existing.push(destName);
323
+ mainOutgoing.set(sourceName, existing);
324
+ }
325
+ else {
326
+ const existing = nonMainIncoming.get(destName) ?? [];
327
+ if (!existing.includes(sourceName))
328
+ existing.push(sourceName);
329
+ nonMainIncoming.set(destName, existing);
330
+ }
331
+ }
332
+ function addSourceConnections(sourceName, nodeConns, mainOutgoing, nonMainIncoming) {
333
+ for (const [connType, outputs] of Object.entries(nodeConns)) {
334
+ if (!Array.isArray(outputs))
231
335
  continue;
232
- let needsAction = false;
233
- if (credentialType) {
234
- const existingOnNode = node.credentials?.[credentialType];
235
- const hasValidCredential = existingOnNode?.id !== undefined &&
236
- (credentialTestResult === undefined || credentialTestResult.success);
237
- needsAction = !hasValidCredential;
238
- }
239
- if (hasParamIssues) {
240
- needsAction = true;
336
+ for (const slot of outputs) {
337
+ if (!Array.isArray(slot))
338
+ continue;
339
+ for (const conn of slot) {
340
+ addConnectionEdge(mainOutgoing, nonMainIncoming, sourceName, connType, conn);
341
+ }
241
342
  }
242
- const request = {
243
- node: {
244
- name: node.name,
245
- type: node.type,
246
- typeVersion,
247
- parameters,
248
- position: nodePosition,
249
- id: nodeId,
250
- ...(nodeCredentials && Object.keys(nodeCredentials).length > 0
251
- ? {
252
- credentials: isAutoApplied && credentialType && existingCredentials.length > 0
253
- ? {
254
- ...nodeCredentials,
255
- [credentialType]: {
256
- id: existingCredentials[0].id,
257
- name: existingCredentials[0].name,
258
- },
259
- }
260
- : nodeCredentials,
261
- }
262
- : isAutoApplied && credentialType && existingCredentials.length > 0
263
- ? {
264
- credentials: {
265
- [credentialType]: {
266
- id: existingCredentials[0].id,
267
- name: existingCredentials[0].name,
268
- },
269
- },
270
- }
271
- : {}),
272
- },
273
- ...(credentialType ? { credentialType } : {}),
274
- ...(existingCredentials.length > 0 ? { existingCredentials } : {}),
275
- isTrigger,
276
- ...(isTestable ? { isTestable } : {}),
277
- ...(isAutoApplied ? { isAutoApplied } : {}),
278
- ...(credentialTestResult ? { credentialTestResult } : {}),
279
- ...(triggerTestResult ? { triggerTestResult } : {}),
280
- ...(hasParamIssues ? { parameterIssues } : {}),
281
- ...(editableParameters && editableParameters.length > 0 ? { editableParameters } : {}),
282
- needsAction,
283
- };
284
- requests.push(request);
285
343
  }
286
- return requests;
287
344
  }
288
- function sortByExecutionOrder(requests, connections) {
345
+ function buildConnectionAdjacency(connections) {
289
346
  const mainOutgoing = new Map();
290
347
  const nonMainIncoming = new Map();
291
348
  for (const [sourceName, nodeConns] of Object.entries(connections)) {
292
349
  if (typeof nodeConns !== 'object' || nodeConns === null)
293
350
  continue;
294
- for (const [connType, outputs] of Object.entries(nodeConns)) {
295
- if (!Array.isArray(outputs))
296
- continue;
297
- for (const slot of outputs) {
298
- if (!Array.isArray(slot))
299
- continue;
300
- for (const conn of slot) {
301
- if (typeof conn !== 'object' || conn === null || !('node' in conn))
302
- continue;
303
- const destName = conn.node;
304
- if (connType === 'main') {
305
- const existing = mainOutgoing.get(sourceName) ?? [];
306
- if (!existing.includes(destName))
307
- existing.push(destName);
308
- mainOutgoing.set(sourceName, existing);
309
- }
310
- else {
311
- const existing = nonMainIncoming.get(destName) ?? [];
312
- if (!existing.includes(sourceName))
313
- existing.push(sourceName);
314
- nonMainIncoming.set(destName, existing);
315
- }
316
- }
317
- }
318
- }
351
+ addSourceConnections(sourceName, nodeConns, mainOutgoing, nonMainIncoming);
319
352
  }
353
+ return { mainOutgoing, nonMainIncoming };
354
+ }
355
+ function sortByExecutionOrder(requests, connections) {
356
+ const { mainOutgoing, nonMainIncoming } = buildConnectionAdjacency(connections);
320
357
  const triggerRequests = requests
321
358
  .filter((r) => r.isTrigger)
322
359
  .sort((a, b) => a.node.position[0] - b.node.position[0]);
@@ -441,6 +478,51 @@ async function applyNodeParameters(context, workflowId, nodeParameters) {
441
478
  }
442
479
  return result;
443
480
  }
481
+ async function applyCredentialsToNode(context, node, nodeName, credsMap, result) {
482
+ let nodeSucceeded = true;
483
+ for (const [credType, credId] of Object.entries(credsMap)) {
484
+ try {
485
+ const cred = await context.credentialService.get(credId);
486
+ if (cred) {
487
+ node.credentials = {
488
+ ...node.credentials,
489
+ [credType]: { id: cred.id, name: cred.name },
490
+ };
491
+ }
492
+ else {
493
+ nodeSucceeded = false;
494
+ result.failed.push({
495
+ nodeName,
496
+ error: `Credential ${credId} (type: ${credType}) not found — it may have been deleted`,
497
+ });
498
+ }
499
+ }
500
+ catch (error) {
501
+ nodeSucceeded = false;
502
+ result.failed.push({
503
+ nodeName,
504
+ error: `Failed to resolve credential ${credId} (type: ${credType}): ${error instanceof Error ? error.message : 'Unknown error'}`,
505
+ });
506
+ }
507
+ }
508
+ return nodeSucceeded;
509
+ }
510
+ function applyParametersToNode(node, nodeName, params, result) {
511
+ try {
512
+ node.parameters = {
513
+ ...(node.parameters ?? {}),
514
+ ...params,
515
+ };
516
+ return true;
517
+ }
518
+ catch (error) {
519
+ result.failed.push({
520
+ nodeName,
521
+ error: `Failed to merge parameters: ${error instanceof Error ? error.message : 'Unknown error'}`,
522
+ });
523
+ return false;
524
+ }
525
+ }
444
526
  async function applyNodeChanges(context, workflowId, nodeCredentials, nodeParameters) {
445
527
  const result = { applied: [], failed: [] };
446
528
  const workflowJson = await context.workflowService.getAsWorkflowJSON(workflowId);
@@ -448,52 +530,14 @@ async function applyNodeChanges(context, workflowId, nodeCredentials, nodeParame
448
530
  for (const node of workflowJson.nodes) {
449
531
  if (!node.name)
450
532
  continue;
451
- const credsMap = nodeCredentials?.[node.name];
452
- if (credsMap) {
453
- let nodeSucceeded = true;
454
- for (const [credType, credId] of Object.entries(credsMap)) {
455
- try {
456
- const cred = await context.credentialService.get(credId);
457
- if (cred) {
458
- node.credentials = {
459
- ...node.credentials,
460
- [credType]: { id: cred.id, name: cred.name },
461
- };
462
- }
463
- else {
464
- nodeSucceeded = false;
465
- result.failed.push({
466
- nodeName: node.name,
467
- error: `Credential ${credId} (type: ${credType}) not found — it may have been deleted`,
468
- });
469
- }
470
- }
471
- catch (error) {
472
- nodeSucceeded = false;
473
- result.failed.push({
474
- nodeName: node.name,
475
- error: `Failed to resolve credential ${credId} (type: ${credType}): ${error instanceof Error ? error.message : 'Unknown error'}`,
476
- });
477
- }
478
- }
479
- if (nodeSucceeded)
480
- appliedNodes.add(node.name);
533
+ const nodeName = node.name;
534
+ const credsMap = nodeCredentials?.[nodeName];
535
+ if (credsMap && (await applyCredentialsToNode(context, node, nodeName, credsMap, result))) {
536
+ appliedNodes.add(nodeName);
481
537
  }
482
- const params = nodeParameters?.[node.name];
483
- if (params) {
484
- try {
485
- node.parameters = {
486
- ...(node.parameters ?? {}),
487
- ...params,
488
- };
489
- appliedNodes.add(node.name);
490
- }
491
- catch (error) {
492
- result.failed.push({
493
- nodeName: node.name,
494
- error: `Failed to merge parameters: ${error instanceof Error ? error.message : 'Unknown error'}`,
495
- });
496
- }
538
+ const params = nodeParameters?.[nodeName];
539
+ if (params && applyParametersToNode(node, nodeName, params, result)) {
540
+ appliedNodes.add(nodeName);
497
541
  }
498
542
  const appliedTypes = new Set(credsMap ? Object.keys(credsMap) : []);
499
543
  await stripStaleCredentialsFromNode(context, node, appliedTypes);