@synergenius/flow-weaver 0.2.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 (466) hide show
  1. package/LICENSE +122 -0
  2. package/README.md +315 -0
  3. package/dist/annotation-generator.d.ts +45 -0
  4. package/dist/annotation-generator.js +557 -0
  5. package/dist/api/builder.d.ts +223 -0
  6. package/dist/api/builder.js +345 -0
  7. package/dist/api/compile.d.ts +92 -0
  8. package/dist/api/compile.js +149 -0
  9. package/dist/api/extract-types.d.ts +29 -0
  10. package/dist/api/extract-types.js +57 -0
  11. package/dist/api/generate-in-place.d.ts +73 -0
  12. package/dist/api/generate-in-place.js +1353 -0
  13. package/dist/api/generate.d.ts +83 -0
  14. package/dist/api/generate.js +510 -0
  15. package/dist/api/helpers.d.ts +248 -0
  16. package/dist/api/helpers.js +285 -0
  17. package/dist/api/index.d.ts +46 -0
  18. package/dist/api/index.js +45 -0
  19. package/dist/api/inline-runtime.d.ts +27 -0
  20. package/dist/api/inline-runtime.js +551 -0
  21. package/dist/api/manipulation/connections.d.ts +79 -0
  22. package/dist/api/manipulation/connections.js +151 -0
  23. package/dist/api/manipulation/index.d.ts +34 -0
  24. package/dist/api/manipulation/index.js +41 -0
  25. package/dist/api/manipulation/node-types.d.ts +123 -0
  26. package/dist/api/manipulation/node-types.js +200 -0
  27. package/dist/api/manipulation/nodes.d.ts +144 -0
  28. package/dist/api/manipulation/nodes.js +333 -0
  29. package/dist/api/manipulation/ports.d.ts +59 -0
  30. package/dist/api/manipulation/ports.js +228 -0
  31. package/dist/api/manipulation/scopes.d.ts +52 -0
  32. package/dist/api/manipulation/scopes.js +156 -0
  33. package/dist/api/manipulation/validation.d.ts +6 -0
  34. package/dist/api/manipulation/validation.js +6 -0
  35. package/dist/api/manipulation/workflow.d.ts +81 -0
  36. package/dist/api/manipulation/workflow.js +116 -0
  37. package/dist/api/manipulation.d.ts +8 -0
  38. package/dist/api/manipulation.js +8 -0
  39. package/dist/api/parse.d.ts +48 -0
  40. package/dist/api/parse.js +110 -0
  41. package/dist/api/patterns.d.ts +112 -0
  42. package/dist/api/patterns.js +306 -0
  43. package/dist/api/query.d.ts +429 -0
  44. package/dist/api/query.js +816 -0
  45. package/dist/api/templates.d.ts +98 -0
  46. package/dist/api/templates.js +117 -0
  47. package/dist/api/transform.d.ts +31 -0
  48. package/dist/api/transform.js +40 -0
  49. package/dist/api/validate.d.ts +25 -0
  50. package/dist/api/validate.js +39 -0
  51. package/dist/api/workflow-file-operations.d.ts +29 -0
  52. package/dist/api/workflow-file-operations.js +180 -0
  53. package/dist/ast/builder.d.ts +210 -0
  54. package/dist/ast/builder.js +395 -0
  55. package/dist/ast/index.d.ts +5 -0
  56. package/dist/ast/index.js +5 -0
  57. package/dist/ast/serialization-node.d.ts +6 -0
  58. package/dist/ast/serialization-node.js +30 -0
  59. package/dist/ast/serialization.d.ts +43 -0
  60. package/dist/ast/serialization.js +134 -0
  61. package/dist/ast/types.d.ts +852 -0
  62. package/dist/ast/types.js +2 -0
  63. package/dist/ast/workflow-utils.d.ts +54 -0
  64. package/dist/ast/workflow-utils.js +114 -0
  65. package/dist/body-generator.d.ts +31 -0
  66. package/dist/body-generator.js +35 -0
  67. package/dist/built-in-nodes/delay.d.ts +11 -0
  68. package/dist/built-in-nodes/delay.js +29 -0
  69. package/dist/built-in-nodes/index.d.ts +5 -0
  70. package/dist/built-in-nodes/index.js +4 -0
  71. package/dist/built-in-nodes/invoke-workflow.d.ts +13 -0
  72. package/dist/built-in-nodes/invoke-workflow.js +25 -0
  73. package/dist/built-in-nodes/mock-types.d.ts +18 -0
  74. package/dist/built-in-nodes/mock-types.js +12 -0
  75. package/dist/built-in-nodes/wait-for-event.d.ts +13 -0
  76. package/dist/built-in-nodes/wait-for-event.js +25 -0
  77. package/dist/chevrotain-parser/connect-parser.d.ts +24 -0
  78. package/dist/chevrotain-parser/connect-parser.js +98 -0
  79. package/dist/chevrotain-parser/grammar-diagrams.d.ts +29 -0
  80. package/dist/chevrotain-parser/grammar-diagrams.js +264 -0
  81. package/dist/chevrotain-parser/index.d.ts +25 -0
  82. package/dist/chevrotain-parser/index.js +27 -0
  83. package/dist/chevrotain-parser/map-parser.d.ts +33 -0
  84. package/dist/chevrotain-parser/map-parser.js +130 -0
  85. package/dist/chevrotain-parser/node-parser.d.ts +36 -0
  86. package/dist/chevrotain-parser/node-parser.js +466 -0
  87. package/dist/chevrotain-parser/path-parser.d.ts +28 -0
  88. package/dist/chevrotain-parser/path-parser.js +118 -0
  89. package/dist/chevrotain-parser/port-parser.d.ts +36 -0
  90. package/dist/chevrotain-parser/port-parser.js +442 -0
  91. package/dist/chevrotain-parser/position-parser.d.ts +20 -0
  92. package/dist/chevrotain-parser/position-parser.js +83 -0
  93. package/dist/chevrotain-parser/scope-parser.d.ts +19 -0
  94. package/dist/chevrotain-parser/scope-parser.js +104 -0
  95. package/dist/chevrotain-parser/tokens.d.ts +78 -0
  96. package/dist/chevrotain-parser/tokens.js +384 -0
  97. package/dist/chevrotain-parser/trigger-cancel-parser.d.ts +50 -0
  98. package/dist/chevrotain-parser/trigger-cancel-parser.js +282 -0
  99. package/dist/cli/commands/changelog.d.ts +13 -0
  100. package/dist/cli/commands/changelog.js +135 -0
  101. package/dist/cli/commands/compile.d.ts +64 -0
  102. package/dist/cli/commands/compile.js +278 -0
  103. package/dist/cli/commands/create.d.ts +33 -0
  104. package/dist/cli/commands/create.js +147 -0
  105. package/dist/cli/commands/describe.d.ts +68 -0
  106. package/dist/cli/commands/describe.js +377 -0
  107. package/dist/cli/commands/dev.d.ts +32 -0
  108. package/dist/cli/commands/dev.js +384 -0
  109. package/dist/cli/commands/diagram.d.ts +13 -0
  110. package/dist/cli/commands/diagram.js +33 -0
  111. package/dist/cli/commands/diff.d.ts +11 -0
  112. package/dist/cli/commands/diff.js +59 -0
  113. package/dist/cli/commands/doctor.d.ts +57 -0
  114. package/dist/cli/commands/doctor.js +719 -0
  115. package/dist/cli/commands/export.d.ts +57 -0
  116. package/dist/cli/commands/export.js +163 -0
  117. package/dist/cli/commands/grammar.d.ts +9 -0
  118. package/dist/cli/commands/grammar.js +39 -0
  119. package/dist/cli/commands/init.d.ts +59 -0
  120. package/dist/cli/commands/init.js +435 -0
  121. package/dist/cli/commands/listen.d.ts +16 -0
  122. package/dist/cli/commands/listen.js +39 -0
  123. package/dist/cli/commands/market.d.ts +52 -0
  124. package/dist/cli/commands/market.js +436 -0
  125. package/dist/cli/commands/migrate.d.ts +13 -0
  126. package/dist/cli/commands/migrate.js +89 -0
  127. package/dist/cli/commands/openapi.d.ts +37 -0
  128. package/dist/cli/commands/openapi.js +67 -0
  129. package/dist/cli/commands/pattern.d.ts +34 -0
  130. package/dist/cli/commands/pattern.js +185 -0
  131. package/dist/cli/commands/plugin.d.ts +16 -0
  132. package/dist/cli/commands/plugin.js +176 -0
  133. package/dist/cli/commands/run.d.ts +49 -0
  134. package/dist/cli/commands/run.js +191 -0
  135. package/dist/cli/commands/serve.d.ts +45 -0
  136. package/dist/cli/commands/serve.js +81 -0
  137. package/dist/cli/commands/templates.d.ts +8 -0
  138. package/dist/cli/commands/templates.js +54 -0
  139. package/dist/cli/commands/ui.d.ts +16 -0
  140. package/dist/cli/commands/ui.js +130 -0
  141. package/dist/cli/commands/validate.d.ts +12 -0
  142. package/dist/cli/commands/validate.js +247 -0
  143. package/dist/cli/commands/watch.d.ts +9 -0
  144. package/dist/cli/commands/watch.js +70 -0
  145. package/dist/cli/flow-weaver.mjs +92924 -0
  146. package/dist/cli/index.d.ts +9 -0
  147. package/dist/cli/index.js +742 -0
  148. package/dist/cli/templates/ai/mock-provider.d.ts +7 -0
  149. package/dist/cli/templates/ai/mock-provider.js +64 -0
  150. package/dist/cli/templates/ai/types.d.ts +47 -0
  151. package/dist/cli/templates/ai/types.js +5 -0
  152. package/dist/cli/templates/approvals/index.d.ts +15 -0
  153. package/dist/cli/templates/approvals/index.js +241 -0
  154. package/dist/cli/templates/index.d.ts +102 -0
  155. package/dist/cli/templates/index.js +101 -0
  156. package/dist/cli/templates/nodes/agent-router.d.ts +3 -0
  157. package/dist/cli/templates/nodes/agent-router.js +114 -0
  158. package/dist/cli/templates/nodes/aggregator.d.ts +7 -0
  159. package/dist/cli/templates/nodes/aggregator.js +63 -0
  160. package/dist/cli/templates/nodes/conversation-memory.d.ts +3 -0
  161. package/dist/cli/templates/nodes/conversation-memory.js +85 -0
  162. package/dist/cli/templates/nodes/http.d.ts +7 -0
  163. package/dist/cli/templates/nodes/http.js +80 -0
  164. package/dist/cli/templates/nodes/human-approval.d.ts +3 -0
  165. package/dist/cli/templates/nodes/human-approval.js +110 -0
  166. package/dist/cli/templates/nodes/json-extractor.d.ts +3 -0
  167. package/dist/cli/templates/nodes/json-extractor.js +119 -0
  168. package/dist/cli/templates/nodes/llm-call.d.ts +3 -0
  169. package/dist/cli/templates/nodes/llm-call.js +106 -0
  170. package/dist/cli/templates/nodes/prompt-template.d.ts +3 -0
  171. package/dist/cli/templates/nodes/prompt-template.js +52 -0
  172. package/dist/cli/templates/nodes/rag-retriever.d.ts +3 -0
  173. package/dist/cli/templates/nodes/rag-retriever.js +128 -0
  174. package/dist/cli/templates/nodes/tool-executor.d.ts +3 -0
  175. package/dist/cli/templates/nodes/tool-executor.js +108 -0
  176. package/dist/cli/templates/nodes/transformer.d.ts +7 -0
  177. package/dist/cli/templates/nodes/transformer.js +68 -0
  178. package/dist/cli/templates/nodes/validator.d.ts +7 -0
  179. package/dist/cli/templates/nodes/validator.js +62 -0
  180. package/dist/cli/templates/providers/index.d.ts +14 -0
  181. package/dist/cli/templates/providers/index.js +239 -0
  182. package/dist/cli/templates/shared/approval-types.d.ts +9 -0
  183. package/dist/cli/templates/shared/approval-types.js +31 -0
  184. package/dist/cli/templates/shared/llm-types.d.ts +15 -0
  185. package/dist/cli/templates/shared/llm-types.js +104 -0
  186. package/dist/cli/templates/workflows/aggregator.d.ts +7 -0
  187. package/dist/cli/templates/workflows/aggregator.js +104 -0
  188. package/dist/cli/templates/workflows/ai-agent-durable.d.ts +8 -0
  189. package/dist/cli/templates/workflows/ai-agent-durable.js +338 -0
  190. package/dist/cli/templates/workflows/ai-agent.d.ts +31 -0
  191. package/dist/cli/templates/workflows/ai-agent.js +326 -0
  192. package/dist/cli/templates/workflows/ai-chat.d.ts +7 -0
  193. package/dist/cli/templates/workflows/ai-chat.js +169 -0
  194. package/dist/cli/templates/workflows/ai-pipeline-durable.d.ts +8 -0
  195. package/dist/cli/templates/workflows/ai-pipeline-durable.js +330 -0
  196. package/dist/cli/templates/workflows/ai-rag.d.ts +7 -0
  197. package/dist/cli/templates/workflows/ai-rag.js +186 -0
  198. package/dist/cli/templates/workflows/ai-react.d.ts +7 -0
  199. package/dist/cli/templates/workflows/ai-react.js +294 -0
  200. package/dist/cli/templates/workflows/conditional.d.ts +12 -0
  201. package/dist/cli/templates/workflows/conditional.js +142 -0
  202. package/dist/cli/templates/workflows/error-handler.d.ts +7 -0
  203. package/dist/cli/templates/workflows/error-handler.js +147 -0
  204. package/dist/cli/templates/workflows/foreach.d.ts +7 -0
  205. package/dist/cli/templates/workflows/foreach.js +143 -0
  206. package/dist/cli/templates/workflows/sequential.d.ts +7 -0
  207. package/dist/cli/templates/workflows/sequential.js +198 -0
  208. package/dist/cli/templates/workflows/webhook.d.ts +7 -0
  209. package/dist/cli/templates/workflows/webhook.js +161 -0
  210. package/dist/cli/utils/logger.d.ts +15 -0
  211. package/dist/cli/utils/logger.js +46 -0
  212. package/dist/constants.d.ts +100 -0
  213. package/dist/constants.js +125 -0
  214. package/dist/defaults.d.ts +3 -0
  215. package/dist/defaults.js +3 -0
  216. package/dist/deployment/config/defaults.d.ts +29 -0
  217. package/dist/deployment/config/defaults.js +98 -0
  218. package/dist/deployment/config/loader.d.ts +24 -0
  219. package/dist/deployment/config/loader.js +236 -0
  220. package/dist/deployment/config/types.d.ts +117 -0
  221. package/dist/deployment/config/types.js +5 -0
  222. package/dist/deployment/core/adapters.d.ts +90 -0
  223. package/dist/deployment/core/adapters.js +251 -0
  224. package/dist/deployment/core/executor.d.ts +62 -0
  225. package/dist/deployment/core/executor.js +197 -0
  226. package/dist/deployment/core/formatters.d.ts +57 -0
  227. package/dist/deployment/core/formatters.js +170 -0
  228. package/dist/deployment/index.d.ts +31 -0
  229. package/dist/deployment/index.js +48 -0
  230. package/dist/deployment/openapi/generator.d.ts +146 -0
  231. package/dist/deployment/openapi/generator.js +347 -0
  232. package/dist/deployment/openapi/schema-converter.d.ts +49 -0
  233. package/dist/deployment/openapi/schema-converter.js +192 -0
  234. package/dist/deployment/targets/base.d.ts +316 -0
  235. package/dist/deployment/targets/base.js +823 -0
  236. package/dist/deployment/targets/cloudflare.d.ts +23 -0
  237. package/dist/deployment/targets/cloudflare.js +1125 -0
  238. package/dist/deployment/targets/inngest.d.ts +38 -0
  239. package/dist/deployment/targets/inngest.js +926 -0
  240. package/dist/deployment/targets/lambda.d.ts +23 -0
  241. package/dist/deployment/targets/lambda.js +1289 -0
  242. package/dist/deployment/targets/vercel.d.ts +23 -0
  243. package/dist/deployment/targets/vercel.js +886 -0
  244. package/dist/deployment/types.d.ts +183 -0
  245. package/dist/deployment/types.js +8 -0
  246. package/dist/diagram/geometry.d.ts +26 -0
  247. package/dist/diagram/geometry.js +850 -0
  248. package/dist/diagram/index.d.ts +16 -0
  249. package/dist/diagram/index.js +42 -0
  250. package/dist/diagram/layout.d.ts +11 -0
  251. package/dist/diagram/layout.js +143 -0
  252. package/dist/diagram/orthogonal-router.d.ts +79 -0
  253. package/dist/diagram/orthogonal-router.js +568 -0
  254. package/dist/diagram/renderer.d.ts +3 -0
  255. package/dist/diagram/renderer.js +207 -0
  256. package/dist/diagram/theme.d.ts +20 -0
  257. package/dist/diagram/theme.js +189 -0
  258. package/dist/diagram/types.d.ts +70 -0
  259. package/dist/diagram/types.js +2 -0
  260. package/dist/diff/WorkflowDiffer.d.ts +13 -0
  261. package/dist/diff/WorkflowDiffer.js +429 -0
  262. package/dist/diff/formatDiff.d.ts +10 -0
  263. package/dist/diff/formatDiff.js +220 -0
  264. package/dist/diff/impact.d.ts +29 -0
  265. package/dist/diff/impact.js +119 -0
  266. package/dist/diff/index.d.ts +10 -0
  267. package/dist/diff/index.js +9 -0
  268. package/dist/diff/types.d.ts +138 -0
  269. package/dist/diff/types.js +35 -0
  270. package/dist/doc-metadata/extractors/annotations.d.ts +56 -0
  271. package/dist/doc-metadata/extractors/annotations.js +337 -0
  272. package/dist/doc-metadata/extractors/cli-commands.d.ts +17 -0
  273. package/dist/doc-metadata/extractors/cli-commands.js +355 -0
  274. package/dist/doc-metadata/extractors/mcp-tools.d.ts +16 -0
  275. package/dist/doc-metadata/extractors/mcp-tools.js +689 -0
  276. package/dist/doc-metadata/extractors/plugin-api.d.ts +19 -0
  277. package/dist/doc-metadata/extractors/plugin-api.js +279 -0
  278. package/dist/doc-metadata/index.d.ts +5 -0
  279. package/dist/doc-metadata/index.js +4 -0
  280. package/dist/doc-metadata/types.d.ts +120 -0
  281. package/dist/doc-metadata/types.js +5 -0
  282. package/dist/editor-completions/annotationValues.d.ts +12 -0
  283. package/dist/editor-completions/annotationValues.js +138 -0
  284. package/dist/editor-completions/contextParser.d.ts +40 -0
  285. package/dist/editor-completions/contextParser.js +410 -0
  286. package/dist/editor-completions/dataTypes.d.ts +16 -0
  287. package/dist/editor-completions/dataTypes.js +95 -0
  288. package/dist/editor-completions/goToDefinition.d.ts +27 -0
  289. package/dist/editor-completions/goToDefinition.js +112 -0
  290. package/dist/editor-completions/index.d.ts +39 -0
  291. package/dist/editor-completions/index.js +181 -0
  292. package/dist/editor-completions/jsDocAnnotations.d.ts +29 -0
  293. package/dist/editor-completions/jsDocAnnotations.js +357 -0
  294. package/dist/editor-completions/modifierCompletions.d.ts +17 -0
  295. package/dist/editor-completions/modifierCompletions.js +197 -0
  296. package/dist/editor-completions/types.d.ts +119 -0
  297. package/dist/editor-completions/types.js +8 -0
  298. package/dist/export/index.d.ts +68 -0
  299. package/dist/export/index.js +1074 -0
  300. package/dist/export/templates.d.ts +24 -0
  301. package/dist/export/templates.js +186 -0
  302. package/dist/friendly-errors.d.ts +35 -0
  303. package/dist/friendly-errors.js +375 -0
  304. package/dist/function-like.d.ts +38 -0
  305. package/dist/function-like.js +83 -0
  306. package/dist/generated-branding.d.ts +16 -0
  307. package/dist/generated-branding.js +22 -0
  308. package/dist/generator/async-detection.d.ts +27 -0
  309. package/dist/generator/async-detection.js +56 -0
  310. package/dist/generator/code-utils.d.ts +76 -0
  311. package/dist/generator/code-utils.js +410 -0
  312. package/dist/generator/control-flow.d.ts +54 -0
  313. package/dist/generator/control-flow.js +284 -0
  314. package/dist/generator/inngest.d.ts +53 -0
  315. package/dist/generator/inngest.js +1126 -0
  316. package/dist/generator/scope-function-generator.d.ts +78 -0
  317. package/dist/generator/scope-function-generator.js +360 -0
  318. package/dist/generator/unified.d.ts +42 -0
  319. package/dist/generator/unified.js +1504 -0
  320. package/dist/generator.d.ts +54 -0
  321. package/dist/generator.js +100 -0
  322. package/dist/index.d.ts +85 -0
  323. package/dist/index.js +89 -0
  324. package/dist/jsdoc-parser.d.ts +308 -0
  325. package/dist/jsdoc-parser.js +923 -0
  326. package/dist/jsdoc-port-sync/constants.d.ts +41 -0
  327. package/dist/jsdoc-port-sync/constants.js +103 -0
  328. package/dist/jsdoc-port-sync/diff.d.ts +76 -0
  329. package/dist/jsdoc-port-sync/diff.js +319 -0
  330. package/dist/jsdoc-port-sync/index.d.ts +42 -0
  331. package/dist/jsdoc-port-sync/index.js +45 -0
  332. package/dist/jsdoc-port-sync/port-parser.d.ts +68 -0
  333. package/dist/jsdoc-port-sync/port-parser.js +579 -0
  334. package/dist/jsdoc-port-sync/rename.d.ts +21 -0
  335. package/dist/jsdoc-port-sync/rename.js +256 -0
  336. package/dist/jsdoc-port-sync/signature-parser.d.ts +104 -0
  337. package/dist/jsdoc-port-sync/signature-parser.js +559 -0
  338. package/dist/jsdoc-port-sync/sync.d.ts +36 -0
  339. package/dist/jsdoc-port-sync/sync.js +644 -0
  340. package/dist/jsdoc-port-sync.d.ts +10 -0
  341. package/dist/jsdoc-port-sync.js +10 -0
  342. package/dist/marketplace/index.d.ts +11 -0
  343. package/dist/marketplace/index.js +10 -0
  344. package/dist/marketplace/manifest.d.ts +32 -0
  345. package/dist/marketplace/manifest.js +176 -0
  346. package/dist/marketplace/registry.d.ts +30 -0
  347. package/dist/marketplace/registry.js +100 -0
  348. package/dist/marketplace/types.d.ts +154 -0
  349. package/dist/marketplace/types.js +9 -0
  350. package/dist/marketplace/validator.d.ts +13 -0
  351. package/dist/marketplace/validator.js +131 -0
  352. package/dist/mcp/auto-registration.d.ts +3 -0
  353. package/dist/mcp/auto-registration.js +62 -0
  354. package/dist/mcp/editor-connection.d.ts +50 -0
  355. package/dist/mcp/editor-connection.js +125 -0
  356. package/dist/mcp/event-buffer.d.ts +62 -0
  357. package/dist/mcp/event-buffer.js +150 -0
  358. package/dist/mcp/index.d.ts +12 -0
  359. package/dist/mcp/index.js +11 -0
  360. package/dist/mcp/resources.d.ts +14 -0
  361. package/dist/mcp/resources.js +55 -0
  362. package/dist/mcp/response-utils.d.ts +63 -0
  363. package/dist/mcp/response-utils.js +89 -0
  364. package/dist/mcp/server.d.ts +4 -0
  365. package/dist/mcp/server.js +99 -0
  366. package/dist/mcp/tools-diagram.d.ts +8 -0
  367. package/dist/mcp/tools-diagram.js +53 -0
  368. package/dist/mcp/tools-editor.d.ts +5 -0
  369. package/dist/mcp/tools-editor.js +190 -0
  370. package/dist/mcp/tools-export.d.ts +9 -0
  371. package/dist/mcp/tools-export.js +180 -0
  372. package/dist/mcp/tools-marketplace.d.ts +9 -0
  373. package/dist/mcp/tools-marketplace.js +132 -0
  374. package/dist/mcp/tools-pattern.d.ts +3 -0
  375. package/dist/mcp/tools-pattern.js +783 -0
  376. package/dist/mcp/tools-query.d.ts +3 -0
  377. package/dist/mcp/tools-query.js +364 -0
  378. package/dist/mcp/tools-template.d.ts +10 -0
  379. package/dist/mcp/tools-template.js +119 -0
  380. package/dist/mcp/types.d.ts +70 -0
  381. package/dist/mcp/types.js +8 -0
  382. package/dist/mcp/workflow-executor.d.ts +47 -0
  383. package/dist/mcp/workflow-executor.js +133 -0
  384. package/dist/migration/registry.d.ts +30 -0
  385. package/dist/migration/registry.js +29 -0
  386. package/dist/node-types-generator.d.ts +49 -0
  387. package/dist/node-types-generator.js +139 -0
  388. package/dist/npm-packages.d.ts +56 -0
  389. package/dist/npm-packages.js +255 -0
  390. package/dist/parser.d.ts +204 -0
  391. package/dist/parser.js +2100 -0
  392. package/dist/plugin/PluginPanel.d.ts +12 -0
  393. package/dist/plugin/PluginPanel.js +5 -0
  394. package/dist/plugin/index.d.ts +13 -0
  395. package/dist/plugin/index.js +14 -0
  396. package/dist/plugin/types.d.ts +75 -0
  397. package/dist/plugin/types.js +8 -0
  398. package/dist/resolve-package-types.d.ts +17 -0
  399. package/dist/resolve-package-types.js +123 -0
  400. package/dist/runtime/CancellationError.d.ts +11 -0
  401. package/dist/runtime/CancellationError.js +20 -0
  402. package/dist/runtime/ExecutionContext.d.ts +146 -0
  403. package/dist/runtime/ExecutionContext.js +235 -0
  404. package/dist/runtime/builtin-functions.d.ts +8 -0
  405. package/dist/runtime/builtin-functions.js +549 -0
  406. package/dist/runtime/events.d.ts +50 -0
  407. package/dist/runtime/events.js +2 -0
  408. package/dist/runtime/function-registry.d.ts +59 -0
  409. package/dist/runtime/function-registry.js +66 -0
  410. package/dist/runtime/index.d.ts +7 -0
  411. package/dist/runtime/index.js +7 -0
  412. package/dist/runtime/parameter-resolver.d.ts +62 -0
  413. package/dist/runtime/parameter-resolver.js +113 -0
  414. package/dist/server/index.d.ts +7 -0
  415. package/dist/server/index.js +6 -0
  416. package/dist/server/types.d.ts +93 -0
  417. package/dist/server/types.js +5 -0
  418. package/dist/server/webhook-server.d.ts +50 -0
  419. package/dist/server/webhook-server.js +269 -0
  420. package/dist/server/workflow-registry.d.ts +61 -0
  421. package/dist/server/workflow-registry.js +202 -0
  422. package/dist/shared-project.d.ts +9 -0
  423. package/dist/shared-project.js +28 -0
  424. package/dist/sugar-optimizer.d.ts +40 -0
  425. package/dist/sugar-optimizer.js +387 -0
  426. package/dist/testing/assertions.d.ts +51 -0
  427. package/dist/testing/assertions.js +127 -0
  428. package/dist/testing/index.d.ts +30 -0
  429. package/dist/testing/index.js +24 -0
  430. package/dist/testing/mock-approval.d.ts +81 -0
  431. package/dist/testing/mock-approval.js +98 -0
  432. package/dist/testing/mock-llm.d.ts +124 -0
  433. package/dist/testing/mock-llm.js +119 -0
  434. package/dist/testing/recorder.d.ts +72 -0
  435. package/dist/testing/recorder.js +70 -0
  436. package/dist/testing/replayer.d.ts +56 -0
  437. package/dist/testing/replayer.js +143 -0
  438. package/dist/testing/token-tracker.d.ts +71 -0
  439. package/dist/testing/token-tracker.js +94 -0
  440. package/dist/type-checker.d.ts +42 -0
  441. package/dist/type-checker.js +190 -0
  442. package/dist/type-mappings.d.ts +29 -0
  443. package/dist/type-mappings.js +125 -0
  444. package/dist/types/branded-ports.d.ts +151 -0
  445. package/dist/types/branded-ports.js +121 -0
  446. package/dist/types/index.d.ts +5 -0
  447. package/dist/types/index.js +5 -0
  448. package/dist/types.d.ts +139 -0
  449. package/dist/types.js +15 -0
  450. package/dist/utils/error-utils.d.ts +15 -0
  451. package/dist/utils/error-utils.js +27 -0
  452. package/dist/utils/lru-cache.d.ts +15 -0
  453. package/dist/utils/lru-cache.js +40 -0
  454. package/dist/utils/port-ordering.d.ts +26 -0
  455. package/dist/utils/port-ordering.js +88 -0
  456. package/dist/utils/port-tag-utils.d.ts +23 -0
  457. package/dist/utils/port-tag-utils.js +41 -0
  458. package/dist/utils/string-distance.d.ts +14 -0
  459. package/dist/utils/string-distance.js +56 -0
  460. package/dist/validation/agent-detection.d.ts +33 -0
  461. package/dist/validation/agent-detection.js +115 -0
  462. package/dist/validation/agent-rules.d.ts +48 -0
  463. package/dist/validation/agent-rules.js +262 -0
  464. package/dist/validator.d.ts +92 -0
  465. package/dist/validator.js +970 -0
  466. package/package.json +109 -0
@@ -0,0 +1,78 @@
1
+ import type { TNodeTypeAST, TWorkflowAST, TNodeInstanceAST } from '../ast/index.js';
2
+ /**
3
+ * Generate a scope function closure for a scoped port (e.g., forEach iteration callback).
4
+ *
5
+ * ## Scoped Port Architecture (Key Concept)
6
+ *
7
+ * Scoped nodes enable iteration patterns WITHOUT graph cycles. The port directions
8
+ * are intentionally INVERTED from what you might expect:
9
+ *
10
+ * | Port Type | Direction | Purpose | Becomes in Closure |
11
+ * |-----------|-----------|---------|-------------------|
12
+ * | Scoped OUTPUT | From parent to children | Parameters like `item`, `start` | Function parameters |
13
+ * | Scoped INPUT | From children to parent | Returns like `success`, `result` | Return object fields |
14
+ *
15
+ * **Why the inversion?**
16
+ * - OUTPUT ports on the parent node emit data TO children (function params)
17
+ * - INPUT ports on the parent node receive data FROM children (function returns)
18
+ * - This allows the loop to happen in imperative code, not the graph
19
+ *
20
+ * ## Generated Closure Structure:
21
+ * ```typescript
22
+ * ((ctx) => {
23
+ * return async (start: boolean, item: unknown) => {
24
+ * // 1. Create isolated scope context (cleanScope=true)
25
+ * const scopedCtx = ctx.createScope('parent', parentIdx, 'scopeName', true);
26
+ *
27
+ * // 2. Store scope parameters as variables (scoped OUTPUT ports)
28
+ * await scopedCtx.setVariable({ id: 'parent', portName: 'start', scope, side: 'start' }, start);
29
+ * await scopedCtx.setVariable({ id: 'parent', portName: 'item', scope, side: 'start' }, item);
30
+ *
31
+ * // 3. Execute child nodes in topological order
32
+ * const childIdx = scopedCtx.addExecution('childNode');
33
+ * const childResult = await childFunction(execute, ...args);
34
+ *
35
+ * // 4. Merge scope execution back to parent context
36
+ * ctx.mergeScope(scopedCtx);
37
+ *
38
+ * // 5. Collect return values from scoped INPUT ports
39
+ * const result = scopedCtx.getVariable({ id: 'childNode', portName: 'result' });
40
+ *
41
+ * // 6. Return collected values to parent
42
+ * return { success: true, failure: false, result };
43
+ * };
44
+ * })(ctx)
45
+ * ```
46
+ *
47
+ * ## Execution Context Isolation:
48
+ * - `cleanScope=true`: Each call gets fresh variables (forEach pattern)
49
+ * - `cleanScope=false`: Variables inherited from parent (node-level scopes)
50
+ * - `mergeScope()`: Accumulates execution records back to parent after call
51
+ *
52
+ * ## Example forEach Pattern:
53
+ * ```
54
+ * forEach node declares:
55
+ * @scope processItem
56
+ * @output start scope:processItem // → function param (trigger)
57
+ * @output item scope:processItem // → function param (current item)
58
+ * @input success scope:processItem // → return value (completion signal)
59
+ * @input processed scope:processItem // → return value (processed item)
60
+ *
61
+ * forEach implementation calls:
62
+ * for (const item of items) {
63
+ * const result = await processItem(true, item); // Generated closure!
64
+ * results.push(result.processed);
65
+ * }
66
+ * ```
67
+ *
68
+ * @param scopeName - Name of the scope (e.g., "processItem", "iteration")
69
+ * @param parentNodeId - ID of the parent node instance declaring this scope
70
+ * @param parentNodeType - The parent node type definition with scoped port specs
71
+ * @param workflow - The workflow AST containing child instances and connections
72
+ * @param childInstances - Node instances nested in this scope (have parent.scope = scopeName)
73
+ * @param isAsync - Whether to generate async closure (adds await, async keyword)
74
+ * @param production - If true, omits debug instrumentation
75
+ * @returns Generated closure code string to be used as a function argument
76
+ */
77
+ export declare function generateScopeFunctionClosure(scopeName: string, parentNodeId: string, parentNodeType: TNodeTypeAST, workflow: TWorkflowAST, childInstances: TNodeInstanceAST[], isAsync: boolean, production: boolean): string;
78
+ //# sourceMappingURL=scope-function-generator.d.ts.map
@@ -0,0 +1,360 @@
1
+ import { isSuccessPort, isFailurePort } from '../constants.js';
2
+ import { buildNodeArgumentsWithContext, toValidIdentifier } from './code-utils.js';
3
+ import { performKahnsTopologicalSort, buildControlFlowGraph } from './control-flow.js';
4
+ import { mapToTypeScript } from '../type-mappings.js';
5
+ /**
6
+ * Generate a scope function closure for a scoped port (e.g., forEach iteration callback).
7
+ *
8
+ * ## Scoped Port Architecture (Key Concept)
9
+ *
10
+ * Scoped nodes enable iteration patterns WITHOUT graph cycles. The port directions
11
+ * are intentionally INVERTED from what you might expect:
12
+ *
13
+ * | Port Type | Direction | Purpose | Becomes in Closure |
14
+ * |-----------|-----------|---------|-------------------|
15
+ * | Scoped OUTPUT | From parent to children | Parameters like `item`, `start` | Function parameters |
16
+ * | Scoped INPUT | From children to parent | Returns like `success`, `result` | Return object fields |
17
+ *
18
+ * **Why the inversion?**
19
+ * - OUTPUT ports on the parent node emit data TO children (function params)
20
+ * - INPUT ports on the parent node receive data FROM children (function returns)
21
+ * - This allows the loop to happen in imperative code, not the graph
22
+ *
23
+ * ## Generated Closure Structure:
24
+ * ```typescript
25
+ * ((ctx) => {
26
+ * return async (start: boolean, item: unknown) => {
27
+ * // 1. Create isolated scope context (cleanScope=true)
28
+ * const scopedCtx = ctx.createScope('parent', parentIdx, 'scopeName', true);
29
+ *
30
+ * // 2. Store scope parameters as variables (scoped OUTPUT ports)
31
+ * await scopedCtx.setVariable({ id: 'parent', portName: 'start', scope, side: 'start' }, start);
32
+ * await scopedCtx.setVariable({ id: 'parent', portName: 'item', scope, side: 'start' }, item);
33
+ *
34
+ * // 3. Execute child nodes in topological order
35
+ * const childIdx = scopedCtx.addExecution('childNode');
36
+ * const childResult = await childFunction(execute, ...args);
37
+ *
38
+ * // 4. Merge scope execution back to parent context
39
+ * ctx.mergeScope(scopedCtx);
40
+ *
41
+ * // 5. Collect return values from scoped INPUT ports
42
+ * const result = scopedCtx.getVariable({ id: 'childNode', portName: 'result' });
43
+ *
44
+ * // 6. Return collected values to parent
45
+ * return { success: true, failure: false, result };
46
+ * };
47
+ * })(ctx)
48
+ * ```
49
+ *
50
+ * ## Execution Context Isolation:
51
+ * - `cleanScope=true`: Each call gets fresh variables (forEach pattern)
52
+ * - `cleanScope=false`: Variables inherited from parent (node-level scopes)
53
+ * - `mergeScope()`: Accumulates execution records back to parent after call
54
+ *
55
+ * ## Example forEach Pattern:
56
+ * ```
57
+ * forEach node declares:
58
+ * @scope processItem
59
+ * @output start scope:processItem // → function param (trigger)
60
+ * @output item scope:processItem // → function param (current item)
61
+ * @input success scope:processItem // → return value (completion signal)
62
+ * @input processed scope:processItem // → return value (processed item)
63
+ *
64
+ * forEach implementation calls:
65
+ * for (const item of items) {
66
+ * const result = await processItem(true, item); // Generated closure!
67
+ * results.push(result.processed);
68
+ * }
69
+ * ```
70
+ *
71
+ * @param scopeName - Name of the scope (e.g., "processItem", "iteration")
72
+ * @param parentNodeId - ID of the parent node instance declaring this scope
73
+ * @param parentNodeType - The parent node type definition with scoped port specs
74
+ * @param workflow - The workflow AST containing child instances and connections
75
+ * @param childInstances - Node instances nested in this scope (have parent.scope = scopeName)
76
+ * @param isAsync - Whether to generate async closure (adds await, async keyword)
77
+ * @param production - If true, omits debug instrumentation
78
+ * @returns Generated closure code string to be used as a function argument
79
+ */
80
+ export function generateScopeFunctionClosure(scopeName, parentNodeId, parentNodeType, workflow, childInstances, isAsync, production) {
81
+ const lines = [];
82
+ // Extract scoped ports for this scope
83
+ const scopedOutputPorts = []; // Parameters to the scope function
84
+ const scopedInputPorts = []; // Return values from the scope function
85
+ Object.entries(parentNodeType.outputs).forEach(([portName, portDef]) => {
86
+ // Scoped OUTPUT ports become function parameters (include execute, but exclude FUNCTION type)
87
+ if (portDef.scope === scopeName && portDef.dataType !== 'FUNCTION') {
88
+ scopedOutputPorts.push(portName);
89
+ }
90
+ });
91
+ Object.entries(parentNodeType.inputs).forEach(([portName, portDef]) => {
92
+ // Include ALL scoped INPUT ports in return object, including success/failure
93
+ // The callback type expects { success: boolean; failure: boolean; ...data }
94
+ if (portDef.scope === scopeName) {
95
+ scopedInputPorts.push(portName);
96
+ }
97
+ });
98
+ // Generate function signature
99
+ // Parameters: all scoped OUTPUT ports (what the parent provides to the scope)
100
+ const awaitKeyword = isAsync ? 'async ' : '';
101
+ const params = scopedOutputPorts
102
+ .map((p) => {
103
+ const portDef = parentNodeType.outputs[p];
104
+ const portType = portDef ? mapToTypeScript(portDef.dataType, portDef.tsType) : 'unknown';
105
+ return `${p}: ${portType}`;
106
+ })
107
+ .join(', ');
108
+ // Start closure: ((ctx) => { ... })(ctx)
109
+ lines.push(`((ctx) => {`);
110
+ lines.push(` return ${awaitKeyword}(${params}) => {`);
111
+ lines.push(` // Scope function body for '${scopeName}'`);
112
+ lines.push(``);
113
+ // Create scoped execution context for isolation
114
+ // Pass cleanScope=true for per-port function scopes (each call gets fresh variables)
115
+ const safeParentId = toValidIdentifier(parentNodeId);
116
+ lines.push(` // Create scoped context for child nodes`);
117
+ lines.push(` const scopedCtx = ctx.createScope('${parentNodeId}', ${safeParentId}Idx!, '${scopeName}', true);`);
118
+ lines.push(``);
119
+ // Set scope parameter values in execution context
120
+ // These become available to child nodes as outputs from the parent node
121
+ if (scopedOutputPorts.length > 0) {
122
+ lines.push(` // Set scope parameters as variables for child nodes`);
123
+ scopedOutputPorts.forEach((portName) => {
124
+ // Store using parent node ID so connections from parent.port work
125
+ lines.push(` const scopeParamIdx_${portName} = scopedCtx.addExecution('${parentNodeId}_param_${portName}');`);
126
+ const setCall = isAsync ? `await scopedCtx.setVariable` : `scopedCtx.setVariable`;
127
+ // Include scope and side for scoped OUTPUT ports (start side of scope)
128
+ lines.push(` ${setCall}({ id: '${parentNodeId}', portName: '${portName}', executionIndex: scopeParamIdx_${portName}, nodeTypeName: '${parentNodeType.functionName}', scope: '${scopeName}', side: 'start' }, ${portName});`);
129
+ });
130
+ lines.push(``);
131
+ }
132
+ // Execute child nodes
133
+ if (childInstances.length > 0) {
134
+ lines.push(` // Execute child nodes in topologically sorted order`);
135
+ // Build control flow graph for children only
136
+ const childIds = childInstances.map((c) => c.id);
137
+ const childConnections = workflow.connections.filter((conn) => {
138
+ // Include child-to-child connections
139
+ if (childIds.includes(conn.from.node) && childIds.includes(conn.to.node)) {
140
+ return true;
141
+ }
142
+ // Include connections from parent's scoped OUTPUT ports to children
143
+ if (conn.from.node === parentNodeId && childIds.includes(conn.to.node)) {
144
+ // Check if the source port is a scoped OUTPUT port for this scope
145
+ const sourcePort = parentNodeType.outputs[conn.from.port];
146
+ if (sourcePort && sourcePort.scope === scopeName) {
147
+ return true;
148
+ }
149
+ }
150
+ return false;
151
+ });
152
+ // Create a minimal workflow for topological sorting
153
+ // Include a virtual parent instance so connections from parent ports can be resolved
154
+ const parentVirtualInstance = {
155
+ type: 'NodeInstance',
156
+ id: parentNodeId,
157
+ nodeType: parentNodeType.functionName,
158
+ parent: undefined,
159
+ };
160
+ const scopeWorkflow = {
161
+ ...workflow,
162
+ instances: [parentVirtualInstance, ...childInstances],
163
+ connections: childConnections,
164
+ };
165
+ // Get node types for children
166
+ const childNodeTypes = childInstances
167
+ .map((c) => {
168
+ return workflow.nodeTypes?.find((nt) => nt.name === c.nodeType || nt.functionName === c.nodeType);
169
+ })
170
+ .filter((nt) => nt !== undefined);
171
+ const cfg = buildControlFlowGraph(scopeWorkflow, childNodeTypes);
172
+ const sortedChildren = performKahnsTopologicalSort(cfg);
173
+ sortedChildren.forEach((childId) => {
174
+ const child = childInstances.find((c) => c.id === childId);
175
+ if (!child)
176
+ return;
177
+ const childNodeType = workflow.nodeTypes?.find((nt) => nt.name === child.nodeType || nt.functionName === child.nodeType);
178
+ if (!childNodeType) {
179
+ lines.push(` // WARNING: Node type '${child.nodeType}' not found for child '${child.id}'`);
180
+ return;
181
+ }
182
+ const safeChildId = toValidIdentifier(child.id);
183
+ lines.push(``);
184
+ lines.push(` // Execute: ${child.id} (${child.nodeType})`);
185
+ lines.push(` scopedCtx.checkAborted('${child.id}');`);
186
+ lines.push(` const ${safeChildId}Idx = scopedCtx.addExecution('${child.id}');`);
187
+ lines.push(` scopedCtx.sendStatusChangedEvent({`);
188
+ lines.push(` nodeTypeName: '${child.nodeType}',`);
189
+ lines.push(` id: '${child.id}',`);
190
+ lines.push(` executionIndex: ${safeChildId}Idx,`);
191
+ lines.push(` status: 'RUNNING',`);
192
+ lines.push(` });`);
193
+ lines.push(` try {`);
194
+ // Pre-handle connections from parent scoped OUTPUT ports with correct index variables
195
+ const argLines = [];
196
+ const getCall = isAsync ? 'await scopedCtx.getVariable' : 'scopedCtx.getVariable';
197
+ const childSetCall = isAsync ? `await scopedCtx.setVariable` : `scopedCtx.setVariable`;
198
+ const preHandledPorts = new Set();
199
+ // Find connections from parent scoped OUTPUT ports to this child
200
+ const parentConnections = workflow.connections.filter((conn) => conn.from.node === parentNodeId && conn.to.node === child.id);
201
+ parentConnections.forEach((conn) => {
202
+ const sourcePort = parentNodeType.outputs[conn.from.port];
203
+ if (sourcePort && sourcePort.scope === scopeName) {
204
+ // This is a scoped OUTPUT port - use scope parameter index
205
+ const targetPort = conn.to.port;
206
+ const varName = `${safeChildId}_${targetPort}`;
207
+ const scopeParamIdxVar = `scopeParamIdx_${conn.from.port}`;
208
+ // Get the target port type for the type cast
209
+ const targetPortDef = childNodeType.inputs[targetPort];
210
+ const portType = targetPortDef
211
+ ? mapToTypeScript(targetPortDef.dataType, targetPortDef.tsType)
212
+ : 'unknown';
213
+ argLines.push(` const ${varName} = ${getCall}({ id: '${parentNodeId}', portName: '${conn.from.port}', executionIndex: ${scopeParamIdxVar} }) as ${portType};`);
214
+ // Emit VARIABLE_SET for the child's INPUT port so breakpoints and inspection work
215
+ argLines.push(` ${childSetCall}({ id: '${child.id}', portName: '${targetPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, ${varName});`);
216
+ preHandledPorts.add(targetPort);
217
+ }
218
+ });
219
+ // Build remaining arguments using buildNodeArgumentsWithContext
220
+ const args = buildNodeArgumentsWithContext({
221
+ node: childNodeType,
222
+ workflow: scopeWorkflow,
223
+ id: child.id,
224
+ lines: argLines,
225
+ indent: ` `,
226
+ getCall,
227
+ isAsync,
228
+ instanceParent: child.parent ? `${child.parent.id}.${child.parent.scope}` : undefined,
229
+ skipPorts: preHandledPorts,
230
+ emitInputEvents: true,
231
+ setCall: childSetCall,
232
+ nodeTypeName: child.nodeType,
233
+ });
234
+ // Add argument building lines
235
+ argLines.forEach((line) => lines.push(line));
236
+ // Call the child node function
237
+ const awaitPrefix = isAsync ? 'await ' : '';
238
+ if (childNodeType.expression) {
239
+ // Expression nodes use original signature (positional args, no execute)
240
+ lines.push(` const ${safeChildId}Result = ${awaitPrefix}${child.nodeType}(${args.join(', ')});`);
241
+ }
242
+ else {
243
+ // Regular node call with positional arguments
244
+ lines.push(` const ${safeChildId}Result = ${awaitPrefix}${child.nodeType}(${args.join(', ')});`);
245
+ }
246
+ // Store outputs (including onSuccess/onFailure for debugging)
247
+ // Expression nodes don't return onSuccess/onFailure — hardcode them
248
+ if (childNodeType.expression) {
249
+ Object.keys(childNodeType.outputs || {}).forEach((outPort) => {
250
+ const portDef = childNodeType.outputs[outPort];
251
+ if (portDef.failure || isFailurePort(outPort)) {
252
+ // Failure ports always false on success (expression nodes always succeed)
253
+ lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, false);`);
254
+ }
255
+ else if (portDef.isControlFlow || isSuccessPort(outPort)) {
256
+ // Success control flow ports always true (expression nodes always succeed)
257
+ lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, true);`);
258
+ }
259
+ else {
260
+ // Data outputs read from result object
261
+ lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, ${safeChildId}Result.${outPort});`);
262
+ }
263
+ });
264
+ }
265
+ else {
266
+ Object.keys(childNodeType.outputs || {}).forEach((outPort) => {
267
+ lines.push(` ${childSetCall}({ id: '${child.id}', portName: '${outPort}', executionIndex: ${safeChildId}Idx, nodeTypeName: '${child.nodeType}' }, ${safeChildId}Result.${outPort});`);
268
+ });
269
+ }
270
+ // Add SUCCEEDED status event
271
+ lines.push(` scopedCtx.sendStatusChangedEvent({`);
272
+ lines.push(` nodeTypeName: '${child.nodeType}',`);
273
+ lines.push(` id: '${child.id}',`);
274
+ lines.push(` executionIndex: ${safeChildId}Idx,`);
275
+ lines.push(` status: 'SUCCEEDED',`);
276
+ lines.push(` });`);
277
+ lines.push(` } catch (error: unknown) {`);
278
+ lines.push(` const isCancellation = CancellationError.isCancellationError(error);`);
279
+ lines.push(` scopedCtx.sendStatusChangedEvent({`);
280
+ lines.push(` nodeTypeName: '${child.nodeType}',`);
281
+ lines.push(` id: '${child.id}',`);
282
+ lines.push(` executionIndex: ${safeChildId}Idx,`);
283
+ lines.push(` status: isCancellation ? 'CANCELLED' : 'FAILED',`);
284
+ lines.push(` });`);
285
+ lines.push(` if (!isCancellation) {`);
286
+ lines.push(` scopedCtx.sendLogErrorEvent({`);
287
+ lines.push(` nodeTypeName: '${child.nodeType}',`);
288
+ lines.push(` id: '${child.id}',`);
289
+ lines.push(` executionIndex: ${safeChildId}Idx,`);
290
+ lines.push(` error: error instanceof Error ? error.message : String(error),`);
291
+ lines.push(` });`);
292
+ lines.push(` }`);
293
+ lines.push(` throw error;`);
294
+ lines.push(` }`);
295
+ });
296
+ lines.push(``);
297
+ }
298
+ // Merge scope back to parent context
299
+ lines.push(` // Merge scoped execution back to parent context`);
300
+ lines.push(` ctx.mergeScope(scopedCtx);`);
301
+ lines.push(``);
302
+ // Extract return values from scoped INPUT ports
303
+ // These are the outputs of child nodes that become the scope function's return value
304
+ lines.push(` // Extract return values from child outputs`);
305
+ const returnObj = [];
306
+ // After mergeScope, use ctx (parent context) not scopedCtx for all variable access
307
+ const getCallAfterMerge = isAsync ? 'await ctx.getVariable' : 'ctx.getVariable';
308
+ // Create per-iteration execution index for scoped exit ports (so each iteration shows separately in UI)
309
+ // Use ctx (parent context) not scopedCtx so indices accumulate across iterations
310
+ lines.push(` const scopeExitIdx = ctx.addExecution('${parentNodeId}_scope_exit');`);
311
+ scopedInputPorts.forEach((portName) => {
312
+ // Find connections TO this scoped INPUT port FROM child nodes
313
+ // The source of the connection tells us which child output to read
314
+ const connection = workflow.connections.find((conn) => {
315
+ return conn.to.port === portName && childInstances.some((c) => c.id === conn.from.node);
316
+ });
317
+ // Get the port definition for type casting
318
+ const portDef = parentNodeType.inputs[portName];
319
+ const portType = portDef ? mapToTypeScript(portDef.dataType, portDef.tsType) : 'unknown';
320
+ if (connection) {
321
+ const sourceNode = connection.from.node;
322
+ const sourcePort = connection.from.port;
323
+ const varName = `scopeReturn_${portName}`;
324
+ // Find the child instance to get its node type name
325
+ const childInstance = childInstances.find((c) => c.id === sourceNode);
326
+ const sourceNodeTypeName = childInstance?.nodeType ?? '';
327
+ const varAddr = `{ id: '${sourceNode}', portName: '${sourcePort}', executionIndex: ${toValidIdentifier(sourceNode)}Idx, nodeTypeName: '${sourceNodeTypeName}' }`;
328
+ // STEP ports (success/failure) may be undefined for expression nodes — use hasVariable with default
329
+ const isStepPort = portName === 'success' || portName === 'failure';
330
+ const defaultValue = portName === 'success' ? 'true' : portName === 'failure' ? 'false' : 'undefined';
331
+ if (isStepPort) {
332
+ lines.push(` const ${varName} = ctx.hasVariable(${varAddr}) ? ${getCallAfterMerge}(${varAddr}) as ${portType} : ${defaultValue};`);
333
+ }
334
+ else {
335
+ lines.push(` const ${varName} = ${getCallAfterMerge}(${varAddr}) as ${portType};`);
336
+ }
337
+ // Emit VARIABLE_SET for the parent's scoped INPUT port (debug mode only)
338
+ if (!production) {
339
+ const setCallAfterMerge = isAsync ? 'await ctx.setVariable' : 'ctx.setVariable';
340
+ lines.push(` ${setCallAfterMerge}({ id: '${parentNodeId}', portName: '${portName}', executionIndex: scopeExitIdx, scope: '${scopeName}', side: 'exit', nodeTypeName: '${parentNodeType.functionName}' }, ${varName});`);
341
+ }
342
+ returnObj.push(`${portName}: ${varName}`);
343
+ }
344
+ else {
345
+ // No connection found - default STEP ports to true/false, others to undefined
346
+ const defaultValue = portName === 'success' ? 'true' : portName === 'failure' ? 'false' : 'undefined';
347
+ // Emit VARIABLE_SET for unconnected ports (debug mode only)
348
+ if (!production) {
349
+ const setCallAfterMerge = isAsync ? 'await ctx.setVariable' : 'ctx.setVariable';
350
+ lines.push(` ${setCallAfterMerge}({ id: '${parentNodeId}', portName: '${portName}', executionIndex: scopeExitIdx, scope: '${scopeName}', side: 'exit', nodeTypeName: '${parentNodeType.functionName}' }, ${defaultValue});`);
351
+ }
352
+ returnObj.push(`${portName}: ${defaultValue}`);
353
+ }
354
+ });
355
+ lines.push(` return { ${returnObj.join(', ')} };`);
356
+ lines.push(` };`);
357
+ lines.push(`})(ctx)`);
358
+ return lines.join('\n ');
359
+ }
360
+ //# sourceMappingURL=scope-function-generator.js.map
@@ -0,0 +1,42 @@
1
+ import type { TNodeTypeAST, TWorkflowAST } from '../ast/types.js';
2
+ /**
3
+ * Generates executable TypeScript code from a workflow AST using ExecutionContext for state management.
4
+ *
5
+ * This is the main code generation function that transforms a visual workflow into runnable code.
6
+ *
7
+ * ## Algorithm Overview:
8
+ * 1. **Setup Phase**: Initialize ExecutionContext, set recursion depth protection
9
+ * 2. **Start Node**: Store workflow parameters as Start node outputs
10
+ * 3. **Control Flow Graph**: Build CFG from connections, perform topological sort
11
+ * 4. **Branch Detection**: Identify branching nodes (with onSuccess/onFailure) and their regions
12
+ * 5. **Code Generation**: For each node in execution order:
13
+ * - Regular nodes: Generate direct execution with variable storage
14
+ * - Branching nodes: Generate if/else blocks for success/failure paths
15
+ * - Scoped children: Generate scope function closures (for forEach, etc.)
16
+ * - Pull nodes: Generate lazy executors registered with context
17
+ * 6. **Exit Node**: Collect outputs and return result object
18
+ *
19
+ * ## Key Concepts:
20
+ * - **Branching Nodes**: Nodes with both onSuccess and onFailure ports create conditional branches
21
+ * - **Per-Port Scoped Children**: Children of forEach-like nodes execute via closure functions
22
+ * - **Pull Execution**: Nodes marked for lazy evaluation only run when outputs are consumed
23
+ * - **Execution Index**: Each node execution gets a unique index for variable tracking
24
+ *
25
+ * ## Generated Code Structure:
26
+ * ```typescript
27
+ * const ctx = new GeneratedExecutionContext(isAsync, debugger?);
28
+ * const startIdx = ctx.addExecution('Start');
29
+ * ctx.setVariable({ id: 'Start', portName: 'param', ... }, value);
30
+ * // ... node executions in topological order ...
31
+ * const exitIdx = ctx.addExecution('Exit');
32
+ * return { onSuccess: ..., onFailure: ..., ...outputs };
33
+ * ```
34
+ *
35
+ * @param workflow - The workflow AST to generate code for
36
+ * @param nodeTypes - Available node type definitions (includes workflow's nodeTypes + imports)
37
+ * @param isAsync - Whether to generate async code (adds await, returns Promise)
38
+ * @param production - If true, omits debug instrumentation for smaller output
39
+ * @returns Generated TypeScript function body (without function signature)
40
+ */
41
+ export declare function generateControlFlowWithExecutionContext(workflow: TWorkflowAST, nodeTypes: TNodeTypeAST[], isAsync: boolean, production?: boolean, bundleMode?: boolean): string;
42
+ //# sourceMappingURL=unified.d.ts.map