@openapi-flow/n8n 0.0.0-stage → 0.3.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 (332) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -2
  3. package/THIRD_PARTY_NOTICES.md +9 -0
  4. package/dist/legacy/workflow/common/plan-validation.d.ts +1 -0
  5. package/dist/legacy/workflow/common/plan-validation.js +11 -0
  6. package/dist/legacy/workflow/common/workflow-id.d.ts +1 -0
  7. package/dist/legacy/workflow/common/workflow-id.js +8 -0
  8. package/dist/legacy/workflow/inbound/build-inbound-workflow.d.ts +2 -0
  9. package/dist/legacy/workflow/inbound/build-inbound-workflow.js +60 -0
  10. package/dist/legacy/workflow/inbound/compile-inbound-workflow.d.ts +2 -0
  11. package/dist/legacy/workflow/inbound/compile-inbound-workflow.js +25 -0
  12. package/dist/legacy/workflow/inbound/inbound-response.d.ts +2 -0
  13. package/dist/legacy/workflow/inbound/inbound-response.js +51 -0
  14. package/dist/legacy/workflow/request/base-url.d.ts +1 -0
  15. package/dist/legacy/workflow/request/base-url.js +14 -0
  16. package/dist/legacy/workflow/request/build-request-workflow.d.ts +3 -0
  17. package/dist/legacy/workflow/request/build-request-workflow.js +47 -0
  18. package/dist/legacy/workflow/request/build-sequence-workflow.d.ts +3 -0
  19. package/dist/legacy/workflow/request/build-sequence-workflow.js +53 -0
  20. package/dist/legacy/workflow/request/compile-catalog-sequence.d.ts +2 -0
  21. package/dist/legacy/workflow/request/compile-catalog-sequence.js +122 -0
  22. package/dist/legacy/workflow/request/compile-sequence.d.ts +2 -0
  23. package/dist/legacy/workflow/request/compile-sequence.js +41 -0
  24. package/dist/legacy/workflow/request/compile-workflow.d.ts +4 -0
  25. package/dist/legacy/workflow/request/compile-workflow.js +93 -0
  26. package/dist/legacy/workflow/request/credential-binding.d.ts +5 -0
  27. package/dist/legacy/workflow/request/credential-binding.js +31 -0
  28. package/dist/legacy/workflow/request/effect-policy.d.ts +4 -0
  29. package/dist/legacy/workflow/request/effect-policy.js +16 -0
  30. package/dist/legacy/workflow/request/http-request-node.d.ts +2 -0
  31. package/dist/legacy/workflow/request/http-request-node.js +69 -0
  32. package/dist/legacy/workflow/request/prepare-sequence.d.ts +4 -0
  33. package/dist/legacy/workflow/request/prepare-sequence.js +103 -0
  34. package/dist/legacy/workflow/request/request-body.d.ts +4 -0
  35. package/dist/legacy/workflow/request/request-body.js +64 -0
  36. package/dist/legacy/workflow/request/request-headers.d.ts +4 -0
  37. package/dist/legacy/workflow/request/request-headers.js +30 -0
  38. package/dist/legacy/workflow/request/request-url.d.ts +4 -0
  39. package/dist/legacy/workflow/request/request-url.js +34 -0
  40. package/dist/legacy/workflow/request/response-assertion-code.d.ts +3 -0
  41. package/dist/legacy/workflow/request/response-assertion-code.js +28 -0
  42. package/dist/legacy/workflow/request/sequence-url.d.ts +4 -0
  43. package/dist/legacy/workflow/request/sequence-url.js +104 -0
  44. package/dist/legacy-api.d.ts +25 -0
  45. package/dist/legacy-api.js +20 -0
  46. package/dist/nodes/common/validation/compile-standalone-validator.d.ts +3 -0
  47. package/dist/nodes/common/validation/compile-standalone-validator.js +44 -0
  48. package/dist/nodes/gap/create-gap-node.d.ts +3 -0
  49. package/dist/nodes/gap/create-gap-node.js +35 -0
  50. package/dist/nodes/inputs/compile-template-input-validators.d.ts +3 -0
  51. package/dist/nodes/inputs/compile-template-input-validators.js +26 -0
  52. package/dist/nodes/inputs/create-template-input-nodes.d.ts +4 -0
  53. package/dist/nodes/inputs/create-template-input-nodes.js +61 -0
  54. package/dist/nodes/native/arrays/create-array-node-fragment.d.ts +4 -0
  55. package/dist/nodes/native/arrays/create-array-node-fragment.js +42 -0
  56. package/dist/nodes/native/arrays/create-array-reader-code.d.ts +3 -0
  57. package/dist/nodes/native/arrays/create-array-reader-code.js +12 -0
  58. package/dist/nodes/native/arrays/create-bound-native-array-capability.d.ts +4 -0
  59. package/dist/nodes/native/arrays/create-bound-native-array-capability.js +81 -0
  60. package/dist/nodes/native/arrays/create-native-array-capability.d.ts +4 -0
  61. package/dist/nodes/native/arrays/create-native-array-capability.js +12 -0
  62. package/dist/nodes/native/arrays/native-array-definition.d.ts +2 -0
  63. package/dist/nodes/native/arrays/native-array-definition.js +27 -0
  64. package/dist/nodes/native/common/create-material-planning-capability.d.ts +4 -0
  65. package/dist/nodes/native/common/create-material-planning-capability.js +14 -0
  66. package/dist/nodes/native/common/create-native-fragment.d.ts +2 -0
  67. package/dist/nodes/native/common/create-native-fragment.js +10 -0
  68. package/dist/nodes/native/common/define-material-bound-capability.d.ts +4 -0
  69. package/dist/nodes/native/common/define-material-bound-capability.js +33 -0
  70. package/dist/nodes/native/common/resolve-native-runtime-source.d.ts +3 -0
  71. package/dist/nodes/native/common/resolve-native-runtime-source.js +15 -0
  72. package/dist/nodes/native/common/response-reference-bindings.d.ts +4 -0
  73. package/dist/nodes/native/common/response-reference-bindings.js +15 -0
  74. package/dist/nodes/native/common/response-references.d.ts +3 -0
  75. package/dist/nodes/native/common/response-references.js +5 -0
  76. package/dist/nodes/native/create-exclusive-branch-merge-capability.d.ts +3 -0
  77. package/dist/nodes/native/create-exclusive-branch-merge-capability.js +43 -0
  78. package/dist/nodes/native/create-json-output-capability.d.ts +3 -0
  79. package/dist/nodes/native/create-json-output-capability.js +48 -0
  80. package/dist/nodes/native/create-native-capabilities.d.ts +2 -0
  81. package/dist/nodes/native/create-native-capabilities.js +15 -0
  82. package/dist/nodes/native/create-pass-through-capability.d.ts +3 -0
  83. package/dist/nodes/native/create-pass-through-capability.js +32 -0
  84. package/dist/nodes/native/create-response-array-capability.d.ts +3 -0
  85. package/dist/nodes/native/create-response-array-capability.js +78 -0
  86. package/dist/nodes/native/create-response-collection-capability.d.ts +3 -0
  87. package/dist/nodes/native/create-response-collection-capability.js +134 -0
  88. package/dist/nodes/native/if-capability.d.ts +2 -0
  89. package/dist/nodes/native/if-capability.js +80 -0
  90. package/dist/nodes/native/inputs/native-input-runtime.bundle.js +24 -0
  91. package/dist/nodes/native/inputs/prepend-native-parameter-guard.d.ts +4 -0
  92. package/dist/nodes/native/inputs/prepend-native-parameter-guard.js +52 -0
  93. package/dist/nodes/native/item-join/create-bound-item-join-capability.d.ts +3 -0
  94. package/dist/nodes/native/item-join/create-bound-item-join-capability.js +169 -0
  95. package/dist/nodes/native/item-join/create-item-join-capability.d.ts +4 -0
  96. package/dist/nodes/native/item-join/create-item-join-capability.js +10 -0
  97. package/dist/nodes/native/item-join/create-item-join-reader-code.d.ts +2 -0
  98. package/dist/nodes/native/item-join/create-item-join-reader-code.js +18 -0
  99. package/dist/nodes/native/item-join/item-join-definition.d.ts +2 -0
  100. package/dist/nodes/native/item-join/item-join-definition.js +33 -0
  101. package/dist/nodes/native/item-join/runtime/item-join-runtime.bundle.js +24 -0
  102. package/dist/nodes/native/item-join/runtime/join-api-items.d.ts +3 -0
  103. package/dist/nodes/native/item-join/runtime/join-api-items.js +37 -0
  104. package/dist/nodes/native/merge-append-capability.d.ts +2 -0
  105. package/dist/nodes/native/merge-append-capability.js +33 -0
  106. package/dist/nodes/native/registry/native-feature-definitions.d.ts +4 -0
  107. package/dist/nodes/native/registry/native-feature-definitions.js +93 -0
  108. package/dist/nodes/native/registry/native-feature-material-requirements.d.ts +3 -0
  109. package/dist/nodes/native/registry/native-feature-material-requirements.js +10 -0
  110. package/dist/nodes/native/registry/resolve-n8n-native-features.d.ts +3 -0
  111. package/dist/nodes/native/registry/resolve-n8n-native-features.js +6 -0
  112. package/dist/nodes/native/registry/resolve-n8n-native-planning-features.d.ts +3 -0
  113. package/dist/nodes/native/registry/resolve-n8n-native-planning-features.js +5 -0
  114. package/dist/nodes/native/registry/resolve-native-feature-registry.d.ts +3 -0
  115. package/dist/nodes/native/registry/resolve-native-feature-registry.js +99 -0
  116. package/dist/nodes/native/registry/validate-native-feature-context.d.ts +2 -0
  117. package/dist/nodes/native/registry/validate-native-feature-context.js +46 -0
  118. package/dist/nodes/native/response-array-definition.d.ts +2 -0
  119. package/dist/nodes/native/response-array-definition.js +27 -0
  120. package/dist/nodes/native/response-assertion-capability.d.ts +2 -0
  121. package/dist/nodes/native/response-assertion-capability.js +57 -0
  122. package/dist/nodes/native/response-check-code.d.ts +3 -0
  123. package/dist/nodes/native/response-check-code.js +65 -0
  124. package/dist/nodes/native/response-checks/create-response-check-guard.d.ts +4 -0
  125. package/dist/nodes/native/response-checks/create-response-check-guard.js +22 -0
  126. package/dist/nodes/native/response-checks/create-response-check-reader.d.ts +3 -0
  127. package/dist/nodes/native/response-checks/create-response-check-reader.js +23 -0
  128. package/dist/nodes/native/response-collection-definition.d.ts +2 -0
  129. package/dist/nodes/native/response-collection-definition.js +27 -0
  130. package/dist/nodes/native/stop-and-error-capability.d.ts +2 -0
  131. package/dist/nodes/native/stop-and-error-capability.js +43 -0
  132. package/dist/nodes/request/authentication/credential-field-name.d.ts +1 -0
  133. package/dist/nodes/request/authentication/credential-field-name.js +3 -0
  134. package/dist/nodes/request/authentication/resolve-http-request-authentication.d.ts +2 -0
  135. package/dist/nodes/request/authentication/resolve-http-request-authentication.js +42 -0
  136. package/dist/nodes/request/bindings/compile-native-output-validators.d.ts +3 -0
  137. package/dist/nodes/request/bindings/compile-native-output-validators.js +12 -0
  138. package/dist/nodes/request/bindings/compile-request-validator.d.ts +3 -0
  139. package/dist/nodes/request/bindings/compile-request-validator.js +13 -0
  140. package/dist/nodes/request/bindings/compile-source-response-validators.d.ts +2 -0
  141. package/dist/nodes/request/bindings/compile-source-response-validators.js +12 -0
  142. package/dist/nodes/request/bindings/create-bound-request-fragment.d.ts +3 -0
  143. package/dist/nodes/request/bindings/create-bound-request-fragment.js +82 -0
  144. package/dist/nodes/request/bindings/create-output-item-reader-code.d.ts +2 -0
  145. package/dist/nodes/request/bindings/create-output-item-reader-code.js +7 -0
  146. package/dist/nodes/request/bindings/create-output-reader-code.d.ts +3 -0
  147. package/dist/nodes/request/bindings/create-output-reader-code.js +26 -0
  148. package/dist/nodes/request/bindings/resolve-output-binding-sources.d.ts +3 -0
  149. package/dist/nodes/request/bindings/resolve-output-binding-sources.js +36 -0
  150. package/dist/nodes/request/create-http-request-node.d.ts +2 -0
  151. package/dist/nodes/request/create-http-request-node.js +73 -0
  152. package/dist/nodes/request/deployment/create-request-deployment-notes.d.ts +2 -0
  153. package/dist/nodes/request/deployment/create-request-deployment-notes.js +3 -0
  154. package/dist/nodes/request/deployment/resolve-http-request-deployment.d.ts +2 -0
  155. package/dist/nodes/request/deployment/resolve-http-request-deployment.js +33 -0
  156. package/dist/nodes/request/finalize-http-request-fragment.d.ts +3 -0
  157. package/dist/nodes/request/finalize-http-request-fragment.js +22 -0
  158. package/dist/nodes/request/resolve-http-request-node-configuration.d.ts +4 -0
  159. package/dist/nodes/request/resolve-http-request-node-configuration.js +41 -0
  160. package/dist/nodes/request/response/create-http-response-decoder.d.ts +4 -0
  161. package/dist/nodes/request/response/create-http-response-decoder.js +57 -0
  162. package/dist/nodes/request/response/decode-http-response.d.ts +3 -0
  163. package/dist/nodes/request/response/decode-http-response.js +42 -0
  164. package/dist/nodes/request/response/http-response-media.d.ts +2 -0
  165. package/dist/nodes/request/response/http-response-media.js +32 -0
  166. package/dist/nodes/request/response/http-response-node-name.d.ts +2 -0
  167. package/dist/nodes/request/response/http-response-node-name.js +4 -0
  168. package/dist/nodes/request/response/response-runtime.bundle.js +24 -0
  169. package/dist/nodes/request/runtime/materialize-http-request.d.ts +4 -0
  170. package/dist/nodes/request/runtime/materialize-http-request.js +35 -0
  171. package/dist/nodes/request/runtime/request-runtime.bundle.js +24 -0
  172. package/dist/nodes/request/serialization/create-serialized-http-request-node.d.ts +3 -0
  173. package/dist/nodes/request/serialization/create-serialized-http-request-node.js +17 -0
  174. package/dist/nodes/request/serialization/serialize-http-request.d.ts +5 -0
  175. package/dist/nodes/request/serialization/serialize-http-request.js +70 -0
  176. package/dist/public-api.d.ts +43 -0
  177. package/dist/public-api.js +26 -0
  178. package/dist/schemas/batch-execution-schema.d.ts +15 -0
  179. package/dist/schemas/batch-execution-schema.js +14 -0
  180. package/dist/schemas/create-native-comparison-planning-schema.d.ts +81 -0
  181. package/dist/schemas/create-native-comparison-planning-schema.js +36 -0
  182. package/dist/schemas/exclusive-branch-merge-schema.d.ts +4 -0
  183. package/dist/schemas/exclusive-branch-merge-schema.js +7 -0
  184. package/dist/schemas/item-join-schema.d.ts +13 -0
  185. package/dist/schemas/item-join-schema.js +26 -0
  186. package/dist/schemas/native-array-schema.d.ts +11 -0
  187. package/dist/schemas/native-array-schema.js +19 -0
  188. package/dist/schemas/native-capability-schemas.d.ts +100 -0
  189. package/dist/schemas/native-capability-schemas.js +62 -0
  190. package/dist/schemas/native-feature-registry-schema.d.ts +17 -0
  191. package/dist/schemas/native-feature-registry-schema.js +8 -0
  192. package/dist/schemas/native-runtime-input-schema.d.ts +5 -0
  193. package/dist/schemas/native-runtime-input-schema.js +5 -0
  194. package/dist/schemas/request-deployment-schema.d.ts +9 -0
  195. package/dist/schemas/request-deployment-schema.js +27 -0
  196. package/dist/schemas/response-array-schema.d.ts +11 -0
  197. package/dist/schemas/response-array-schema.js +19 -0
  198. package/dist/schemas/response-collection-schema.d.ts +11 -0
  199. package/dist/schemas/response-collection-schema.js +19 -0
  200. package/dist/schemas/template-deployment-selection-schema.d.ts +3 -0
  201. package/dist/schemas/template-deployment-selection-schema.js +10 -0
  202. package/dist/schemas/workflow-input-value-map-schema.d.ts +5 -0
  203. package/dist/schemas/workflow-input-value-map-schema.js +5 -0
  204. package/dist/schemas/workflow-template-schema.d.ts +11 -0
  205. package/dist/schemas/workflow-template-schema.js +10 -0
  206. package/dist/types/array-iteration.d.ts +8 -0
  207. package/dist/types/array-iteration.js +1 -0
  208. package/dist/types/array-split.d.ts +13 -0
  209. package/dist/types/array-split.js +1 -0
  210. package/dist/types/authentication.d.ts +14 -0
  211. package/dist/types/authentication.js +1 -0
  212. package/dist/types/batch-execution.d.ts +23 -0
  213. package/dist/types/batch-execution.js +1 -0
  214. package/dist/types/http-response-decoding.d.ts +16 -0
  215. package/dist/types/http-response-decoding.js +1 -0
  216. package/dist/types/item-join.d.ts +40 -0
  217. package/dist/types/item-join.js +1 -0
  218. package/dist/types/legacy/catalog-workflow.d.ts +37 -0
  219. package/dist/types/legacy/catalog-workflow.js +1 -0
  220. package/dist/types/legacy/inbound-workflow.d.ts +27 -0
  221. package/dist/types/legacy/inbound-workflow.js +1 -0
  222. package/dist/types/legacy/request-node.d.ts +23 -0
  223. package/dist/types/legacy/request-node.js +1 -0
  224. package/dist/types/legacy/request-workflow.d.ts +43 -0
  225. package/dist/types/legacy/request-workflow.js +1 -0
  226. package/dist/types/legacy/sequence-workflow.d.ts +57 -0
  227. package/dist/types/legacy/sequence-workflow.js +1 -0
  228. package/dist/types/native-array.d.ts +8 -0
  229. package/dist/types/native-array.js +1 -0
  230. package/dist/types/native-capability.d.ts +46 -0
  231. package/dist/types/native-capability.js +1 -0
  232. package/dist/types/native-feature-registry.d.ts +70 -0
  233. package/dist/types/native-feature-registry.js +14 -0
  234. package/dist/types/native-material-binding.d.ts +56 -0
  235. package/dist/types/native-material-binding.js +1 -0
  236. package/dist/types/native-runtime-parameters.d.ts +55 -0
  237. package/dist/types/native-runtime-parameters.js +1 -0
  238. package/dist/types/node-fragment.d.ts +51 -0
  239. package/dist/types/node-fragment.js +1 -0
  240. package/dist/types/output-binding-source.d.ts +27 -0
  241. package/dist/types/output-binding-source.js +1 -0
  242. package/dist/types/request-deployment.d.ts +17 -0
  243. package/dist/types/request-deployment.js +1 -0
  244. package/dist/types/request-materialization.d.ts +30 -0
  245. package/dist/types/request-materialization.js +1 -0
  246. package/dist/types/request-node-configuration.d.ts +13 -0
  247. package/dist/types/request-node-configuration.js +1 -0
  248. package/dist/types/response-check-compilation.d.ts +11 -0
  249. package/dist/types/response-check-compilation.js +1 -0
  250. package/dist/types/response-check-guard.d.ts +6 -0
  251. package/dist/types/response-check-guard.js +1 -0
  252. package/dist/types/response-collection.d.ts +7 -0
  253. package/dist/types/response-collection.js +1 -0
  254. package/dist/types/reviewable-workflow.d.ts +29 -0
  255. package/dist/types/reviewable-workflow.js +1 -0
  256. package/dist/types/schema-compilation.d.ts +5 -0
  257. package/dist/types/schema-compilation.js +1 -0
  258. package/dist/types/serialized-http-request.d.ts +4 -0
  259. package/dist/types/serialized-http-request.js +1 -0
  260. package/dist/types/workflow-compilation.d.ts +39 -0
  261. package/dist/types/workflow-compilation.js +1 -0
  262. package/dist/types/workflow-template.d.ts +121 -0
  263. package/dist/types/workflow-template.js +1 -0
  264. package/dist/utils/bundled-license-banner.d.ts +3 -0
  265. package/dist/utils/bundled-license-banner.js +32 -0
  266. package/dist/utils/javascript-json-literal.d.ts +2 -0
  267. package/dist/utils/javascript-json-literal.js +10 -0
  268. package/dist/utils/json-values-equal.cjs +24 -0
  269. package/dist/utils/json-values-equal.d.cts +1 -0
  270. package/dist/workflow/assemble-n8n-workflow.d.ts +2 -0
  271. package/dist/workflow/assemble-n8n-workflow.js +11 -0
  272. package/dist/workflow/batch/compile-batched-n8n-workflow.d.ts +3 -0
  273. package/dist/workflow/batch/compile-batched-n8n-workflow.js +36 -0
  274. package/dist/workflow/batch/create-batch-execution-scopes.d.ts +3 -0
  275. package/dist/workflow/batch/create-batch-execution-scopes.js +59 -0
  276. package/dist/workflow/batch/validate-batch-exclusive-rejoin.d.ts +3 -0
  277. package/dist/workflow/batch/validate-batch-exclusive-rejoin.js +49 -0
  278. package/dist/workflow/batch/validate-batch-item-flow.d.ts +3 -0
  279. package/dist/workflow/batch/validate-batch-item-flow.js +98 -0
  280. package/dist/workflow/build-n8n-workflow.d.ts +2 -0
  281. package/dist/workflow/build-n8n-workflow.js +140 -0
  282. package/dist/workflow/compile-native-material-fragments.d.ts +3 -0
  283. package/dist/workflow/compile-native-material-fragments.js +76 -0
  284. package/dist/workflow/compile-native-workflow-nodes.d.ts +3 -0
  285. package/dist/workflow/compile-native-workflow-nodes.js +25 -0
  286. package/dist/workflow/compile-planned-n8n-workflow.d.ts +3 -0
  287. package/dist/workflow/compile-planned-n8n-workflow.js +42 -0
  288. package/dist/workflow/compile-reviewable-n8n-workflow.d.ts +3 -0
  289. package/dist/workflow/compile-reviewable-n8n-workflow.js +92 -0
  290. package/dist/workflow/compile-validated-workflow-fragments.d.ts +3 -0
  291. package/dist/workflow/compile-validated-workflow-fragments.js +20 -0
  292. package/dist/workflow/compile-workflow-material-fragments.d.ts +4 -0
  293. package/dist/workflow/compile-workflow-material-fragments.js +18 -0
  294. package/dist/workflow/create-n8n-native-output-sources.d.ts +3 -0
  295. package/dist/workflow/create-n8n-native-output-sources.js +58 -0
  296. package/dist/workflow/entrypoint/manual-trigger.d.ts +4 -0
  297. package/dist/workflow/entrypoint/manual-trigger.js +16 -0
  298. package/dist/workflow/find-singleton-api-responses.d.ts +3 -0
  299. package/dist/workflow/find-singleton-api-responses.js +22 -0
  300. package/dist/workflow/inputs/compile-native-runtime-inputs.d.ts +5 -0
  301. package/dist/workflow/inputs/compile-native-runtime-inputs.js +129 -0
  302. package/dist/workflow/inputs/create-runtime-input-native-capabilities.d.ts +4 -0
  303. package/dist/workflow/inputs/create-runtime-input-native-capabilities.js +36 -0
  304. package/dist/workflow/resolve-n8n-native-materials.d.ts +2 -0
  305. package/dist/workflow/resolve-n8n-native-materials.js +16 -0
  306. package/dist/workflow/review/create-gap-review-content.d.ts +2 -0
  307. package/dist/workflow/review/create-gap-review-content.js +28 -0
  308. package/dist/workflow/review/create-gap-review-region.d.ts +2 -0
  309. package/dist/workflow/review/create-gap-review-region.js +23 -0
  310. package/dist/workflow/review/escape-review-markdown.d.ts +1 -0
  311. package/dist/workflow/review/escape-review-markdown.js +7 -0
  312. package/dist/workflow/review/gap-review-region-layout.d.ts +4 -0
  313. package/dist/workflow/review/gap-review-region-layout.js +21 -0
  314. package/dist/workflow/templates/compile-n8n-workflow-template.d.ts +3 -0
  315. package/dist/workflow/templates/compile-n8n-workflow-template.js +211 -0
  316. package/dist/workflow/templates/create-template-artifact-mapping.d.ts +2 -0
  317. package/dist/workflow/templates/create-template-artifact-mapping.js +58 -0
  318. package/dist/workflow/templates/create-template-gap-regions.d.ts +5 -0
  319. package/dist/workflow/templates/create-template-gap-regions.js +22 -0
  320. package/dist/workflow/templates/create-workflow-template-guide.d.ts +3 -0
  321. package/dist/workflow/templates/create-workflow-template-guide.js +44 -0
  322. package/dist/workflow/templates/prepare-template-api-fragments.d.ts +3 -0
  323. package/dist/workflow/templates/prepare-template-api-fragments.js +74 -0
  324. package/dist/workflow/templates/select-n8n-template-deployments.d.ts +3 -0
  325. package/dist/workflow/templates/select-n8n-template-deployments.js +12 -0
  326. package/dist/workflow/templates/workflow-template-identities.d.ts +5 -0
  327. package/dist/workflow/templates/workflow-template-identities.js +5 -0
  328. package/dist/workflow/validate-compiled-binding-sources.d.ts +4 -0
  329. package/dist/workflow/validate-compiled-binding-sources.js +40 -0
  330. package/dist/workflow/validate-node-fragments.d.ts +3 -0
  331. package/dist/workflow/validate-node-fragments.js +58 -0
  332. package/package.json +59 -4
@@ -0,0 +1,32 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ /** Preserve bundled dependencies' license notices in generated workflow code. */
4
+ export function bundledLicenseBanner(metadata, generatedFrom) {
5
+ const packages = new Set(generatedFrom);
6
+ const notices = [];
7
+ for (const input of Object.keys(metadata.inputs)) {
8
+ if (input === '<stdin>')
9
+ continue;
10
+ let directory = dirname(resolve(input));
11
+ while (!existsSync(join(directory, 'package.json'))) {
12
+ const parent = dirname(directory);
13
+ if (parent === directory)
14
+ throw new Error(`Bundled input ${input} has no owning package`);
15
+ directory = parent;
16
+ }
17
+ packages.add(directory);
18
+ }
19
+ for (const directory of packages) {
20
+ const file = ['LICENSE', 'LICENSE.md', 'LICENSE.txt']
21
+ .map((name) => join(directory, name))
22
+ .find(existsSync);
23
+ if (!file)
24
+ throw new Error(`Bundled package ${directory} has no license notice`);
25
+ notices.push(readFileSync(file, 'utf8'));
26
+ }
27
+ return notices.length
28
+ ? '/*! Bundled dependency licenses\n' +
29
+ notices.join('\n\n').replaceAll('*/', '* /') +
30
+ '\n*/\n'
31
+ : '';
32
+ }
@@ -0,0 +1,2 @@
1
+ /** Encode data as a JS string, avoiding n8n's delimiter scan even inside strings. */
2
+ export declare function javascriptJsonLiteral(value: unknown): string;
@@ -0,0 +1,10 @@
1
+ /** Encode data as a JS string, avoiding n8n's delimiter scan even inside strings. */
2
+ export function javascriptJsonLiteral(value) {
3
+ const json = JSON.stringify(value);
4
+ if (json === undefined)
5
+ throw new Error('Runtime data must be JSON-serializable');
6
+ const literal = JSON.stringify(json)
7
+ .replaceAll('{', '\\u007b')
8
+ .replaceAll('}', '\\u007d');
9
+ return `JSON.parse(${literal})`;
10
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /** JSON Schema equality is structural; JavaScript prototypes are not JSON data. */
4
+ function jsonValuesEqual(left, right) {
5
+ if (left === right)
6
+ return true;
7
+ if (left === null ||
8
+ right === null ||
9
+ typeof left !== 'object' ||
10
+ typeof right !== 'object')
11
+ return false;
12
+ if (Array.isArray(left) !== Array.isArray(right))
13
+ return false;
14
+ if (Array.isArray(left) &&
15
+ Array.isArray(right) &&
16
+ left.length !== right.length)
17
+ return false;
18
+ const keys = Object.keys(left);
19
+ return (keys.length === Object.keys(right).length &&
20
+ keys.every((key) => Object.hasOwn(right, key) &&
21
+ jsonValuesEqual(Reflect.get(left, key), Reflect.get(right, key))));
22
+ }
23
+ // Ajv standalone requires a CommonJS module's plain default field.
24
+ module.exports = { default: jsonValuesEqual };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { AssembleN8nWorkflowInput, N8nCompileResult } from '../types/workflow-compilation.js';
2
+ export declare function assembleN8nWorkflow(input: AssembleN8nWorkflowInput): N8nCompileResult;
@@ -0,0 +1,11 @@
1
+ import { buildN8nWorkflow } from './build-n8n-workflow.js';
2
+ export function assembleN8nWorkflow(input) {
3
+ return {
4
+ status: 'complete',
5
+ workflow: buildN8nWorkflow({
6
+ ...input,
7
+ triggerConnections: 'connected',
8
+ annotations: [],
9
+ }),
10
+ };
11
+ }
@@ -0,0 +1,3 @@
1
+ import type { CompileBatchedN8nWorkflowInput } from '../../types/batch-execution.js';
2
+ import type { N8nCompileResult } from '../../types/workflow-compilation.js';
3
+ export declare function compileBatchedN8nWorkflow(input: CompileBatchedN8nWorkflowInput): N8nCompileResult;
@@ -0,0 +1,36 @@
1
+ import { batchExecutionScopesSchema } from '../../schemas/batch-execution-schema.js';
2
+ import { compileValidatedWorkflowFragments } from '../compile-validated-workflow-fragments.js';
3
+ import { buildN8nWorkflow } from '../build-n8n-workflow.js';
4
+ import { prepareNativeRuntimeInputs, assembleNativeRuntimeInputs, } from '../inputs/compile-native-runtime-inputs.js';
5
+ export function compileBatchedN8nWorkflow(input) {
6
+ const batchScopes = batchExecutionScopesSchema.parse(input.batchScopes);
7
+ const nativeInputs = prepareNativeRuntimeInputs({
8
+ nativeInputs: input.nativeInputs,
9
+ nativeNodes: input.plan.nativeNodes,
10
+ capabilities: input.capabilities,
11
+ apiMaterials: input.materials.map((item) => ({
12
+ callId: item.arguments.callId,
13
+ operation: item.operation,
14
+ requestMediaType: item.arguments.requestMediaType,
15
+ })),
16
+ nativeOutputs: [],
17
+ });
18
+ const graph = {
19
+ id: input.id,
20
+ name: input.name,
21
+ nodes: compileValidatedWorkflowFragments(nativeInputs === undefined
22
+ ? input
23
+ : { ...input, capabilities: nativeInputs.capabilities }),
24
+ edges: input.plan.edges,
25
+ starts: input.plan.starts,
26
+ triggerConnections: 'connected',
27
+ annotations: [],
28
+ batchScopes,
29
+ };
30
+ const result = nativeInputs === undefined
31
+ ? { workflow: buildN8nWorkflow(graph) }
32
+ : assembleNativeRuntimeInputs({ ...graph, nativeInputs });
33
+ const workflow = result.workflow;
34
+ workflow.settings = { ...workflow.settings, executionOrder: 'v1' };
35
+ return { status: 'complete', ...result };
36
+ }
@@ -0,0 +1,3 @@
1
+ import type { CreateBatchExecutionScopesInput, CompiledN8nBatchExecutionScope } from '../../types/batch-execution.js';
2
+ /** Lower explicitly bounded, cardinality-preserving paths; never allow arbitrary cycles. */
3
+ export declare function createBatchExecutionScopes(input: CreateBatchExecutionScopesInput): CompiledN8nBatchExecutionScope[];
@@ -0,0 +1,59 @@
1
+ import { node } from '@n8n/workflow-sdk';
2
+ import { batchExecutionScopesSchema } from '../../schemas/batch-execution-schema.js';
3
+ import { validateBatchItemFlow } from './validate-batch-item-flow.js';
4
+ /** Lower explicitly bounded, cardinality-preserving paths; never allow arbitrary cycles. */
5
+ export function createBatchExecutionScopes(input) {
6
+ const scopes = batchExecutionScopesSchema.parse(input.batchScopes);
7
+ const fragments = new Map(input.nodes.map((fragment) => [fragment.nodeId, fragment]));
8
+ const owners = new Set();
9
+ const ids = new Set();
10
+ return scopes.map((scope) => {
11
+ const members = new Set(scope.nodeIds);
12
+ if (ids.has(scope.id) ||
13
+ members.size !== scope.nodeIds.length ||
14
+ !members.has(scope.entryNodeId) ||
15
+ !members.has(scope.exitNodeId))
16
+ throw new Error(`batch ${scope.id}: duplicate scope/member identity or missing entry/exit member`);
17
+ ids.add(scope.id);
18
+ for (const id of members) {
19
+ const fragment = fragments.get(id);
20
+ if (!fragment || owners.has(id))
21
+ throw new Error(`batch ${scope.id}: missing or overlapping member ${id}`);
22
+ owners.add(id);
23
+ const incoming = input.edges.filter((edge) => edge.to === id);
24
+ const outgoing = input.edges.filter((edge) => edge.from === id);
25
+ if (incoming.some((edge) => !members.has(edge.from) && id !== scope.entryNodeId) ||
26
+ outgoing.some((edge) => !members.has(edge.to) && id !== scope.exitNodeId))
27
+ throw new Error(`batch ${scope.id}: member ${id} crosses the entry/exit boundary`);
28
+ if (id !== scope.entryNodeId && input.starts.includes(id))
29
+ throw new Error(`batch ${scope.id}: only its entry may be a workflow start`);
30
+ }
31
+ validateBatchItemFlow({
32
+ scope,
33
+ fragments,
34
+ edges: input.edges,
35
+ otherBatchNodeIds: new Set(scopes
36
+ .filter((other) => other.id !== scope.id)
37
+ .flatMap((other) => other.nodeIds)),
38
+ });
39
+ const entry = fragments.get(scope.entryNodeId);
40
+ const position = entry.entry.config.position;
41
+ if (!Array.isArray(position) ||
42
+ position.length !== 2 ||
43
+ position.some((coordinate) => typeof coordinate !== 'number' || !Number.isFinite(coordinate)))
44
+ throw new Error(`batch ${scope.id}: entry ${scope.entryNodeId} requires config.position with two finite coordinates`);
45
+ return {
46
+ scope,
47
+ controller: node({
48
+ type: 'n8n-nodes-base.splitInBatches',
49
+ version: 3,
50
+ config: {
51
+ id: scope.id,
52
+ name: scope.id,
53
+ position: [position[0] - 220, position[1]],
54
+ parameters: { batchSize: scope.batchSize, options: { reset: false } },
55
+ },
56
+ }),
57
+ };
58
+ });
59
+ }
@@ -0,0 +1,3 @@
1
+ import type { ValidateBatchItemFlowInput } from '../../types/batch-execution.js';
2
+ /** Verify complete one-to-one paths, rather than interpreting item values or IDs. */
3
+ export declare function validateBatchExclusiveRejoin(input: ValidateBatchItemFlowInput, nodeId: string): void;
@@ -0,0 +1,49 @@
1
+ /** Verify complete one-to-one paths, rather than interpreting item values or IDs. */
2
+ export function validateBatchExclusiveRejoin(input, nodeId) {
3
+ const { scope, fragments, edges } = input;
4
+ const sourceId = fragments.get(nodeId).rejoinsExclusiveOutputs;
5
+ const source = fragments.get(sourceId);
6
+ const target = fragments.get(nodeId);
7
+ const incoming = edges.filter((edge) => edge.to === nodeId);
8
+ if (!scope.nodeIds.includes(sourceId) ||
9
+ !source?.partitionsInputItems ||
10
+ target.preservesInputItems ||
11
+ target.joinsInputItemsByAncestry ||
12
+ Object.keys(target.outputPorts).join() !== 'main' ||
13
+ target.inputEndpoints ||
14
+ incoming.length !== Object.keys(target.inputPorts).length)
15
+ throw new Error(`batch ${scope.id}: rejoin ${nodeId} requires a complete partition in the same scope`);
16
+ const covered = new Set();
17
+ for (const port of Object.keys(target.inputPorts)) {
18
+ const paths = incoming.filter((edge) => edge.input === port);
19
+ if (paths.length !== 1)
20
+ throw new Error(`batch ${scope.id}: rejoin ${nodeId} requires exactly one path per input`);
21
+ let edge = paths[0];
22
+ const visited = new Set();
23
+ while (edge.from !== sourceId) {
24
+ const step = fragments.get(edge.from);
25
+ const predecessors = edges.filter((item) => item.to === edge.from);
26
+ if (!scope.nodeIds.includes(edge.from) ||
27
+ visited.has(edge.from) ||
28
+ !step ||
29
+ step.preservesInputItems !== true ||
30
+ step.joinsInputItemsByAncestry ||
31
+ step.partitionsInputItems ||
32
+ step.rejoinsExclusiveOutputs ||
33
+ step.inputEndpoints ||
34
+ Object.keys(step.inputPorts).join() !== 'main' ||
35
+ Object.keys(step.outputPorts).join() !== 'main' ||
36
+ predecessors.length !== 1 ||
37
+ edges.filter((item) => item.from === edge.from).length !== 1)
38
+ throw new Error(`batch ${scope.id}: rejoin ${nodeId} requires item-preserving paths from ${sourceId}`);
39
+ visited.add(edge.from);
40
+ edge = predecessors[0];
41
+ }
42
+ if (!Object.hasOwn(source.outputPorts, edge.output) ||
43
+ covered.has(edge.output))
44
+ throw new Error(`batch ${scope.id}: rejoin ${nodeId} repeats or omits an alternative of ${sourceId}`);
45
+ covered.add(edge.output);
46
+ }
47
+ if (covered.size !== Object.keys(source.outputPorts).length)
48
+ throw new Error(`batch ${scope.id}: rejoin ${nodeId} must return every alternative of ${sourceId}`);
49
+ }
@@ -0,0 +1,3 @@
1
+ import type { ValidateBatchItemFlowInput } from '../../types/batch-execution.js';
2
+ /** Prove one result per entry item through declared preservation and ancestry joins. */
3
+ export declare function validateBatchItemFlow({ scope, fragments, edges, otherBatchNodeIds, }: ValidateBatchItemFlowInput): void;
@@ -0,0 +1,98 @@
1
+ import { validateBatchExclusiveRejoin } from './validate-batch-exclusive-rejoin.js';
2
+ /** Prove one result per entry item through declared preservation and ancestry joins. */
3
+ export function validateBatchItemFlow({ scope, fragments, edges, otherBatchNodeIds, }) {
4
+ const members = new Set(scope.nodeIds);
5
+ const incoming = (id) => edges.filter((edge) => edge.to === id);
6
+ const outgoing = (id) => edges.filter((edge) => edge.from === id);
7
+ const upstream = incoming(scope.entryNodeId).filter((edge) => !members.has(edge.from));
8
+ if (upstream.length > 1)
9
+ throw new Error(`batch ${scope.id}: entry requires one upstream stream`);
10
+ const entryAncestors = new Set();
11
+ let preceding = upstream.map((edge) => edge.from);
12
+ while (preceding.length) {
13
+ const id = preceding.pop();
14
+ if (otherBatchNodeIds.has(id))
15
+ break;
16
+ if (entryAncestors.has(id))
17
+ throw new Error(`batch ${scope.id}: upstream item flow has a cycle`);
18
+ entryAncestors.add(id);
19
+ const fragment = fragments.get(id);
20
+ const sources = incoming(id);
21
+ if (fragment.preservesInputItems === true &&
22
+ !fragment.joinsInputItemsByAncestry &&
23
+ Object.keys(fragment.inputPorts).join() === 'main' &&
24
+ Object.keys(fragment.outputPorts).join() === 'main' &&
25
+ !fragment.inputEndpoints &&
26
+ sources.length === 1)
27
+ preceding = [sources[0].from];
28
+ }
29
+ const ancestors = new Map();
30
+ const pending = [...members];
31
+ while (pending.length) {
32
+ const index = pending.findIndex((id) => incoming(id)
33
+ .filter((edge) => members.has(edge.from))
34
+ .every((edge) => ancestors.has(edge.from)));
35
+ if (index === -1)
36
+ throw new Error(`batch ${scope.id}: item flow has a cycle`);
37
+ const id = pending.splice(index, 1)[0];
38
+ const fragment = fragments.get(id);
39
+ const innerIncoming = incoming(id).filter((edge) => members.has(edge.from));
40
+ const innerOutgoing = outgoing(id).filter((edge) => members.has(edge.to));
41
+ if ((id === scope.entryNodeId
42
+ ? innerIncoming.length !== 0
43
+ : innerIncoming.length === 0) ||
44
+ (id === scope.exitNodeId
45
+ ? innerOutgoing.length !== 0
46
+ : innerOutgoing.length === 0))
47
+ throw new Error(`batch ${scope.id}: every member must lie between its entry and exit`);
48
+ const join = fragment.joinsInputItemsByAncestry;
49
+ const rejoin = fragment.rejoinsExclusiveOutputs;
50
+ const partition = fragment.partitionsInputItems;
51
+ if (partition &&
52
+ (fragment.preservesInputItems ||
53
+ join ||
54
+ rejoin ||
55
+ Object.keys(fragment.inputPorts).join() !== 'main' ||
56
+ fragment.inputEndpoints ||
57
+ Object.keys(fragment.outputPorts).length < 2 ||
58
+ Object.keys(fragment.outputPorts).some((port) => innerOutgoing.filter((edge) => edge.output === port).length !== 1)))
59
+ throw new Error(`batch ${scope.id}: item-preserving main path contract requires every partition output of ${id} to return exactly once`);
60
+ if ((!partition && Object.keys(fragment.outputPorts).join() !== 'main') ||
61
+ (!join &&
62
+ !partition &&
63
+ !rejoin &&
64
+ (fragment.preservesInputItems !== true ||
65
+ Object.keys(fragment.inputPorts).join() !== 'main' ||
66
+ fragment.inputEndpoints)) ||
67
+ (join && fragment.preservesInputItems === true))
68
+ throw new Error(`batch ${scope.id}: member ${id} requires an item-preserving main path contract or an explicit ancestry join`);
69
+ let inherited;
70
+ if (rejoin) {
71
+ validateBatchExclusiveRejoin({ scope, fragments, edges, otherBatchNodeIds }, id);
72
+ const branches = innerIncoming.map((edge) => ancestors.get(edge.from));
73
+ inherited = new Set([...branches[0]].filter((ancestor) => branches.every((branch) => branch.has(ancestor))));
74
+ }
75
+ else if (join) {
76
+ const ports = Object.keys(fragment.inputPorts);
77
+ if (id === scope.entryNodeId ||
78
+ ports.length < 2 ||
79
+ ports.some((port) => innerIncoming.filter((edge) => edge.input === port).length !== 1) ||
80
+ innerIncoming.length !== ports.length)
81
+ throw new Error(`batch ${scope.id}: join ${id} requires exactly one branch per declared input`);
82
+ const branchAncestors = innerIncoming.map((edge) => ancestors.get(edge.from));
83
+ if (!fragment.bindingSources?.some((source) => source.kind === 'native-json' && source.nodeId === join.scopeNodeId) ||
84
+ branchAncestors.some((branch) => !branch.has(join.scopeNodeId)))
85
+ throw new Error(`batch ${scope.id}: join ${id} scope ${join.scopeNodeId} must identify each entry item on every branch`);
86
+ inherited = new Set([...branchAncestors[0]].filter((ancestor) => branchAncestors.every((branch) => branch.has(ancestor))));
87
+ }
88
+ else {
89
+ if (id !== scope.entryNodeId && innerIncoming.length !== 1)
90
+ throw new Error(`batch ${scope.id}: member ${id} requires one incoming item stream; use an explicit ancestry join for branches`);
91
+ inherited =
92
+ id === scope.entryNodeId
93
+ ? entryAncestors
94
+ : ancestors.get(innerIncoming[0].from);
95
+ }
96
+ ancestors.set(id, new Set([...inherited, id]));
97
+ }
98
+ }
@@ -0,0 +1,2 @@
1
+ import type { BuildN8nWorkflowInput, N8nWorkflowJSON } from '../types/workflow-compilation.js';
2
+ export declare function buildN8nWorkflow({ id, name, nodes, edges, starts, triggerConnections, annotations, batchScopes, }: BuildN8nWorkflowInput): N8nWorkflowJSON;
@@ -0,0 +1,140 @@
1
+ import { workflow, validateWorkflow } from '@n8n/workflow-sdk';
2
+ import { createN8nManualTrigger } from './entrypoint/manual-trigger.js';
3
+ import { validateNodeFragments } from './validate-node-fragments.js';
4
+ import { createBatchExecutionScopes } from './batch/create-batch-execution-scopes.js';
5
+ export function buildN8nWorkflow({ id, name, nodes, edges, starts, triggerConnections, annotations, batchScopes, }) {
6
+ if (!['connected', 'detached'].includes(triggerConnections))
7
+ throw new Error('triggerConnections must be connected or detached');
8
+ if (!Array.isArray(annotations) ||
9
+ annotations.some((item) => item.type !== 'n8n-nodes-base.stickyNote'))
10
+ throw new Error('workflow annotations must be Sticky Notes');
11
+ if (typeof id !== 'string' ||
12
+ !id.trim() ||
13
+ typeof name !== 'string' ||
14
+ !name.trim())
15
+ throw new Error('workflow.id and workflow.name must be non-empty');
16
+ if (!Array.isArray(nodes) ||
17
+ nodes.length === 0 ||
18
+ !Array.isArray(edges) ||
19
+ !Array.isArray(starts) ||
20
+ starts.length === 0)
21
+ throw new Error('workflow requires nodes, edges and explicit starts');
22
+ if (nodes.some((fragment) => fragment.nodes.some((item) => 'isTrigger' in item && item.isTrigger === true)))
23
+ throw new Error('workflow fragments must not introduce an additional trigger');
24
+ const byId = new Map(nodes.map((fragment) => [fragment.nodeId, fragment]));
25
+ if (byId.size !== nodes.length ||
26
+ nodes.some((fragment) => !fragment.nodeId.trim()))
27
+ throw new Error('workflow nodes require unique non-empty nodeId');
28
+ const batches = batchScopes === undefined
29
+ ? []
30
+ : createBatchExecutionScopes({
31
+ id,
32
+ name,
33
+ nodes,
34
+ edges,
35
+ starts,
36
+ batchScopes,
37
+ });
38
+ const sdkNodes = [
39
+ ...nodes.flatMap((fragment) => fragment.nodes),
40
+ ...annotations,
41
+ ...batches.map((batch) => batch.controller),
42
+ ];
43
+ const sdkIds = sdkNodes.map((node) => node.id);
44
+ const sdkNames = sdkNodes.map((node) => node.name);
45
+ if (new Set(sdkIds).size !== sdkIds.length ||
46
+ new Set(sdkNames).size !== sdkNames.length ||
47
+ sdkNames.includes('Start') ||
48
+ sdkIds.includes('openapi-flow-start'))
49
+ throw new Error('workflow SDK node IDs and names must be unique and not use the Start trigger identity');
50
+ validateNodeFragments(nodes);
51
+ if (starts.some((id) => {
52
+ const fragment = byId.get(id);
53
+ return (fragment?.inputEndpoints &&
54
+ new Set(Object.values(fragment.inputEndpoints).map((endpoint) => endpoint.nodeId)).size > 1);
55
+ }))
56
+ throw new Error('workflow starts cannot bypass independent fragment input endpoints');
57
+ const successors = new Map(nodes.map((fragment) => [fragment.nodeId, []]));
58
+ const inbound = new Map(nodes.map((fragment) => [fragment.nodeId, 0]));
59
+ const edgeIds = new Set();
60
+ for (const edge of edges) {
61
+ const source = byId.get(edge.from);
62
+ const target = byId.get(edge.to);
63
+ if (!source || !target)
64
+ throw new Error(`edge ${edge.from} -> ${edge.to} references a missing node`);
65
+ if (!Object.hasOwn(source.outputPorts, edge.output) ||
66
+ !Object.hasOwn(target.inputPorts, edge.input))
67
+ throw new Error(`edge ${edge.from} -> ${edge.to} references an undeclared port`);
68
+ const key = JSON.stringify(edge);
69
+ if (edgeIds.has(key))
70
+ throw new Error(`duplicate edge ${edge.from} -> ${edge.to}`);
71
+ edgeIds.add(key);
72
+ successors.get(edge.from).push(edge.to);
73
+ inbound.set(edge.to, inbound.get(edge.to) + 1);
74
+ }
75
+ const roots = [...inbound]
76
+ .filter(([, count]) => count === 0)
77
+ .map(([nodeId]) => nodeId);
78
+ if (new Set(starts).size !== starts.length ||
79
+ starts.some((nodeId) => !roots.includes(nodeId)) ||
80
+ roots.some((nodeId) => !starts.includes(nodeId)))
81
+ throw new Error('workflow.starts must identify every root exactly once');
82
+ const pending = [...roots];
83
+ let visited = 0;
84
+ while (pending.length) {
85
+ const current = pending.shift();
86
+ visited++;
87
+ for (const next of successors.get(current)) {
88
+ const count = inbound.get(next) - 1;
89
+ inbound.set(next, count);
90
+ if (count === 0)
91
+ pending.push(next);
92
+ }
93
+ }
94
+ if (visited !== nodes.length)
95
+ throw new Error('workflow DAG has a cycle');
96
+ const start = createN8nManualTrigger();
97
+ let built = workflow(id, name).add(start);
98
+ for (const fragment of nodes)
99
+ for (const node of fragment.nodes)
100
+ built = built.add(node);
101
+ for (const batch of batches) {
102
+ built = built.add(batch.controller);
103
+ built = built.connect(batch.controller, 1, byId.get(batch.scope.entryNodeId).entry, byId.get(batch.scope.entryNodeId).inputPorts.main);
104
+ built = built.connect(byId.get(batch.scope.exitNodeId).exit, byId.get(batch.scope.exitNodeId).outputPorts.main, batch.controller, 0);
105
+ }
106
+ for (const fragment of nodes)
107
+ for (const edge of fragment.internalEdges ?? [])
108
+ built = built.connect(fragment.nodes.find((item) => item.id === edge.from), edge.output, fragment.nodes.find((item) => item.id === edge.to), edge.input);
109
+ if (triggerConnections === 'connected')
110
+ for (const nodeId of starts)
111
+ built = built.connect(start, 0, batches.find((batch) => batch.scope.entryNodeId === nodeId)
112
+ ?.controller ?? byId.get(nodeId).entry, 0);
113
+ for (const note of annotations)
114
+ built = built.add(note);
115
+ for (const edge of edges) {
116
+ const source = byId.get(edge.from);
117
+ const target = byId.get(edge.to);
118
+ const endpoint = target.inputEndpoints?.[edge.input];
119
+ const sourceBatch = batches.find((batch) => batch.scope.exitNodeId === edge.from &&
120
+ !batch.scope.nodeIds.includes(edge.to));
121
+ const targetBatch = batches.find((batch) => batch.scope.entryNodeId === edge.to &&
122
+ !batch.scope.nodeIds.includes(edge.from));
123
+ built = built.connect(sourceBatch ? sourceBatch.controller : source.exit, sourceBatch ? 0 : source.outputPorts[edge.output], targetBatch
124
+ ? targetBatch.controller
125
+ : endpoint
126
+ ? target.nodes.find((node) => node.id === endpoint.nodeId)
127
+ : target.entry, targetBatch
128
+ ? 0
129
+ : endpoint
130
+ ? endpoint.input
131
+ : target.inputPorts[edge.input]);
132
+ }
133
+ const checked = validateWorkflow(built);
134
+ if (!checked.valid)
135
+ throw new Error(`n8n SDK validation failed: ${checked.errors.map((error) => error.message).join('; ')}`);
136
+ const result = built.toJSON();
137
+ if (triggerConnections === 'detached')
138
+ result.active = false;
139
+ return result;
140
+ }
@@ -0,0 +1,3 @@
1
+ import type { CompileNativeMaterialFragmentsInput, CompiledNativeMaterialFragments } from '../types/native-material-binding.js';
2
+ /** Compile dependency names from actual SDK exits; graph execution order is still owned by explicit edges. */
3
+ export declare function compileNativeMaterialFragments(input: CompileNativeMaterialFragmentsInput): CompiledNativeMaterialFragments;
@@ -0,0 +1,76 @@
1
+ /** Compile dependency names from actual SDK exits; graph execution order is still owned by explicit edges. */
2
+ export function compileNativeMaterialFragments(input) {
3
+ const registry = new Map(input.materials.capabilities.map((capability) => [
4
+ capability.name,
5
+ capability,
6
+ ]));
7
+ const selected = new Set(input.nodeIds);
8
+ if (selected.size !== input.nodeIds.length ||
9
+ input.nodeIds.some((id) => !input.nativeNodes.some((node) => node.id === id)))
10
+ throw new Error('Native compilation requires distinct actual selected nodeIds');
11
+ const pending = input.nativeNodes.filter((node) => selected.has(node.id));
12
+ const sources = [...input.externalNativeOutputSources];
13
+ const fragments = new Map();
14
+ const apiResponseContracts = Object.fromEntries(input.apiMaterials.map((material) => [material.callId, material.operation]));
15
+ let progressed = true;
16
+ while (pending.length && progressed) {
17
+ progressed = false;
18
+ for (let index = 0; index < pending.length;) {
19
+ const node = pending[index];
20
+ const capability = registry.get(node.capability);
21
+ if (!capability)
22
+ throw new Error(`Missing current native compiler ${node.capability}`);
23
+ const references = [
24
+ ...(capability.nodeOutputReferences
25
+ ? capability.nodeOutputReferences(node.parameters)
26
+ : []),
27
+ ...Object.values(capability.inputReferences
28
+ ? capability.inputReferences(node.parameters)
29
+ : {})
30
+ .flat()
31
+ .filter((reference) => reference.source === 'node-output'),
32
+ ];
33
+ if (references.some((reference) => !sources.some((source) => source.nodeId === reference.nodeId))) {
34
+ index++;
35
+ continue;
36
+ }
37
+ const compiled = capability.compile({
38
+ planned: node,
39
+ apiNodeNames: input.apiNodeNames,
40
+ apiResponseContracts,
41
+ singletonApiResponseIds: input.singletonApiResponseIds,
42
+ nativeOutputSources: sources,
43
+ position: [
44
+ 600 +
45
+ input.nativeNodes.findIndex((planned) => planned.id === node.id) *
46
+ 250,
47
+ 300,
48
+ ],
49
+ });
50
+ if (compiled.nodeId !== node.id ||
51
+ !compiled.exit.name.trim() ||
52
+ JSON.stringify(Object.keys(compiled.inputPorts)) !==
53
+ JSON.stringify(capability.inputPorts(node.parameters)) ||
54
+ JSON.stringify(Object.keys(compiled.outputPorts)) !==
55
+ JSON.stringify(capability.outputPorts(node.parameters)))
56
+ throw new Error(`Native compiler ${node.capability} violated declared node identity/ports`);
57
+ if (compiled.rejoinsExclusiveOutputs !==
58
+ capability.rejoinsExclusiveOutputs?.(node.parameters))
59
+ throw new Error(`Native compiler ${node.capability} violated declared rejoinsExclusiveOutputs`);
60
+ fragments.set(node.id, compiled);
61
+ const output = input.materials.outputs.find((output) => output.nodeId === node.id);
62
+ if (output)
63
+ sources.push({ ...output, nodeName: compiled.exit.name });
64
+ pending.splice(index, 1);
65
+ progressed = true;
66
+ }
67
+ }
68
+ if (pending.length)
69
+ throw new Error(`Native compilation is missing actual producer exits for ${pending.map((node) => node.id).join(', ')}`);
70
+ return {
71
+ fragments: input.nativeNodes
72
+ .filter((node) => selected.has(node.id))
73
+ .map((node) => fragments.get(node.id)),
74
+ outputSources: sources.filter((source) => selected.has(source.nodeId)),
75
+ };
76
+ }
@@ -0,0 +1,3 @@
1
+ import type { CompileNativeWorkflowNodesInput } from '../types/native-capability.js';
2
+ import type { N8nNodeFragment } from '../types/node-fragment.js';
3
+ export declare function compileNativeWorkflowNodes(input: CompileNativeWorkflowNodesInput): N8nNodeFragment[];
@@ -0,0 +1,25 @@
1
+ import { resolveN8nNativeMaterials } from './resolve-n8n-native-materials.js';
2
+ import { compileNativeMaterialFragments } from './compile-native-material-fragments.js';
3
+ import { findSingletonApiResponses } from './find-singleton-api-responses.js';
4
+ export function compileNativeWorkflowNodes(input) {
5
+ const apiMaterials = input.materials.map((item) => ({
6
+ callId: item.arguments.callId,
7
+ operation: item.operation,
8
+ requestMediaType: item.arguments.requestMediaType,
9
+ }));
10
+ const materials = resolveN8nNativeMaterials({
11
+ apiMaterials,
12
+ nativeOutputs: [],
13
+ nativeNodes: input.plan.nativeNodes,
14
+ capabilities: input.capabilities,
15
+ });
16
+ return compileNativeMaterialFragments({
17
+ nativeNodes: input.plan.nativeNodes,
18
+ materials,
19
+ apiMaterials,
20
+ apiNodeNames: Object.fromEntries(input.apiNodes.map((item) => [item.nodeId, item.exit.name])),
21
+ singletonApiResponseIds: findSingletonApiResponses(input),
22
+ externalNativeOutputSources: [],
23
+ nodeIds: input.plan.nativeNodes.map((node) => node.id),
24
+ }).fragments;
25
+ }
@@ -0,0 +1,3 @@
1
+ import type { CompilePlannedN8nWorkflowInput } from '../types/native-capability.js';
2
+ import type { N8nCompileResult } from '../types/workflow-compilation.js';
3
+ export declare function compilePlannedN8nWorkflow(input: CompilePlannedN8nWorkflowInput): N8nCompileResult;