@synergenius/flow-weaver 0.33.1 → 0.44.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 (922) hide show
  1. package/LICENSE +201 -226
  2. package/NOTICE +13 -0
  3. package/README.md +152 -244
  4. package/dist/agent/agent-loop.d.ts +4 -2
  5. package/dist/agent/cli-session.d.ts +3 -3
  6. package/dist/agent/cli-session.js +511 -438
  7. package/dist/agent/cli-spawn-config.d.ts +4 -4
  8. package/dist/agent/gate.d.ts +164 -0
  9. package/dist/agent/index.d.ts +4 -4
  10. package/dist/agent/index.js +174 -28
  11. package/dist/agent/mcp-bridge.d.ts +1 -1
  12. package/dist/agent/mcp-bridge.js +114 -128
  13. package/dist/agent/mcp-tool-server.d.ts +2 -2
  14. package/dist/agent/mcp-tool-server.js +147 -189
  15. package/dist/agent/profiles.d.ts +69 -0
  16. package/dist/agent/providers/anthropic.d.ts +2 -4
  17. package/dist/agent/providers/claude-cli.d.ts +4 -5
  18. package/dist/agent/providers/openai-compat.d.ts +8 -1
  19. package/dist/agent/streaming.d.ts +2 -2
  20. package/dist/agent/types.d.ts +16 -10
  21. package/dist/api/builder.d.ts +3 -3
  22. package/dist/api/compile.d.ts +9 -4
  23. package/dist/api/durable-validation.d.ts +15 -0
  24. package/dist/api/generate-in-place.d.ts +21 -19
  25. package/dist/api/generate.d.ts +21 -16
  26. package/dist/api/generated-module/local-node-functions.d.ts +24 -0
  27. package/dist/api/generated-module/module-format.d.ts +23 -0
  28. package/dist/api/generated-module/module-writer.d.ts +34 -0
  29. package/dist/api/generated-module/node-type-imports.d.ts +39 -0
  30. package/dist/api/generated-module/preamble.d.ts +16 -0
  31. package/dist/api/generated-module/workflow-functions.d.ts +29 -0
  32. package/dist/api/graph-identity.d.ts +39 -0
  33. package/dist/api/helpers.d.ts +4 -60
  34. package/dist/api/in-place/built-in-nodes.d.ts +18 -0
  35. package/dist/api/in-place/function-body.d.ts +21 -0
  36. package/dist/api/in-place/fw-imports.d.ts +30 -0
  37. package/dist/api/in-place/macro-coverage.d.ts +14 -0
  38. package/dist/api/in-place/node-type-functions.d.ts +18 -0
  39. package/dist/api/in-place/node-type-jsdoc.d.ts +20 -0
  40. package/dist/api/in-place/orphaned-node-types.d.ts +16 -0
  41. package/dist/api/in-place/runtime-section.d.ts +16 -0
  42. package/dist/api/in-place/signature.d.ts +47 -0
  43. package/dist/api/in-place/source-file.d.ts +19 -0
  44. package/dist/api/in-place/workflow-jsdoc.d.ts +19 -0
  45. package/dist/api/index.d.ts +18 -21
  46. package/dist/api/index.js +259 -53
  47. package/dist/api/inline-engine.generated.d.ts +3 -0
  48. package/dist/api/inline-runtime.d.ts +10 -2
  49. package/dist/api/manipulation/connections.d.ts +1 -1
  50. package/dist/api/manipulation/index.d.ts +8 -8
  51. package/dist/api/manipulation/node-types.d.ts +1 -1
  52. package/dist/api/manipulation/nodes.d.ts +3 -13
  53. package/dist/api/manipulation/ports.d.ts +1 -1
  54. package/dist/api/manipulation/scopes.d.ts +1 -1
  55. package/dist/api/manipulation/workflow.d.ts +1 -1
  56. package/dist/api/modify-operation.d.ts +0 -2
  57. package/dist/api/parse.d.ts +22 -1
  58. package/dist/api/port-references.d.ts +66 -0
  59. package/dist/api/query.d.ts +18 -2
  60. package/dist/api/templates.d.ts +1 -1
  61. package/dist/api/transform.d.ts +1 -1
  62. package/dist/api/validate.d.ts +1 -1
  63. package/dist/api/validation-registry.d.ts +2 -2
  64. package/dist/artifacts/brief.d.ts +43 -0
  65. package/dist/artifacts/index.d.ts +31 -0
  66. package/dist/artifacts/pdf.d.ts +19 -0
  67. package/dist/ast/builder.d.ts +3 -3
  68. package/dist/ast/index.d.ts +4 -4
  69. package/dist/ast/index.js +60 -5
  70. package/dist/ast/serialization-node.d.ts +1 -1
  71. package/dist/ast/serialization.d.ts +1 -1
  72. package/dist/ast/types.d.ts +82 -291
  73. package/dist/ast/workflow-utils.d.ts +4 -4
  74. package/dist/built-in-nodes/coercion-types.d.ts +1 -1
  75. package/dist/built-in-nodes/delay.d.ts +3 -1
  76. package/dist/built-in-nodes/generated-registry.d.ts +1 -1
  77. package/dist/built-in-nodes/index.d.ts +6 -5
  78. package/dist/built-in-nodes/index.js +79 -5
  79. package/dist/built-in-nodes/invoke-workflow.d.ts +2 -1
  80. package/dist/built-in-nodes/mock-types.d.ts +45 -14
  81. package/dist/built-in-nodes/sleep.d.ts +12 -0
  82. package/dist/built-in-nodes/wait-for-agent.d.ts +2 -1
  83. package/dist/built-in-nodes/wait-for-event.d.ts +2 -1
  84. package/dist/chevrotain-parser/coerce-parser.d.ts +1 -1
  85. package/dist/chevrotain-parser/connect-parser.d.ts +1 -1
  86. package/dist/chevrotain-parser/grammar-diagrams.d.ts +1 -1
  87. package/dist/chevrotain-parser/index.d.ts +20 -23
  88. package/dist/chevrotain-parser/node-parser.d.ts +7 -8
  89. package/dist/chevrotain-parser/parse-line.d.ts +54 -0
  90. package/dist/chevrotain-parser/tokens.d.ts +0 -17
  91. package/dist/chevrotain-parser/trigger-cancel-parser.d.ts +6 -1
  92. package/dist/chunks/chunk-4EUSHAY6.js +298 -0
  93. package/dist/chunks/chunk-4KDUEOFD.js +197 -0
  94. package/dist/chunks/chunk-5Y3AIUWY.js +911 -0
  95. package/dist/chunks/chunk-6KMVP6AU.js +20 -0
  96. package/dist/chunks/chunk-6PNJORFL.js +128 -0
  97. package/dist/chunks/chunk-7AAQNGRH.js +2001 -0
  98. package/dist/chunks/chunk-7YYKTPJ5.js +22705 -0
  99. package/dist/chunks/chunk-A5MBOFVY.js +33 -0
  100. package/dist/chunks/chunk-AXNQRVJB.js +18 -0
  101. package/dist/chunks/chunk-B6HQ6YS5.js +572 -0
  102. package/dist/chunks/chunk-CY3RNVML.js +296 -0
  103. package/dist/chunks/chunk-CYHYDLV4.js +653 -0
  104. package/dist/chunks/chunk-CZBCCK4Y.js +82 -0
  105. package/dist/chunks/chunk-DCMGQP5V.js +505 -0
  106. package/dist/chunks/chunk-DIAA66GL.js +72 -0
  107. package/dist/chunks/chunk-DUO6H5PR.js +20 -0
  108. package/dist/chunks/chunk-E5WN7IGO.js +125 -0
  109. package/dist/chunks/chunk-EFGFXXQF.js +184 -0
  110. package/dist/chunks/chunk-F3RTZV2A.js +2811 -0
  111. package/dist/chunks/chunk-FMTLP5ZX.js +1397 -0
  112. package/dist/chunks/chunk-HKZLQJDV.js +79 -0
  113. package/dist/chunks/chunk-INDEVYEC.js +146 -0
  114. package/dist/chunks/chunk-JQTF4R5L.js +390 -0
  115. package/dist/chunks/chunk-KMCAYNUM.js +331 -0
  116. package/dist/chunks/chunk-KMWCCOUJ.js +1444 -0
  117. package/dist/chunks/chunk-KU3CLJI2.js +338 -0
  118. package/dist/chunks/chunk-NDSTGMKR.js +3300 -0
  119. package/dist/chunks/chunk-NQNLUAPO.js +505 -0
  120. package/dist/chunks/chunk-O2U2LO57.js +466 -0
  121. package/dist/chunks/chunk-OOQG7UPP.js +457 -0
  122. package/dist/chunks/chunk-OZQAW5ZG.js +112 -0
  123. package/dist/chunks/chunk-P2CVDGHR.js +487 -0
  124. package/dist/chunks/chunk-P44RIZ7C.js +592 -0
  125. package/dist/chunks/chunk-PEZCT37T.js +1475 -0
  126. package/dist/chunks/chunk-PKWSAW6O.js +152 -0
  127. package/dist/chunks/chunk-Q6MDDZMT.js +4373 -0
  128. package/dist/chunks/chunk-QDE4Z7KW.js +6 -0
  129. package/dist/chunks/chunk-QJDAVSNY.js +8 -0
  130. package/dist/chunks/chunk-QYPORSLO.js +7552 -0
  131. package/dist/chunks/chunk-R4QGNK34.js +183 -0
  132. package/dist/chunks/chunk-REEYC73I.js +3002 -0
  133. package/dist/chunks/chunk-SEWDMQ6Q.js +46 -0
  134. package/dist/chunks/chunk-TAIUWKZB.js +3057 -0
  135. package/dist/chunks/chunk-TN4YZ3O7.js +196 -0
  136. package/dist/chunks/chunk-TRMFB43C.js +143 -0
  137. package/dist/chunks/chunk-VO4QXG2X.js +1016 -0
  138. package/dist/chunks/chunk-VP2P3BPA.js +1002 -0
  139. package/dist/chunks/chunk-VQ7H33J4.js +2176 -0
  140. package/dist/chunks/chunk-VWA7MCV2.js +105 -0
  141. package/dist/chunks/chunk-XAV22WD7.js +253 -0
  142. package/dist/chunks/chunk-YSPBPZDV.js +148 -0
  143. package/dist/chunks/chunk-ZKEGXO73.js +282 -0
  144. package/dist/chunks/chunk-ZMGN6F3S.js +4256 -0
  145. package/dist/chunks/grammar-diagrams-AI7VDXOM.js +14 -0
  146. package/dist/chunks/index.min-ECJD6GZC.js +37 -0
  147. package/dist/chunks/manifest-EPTR5MYH.js +21 -0
  148. package/dist/chunks/openapi-document-6TCGVDUW.js +69 -0
  149. package/dist/chunks/registry-K2U5KUTY.js +23 -0
  150. package/dist/chunks/serialization-node-UGY6CFH6.js +38 -0
  151. package/dist/chunks/validate-GEKSZPIN.js +24 -0
  152. package/dist/chunks/validation-registry-IQZX3UE3.js +7 -0
  153. package/dist/chunks/validator-VXFHLPDW.js +26 -0
  154. package/dist/chunks/workflow-executor-KBGFKHNR.js +36 -0
  155. package/dist/cli/commands/agents.d.ts +16 -0
  156. package/dist/cli/commands/artifact.d.ts +10 -0
  157. package/dist/cli/commands/compile.d.ts +0 -30
  158. package/dist/cli/commands/console.d.ts +32 -0
  159. package/dist/cli/commands/context.d.ts +0 -3
  160. package/dist/cli/commands/describe.js +386 -352
  161. package/dist/cli/commands/dev.d.ts +9 -4
  162. package/dist/cli/commands/diagram.d.ts +3 -5
  163. package/dist/cli/commands/doctor.d.ts +27 -4
  164. package/dist/cli/commands/doctor.js +3307 -633
  165. package/dist/cli/commands/export.d.ts +6 -4
  166. package/dist/cli/commands/grammar.d.ts +0 -3
  167. package/dist/cli/commands/implement.d.ts +1 -1
  168. package/dist/cli/commands/init/agent-handoff.d.ts +28 -0
  169. package/dist/cli/commands/init/config.d.ts +3 -0
  170. package/dist/cli/commands/init/files.d.ts +12 -0
  171. package/dist/cli/commands/init/naming.d.ts +13 -0
  172. package/dist/cli/commands/init/output.d.ts +12 -0
  173. package/dist/cli/commands/init/setup.d.ts +21 -0
  174. package/dist/cli/commands/init/types.d.ts +53 -0
  175. package/dist/cli/commands/init-personas.d.ts +9 -1
  176. package/dist/cli/commands/init.d.ts +24 -88
  177. package/dist/cli/commands/market.d.ts +1 -1
  178. package/dist/cli/commands/mcp-setup.d.ts +1 -4
  179. package/dist/cli/commands/modify.d.ts +0 -5
  180. package/dist/cli/commands/openapi.d.ts +9 -11
  181. package/dist/cli/commands/run.d.ts +0 -4
  182. package/dist/cli/commands/serve.d.ts +24 -26
  183. package/dist/cli/commands/status.d.ts +1 -1
  184. package/dist/cli/exports.d.ts +3 -4
  185. package/dist/cli/exports.js +124 -23
  186. package/dist/cli/flow-weaver-agents-H653446S.mjs +81 -0
  187. package/dist/cli/flow-weaver-artifact-WBFYTW76.mjs +58 -0
  188. package/dist/cli/flow-weaver-chunk-265CEK74.mjs +2 -0
  189. package/dist/cli/flow-weaver-chunk-2C7PZCV5.mjs +186 -0
  190. package/dist/cli/flow-weaver-chunk-3BSYCWPL.mjs +3109 -0
  191. package/dist/cli/flow-weaver-chunk-3MKUQP3D.mjs +547 -0
  192. package/dist/cli/flow-weaver-chunk-3ZLMPQTH.mjs +27 -0
  193. package/dist/cli/flow-weaver-chunk-4DVY73ML.mjs +280 -0
  194. package/dist/cli/flow-weaver-chunk-54M4KNEL.mjs +200 -0
  195. package/dist/cli/flow-weaver-chunk-55QMUZIA.mjs +256 -0
  196. package/dist/cli/flow-weaver-chunk-6ZUJ7LMX.mjs +2003 -0
  197. package/dist/cli/flow-weaver-chunk-7ET6N32V.mjs +419 -0
  198. package/dist/cli/flow-weaver-chunk-7G63RR4K.mjs +8880 -0
  199. package/dist/cli/flow-weaver-chunk-A6M5K3W7.mjs +4418 -0
  200. package/dist/cli/flow-weaver-chunk-AA3NATMX.mjs +154 -0
  201. package/dist/cli/flow-weaver-chunk-APX6MQ5A.mjs +5652 -0
  202. package/dist/cli/flow-weaver-chunk-BHCC5FE5.mjs +17 -0
  203. package/dist/cli/flow-weaver-chunk-DM4BBRRU.mjs +35 -0
  204. package/dist/cli/flow-weaver-chunk-DRN7KPWY.mjs +168 -0
  205. package/dist/cli/flow-weaver-chunk-EKWF27G6.mjs +23 -0
  206. package/dist/cli/flow-weaver-chunk-EM5HWQ4R.mjs +338 -0
  207. package/dist/cli/flow-weaver-chunk-FPPPU2DG.mjs +226 -0
  208. package/dist/cli/flow-weaver-chunk-GAQXZHNO.mjs +3005 -0
  209. package/dist/cli/flow-weaver-chunk-GBUNNP33.mjs +1329 -0
  210. package/dist/cli/flow-weaver-chunk-HMAKDE55.mjs +636 -0
  211. package/dist/cli/flow-weaver-chunk-HQ3ZAN44.mjs +367 -0
  212. package/dist/cli/flow-weaver-chunk-I4APCXYN.mjs +21442 -0
  213. package/dist/cli/flow-weaver-chunk-IJJ4JXTL.mjs +2297 -0
  214. package/dist/cli/flow-weaver-chunk-J7EPZW2I.mjs +33 -0
  215. package/dist/cli/flow-weaver-chunk-KOEMJHLG.mjs +83 -0
  216. package/dist/cli/flow-weaver-chunk-M6CBWQKJ.mjs +271 -0
  217. package/dist/cli/flow-weaver-chunk-MHJ4N652.mjs +1580 -0
  218. package/dist/cli/flow-weaver-chunk-MKAFQWLP.mjs +202 -0
  219. package/dist/cli/flow-weaver-chunk-MMV2XGD3.mjs +3291 -0
  220. package/dist/cli/flow-weaver-chunk-MSI2UJES.mjs +125 -0
  221. package/dist/cli/flow-weaver-chunk-N767YRAI.mjs +48 -0
  222. package/dist/cli/flow-weaver-chunk-NQKKWDGF.mjs +56 -0
  223. package/dist/cli/flow-weaver-chunk-NYZDQYFU.mjs +45 -0
  224. package/dist/cli/flow-weaver-chunk-OMVWSNHJ.mjs +14 -0
  225. package/dist/cli/flow-weaver-chunk-PUWZ47H5.mjs +2188 -0
  226. package/dist/cli/flow-weaver-chunk-QOPRVDES.mjs +46 -0
  227. package/dist/cli/flow-weaver-chunk-RIWE7YTR.mjs +216 -0
  228. package/dist/cli/flow-weaver-chunk-S63Q3JIU.mjs +789 -0
  229. package/dist/cli/flow-weaver-chunk-T7X5A23H.mjs +558 -0
  230. package/dist/cli/flow-weaver-chunk-TLV3VZUN.mjs +2 -0
  231. package/dist/cli/flow-weaver-chunk-TS5P3PIN.mjs +194 -0
  232. package/dist/cli/flow-weaver-chunk-U3EO3X4B.mjs +649 -0
  233. package/dist/cli/flow-weaver-chunk-UNFS3NQP.mjs +34 -0
  234. package/dist/cli/flow-weaver-chunk-V6DHWFQG.mjs +2811 -0
  235. package/dist/cli/flow-weaver-chunk-VXWNLYQU.mjs +9 -0
  236. package/dist/cli/flow-weaver-chunk-W3YNK26P.mjs +149 -0
  237. package/dist/cli/flow-weaver-chunk-XG2WKXYZ.mjs +324 -0
  238. package/dist/cli/flow-weaver-chunk-YLSRZWFK.mjs +2219 -0
  239. package/dist/cli/flow-weaver-chunk-YVPURWS6.mjs +40 -0
  240. package/dist/cli/flow-weaver-chunk-Z44JK332.mjs +582 -0
  241. package/dist/cli/flow-weaver-chunk-Z5ZJPNSY.mjs +517 -0
  242. package/dist/cli/flow-weaver-chunk-ZQALO25T.mjs +594 -0
  243. package/dist/cli/flow-weaver-compile-A2CABDSB.mjs +37 -0
  244. package/dist/cli/flow-weaver-console-6EBHDBTN.mjs +71 -0
  245. package/dist/cli/flow-weaver-context-ECLYANFF.mjs +17 -0
  246. package/dist/cli/flow-weaver-context-ZRUMW2KE.mjs +69 -0
  247. package/dist/cli/flow-weaver-create-WIP4EFNP.mjs +124 -0
  248. package/dist/cli/flow-weaver-deployment-WJJRK7NO.mjs +14 -0
  249. package/dist/cli/flow-weaver-describe-XDIFF5LI.mjs +41 -0
  250. package/dist/cli/flow-weaver-dev-LG2NSQAU.mjs +196 -0
  251. package/dist/cli/flow-weaver-diagram-3EVQARQE.mjs +52 -0
  252. package/dist/cli/flow-weaver-diagram-7LR7O4M2.mjs +44 -0
  253. package/dist/cli/flow-weaver-diff-USF7DJLU.mjs +85 -0
  254. package/dist/cli/flow-weaver-docs-QU2ZOXKH.mjs +96 -0
  255. package/dist/cli/flow-weaver-doctor-K447YWHR.mjs +43 -0
  256. package/dist/cli/flow-weaver-export-LAS6N56Y.mjs +140 -0
  257. package/dist/cli/flow-weaver-grammar-RIRUS3Q6.mjs +49 -0
  258. package/dist/cli/flow-weaver-grammar-diagrams-WXRTW5SK.mjs +15 -0
  259. package/dist/cli/flow-weaver-implement-5JG6BCFZ.mjs +114 -0
  260. package/dist/cli/flow-weaver-index.min-OR5SIHXD.mjs +39 -0
  261. package/dist/cli/flow-weaver-init-34YZNPQX.mjs +972 -0
  262. package/dist/cli/flow-weaver-init-personas-NOGZTQQ2.mjs +48 -0
  263. package/dist/cli/flow-weaver-manifest-4JNUSEB3.mjs +18 -0
  264. package/dist/cli/flow-weaver-market-WA4CKHKV.mjs +444 -0
  265. package/dist/cli/flow-weaver-mcp-setup-O26MGXSD.mjs +22 -0
  266. package/dist/cli/flow-weaver-migrate-VFVEUTPH.mjs +119 -0
  267. package/dist/cli/flow-weaver-modify-VM3JP5K6.mjs +97 -0
  268. package/dist/cli/flow-weaver-openapi-IRBWI3HM.mjs +71 -0
  269. package/dist/cli/flow-weaver-openapi-document-7N6YMPG3.mjs +30 -0
  270. package/dist/cli/flow-weaver-pack-commands-OS2QRXAK.mjs +146 -0
  271. package/dist/cli/flow-weaver-registry-5MLFRPPT.mjs +25 -0
  272. package/dist/cli/flow-weaver-run-DSTLSTHR.mjs +555 -0
  273. package/dist/cli/flow-weaver-serialization-node-LE6PCG4M.mjs +50 -0
  274. package/dist/cli/flow-weaver-serve-NVLCLSOW.mjs +192 -0
  275. package/dist/cli/flow-weaver-server-7IERLVXE.mjs +2925 -0
  276. package/dist/cli/flow-weaver-server-KWF4PXYC.mjs +19112 -0
  277. package/dist/cli/flow-weaver-status-75W2S3YB.mjs +138 -0
  278. package/dist/cli/flow-weaver-strip-AZPXUYVA.mjs +79 -0
  279. package/dist/cli/flow-weaver-templates-DSNMB6K7.mjs +72 -0
  280. package/dist/cli/flow-weaver-validate-A4UWDQN6.mjs +19 -0
  281. package/dist/cli/flow-weaver-validate-GRBZ5W4C.mjs +296 -0
  282. package/dist/cli/flow-weaver-validation-registry-BINGUNXX.mjs +9 -0
  283. package/dist/cli/flow-weaver-validator-TY56CI42.mjs +21 -0
  284. package/dist/cli/flow-weaver-watch-OPPERXL6.mjs +114 -0
  285. package/dist/cli/flow-weaver-workflow-executor-6AHYPXAN.mjs +26 -0
  286. package/dist/cli/flow-weaver.mjs +3557 -89498
  287. package/dist/cli/index.d.ts +5 -2
  288. package/dist/cli/pack-commands-needed.d.ts +12 -0
  289. package/dist/cli/program.d.ts +14 -0
  290. package/dist/cli/templates/ai/mock-provider.d.ts +1 -1
  291. package/dist/cli/templates/index.d.ts +1 -8
  292. package/dist/cli/templates/nodes/agent-router.d.ts +1 -1
  293. package/dist/cli/templates/nodes/aggregator.d.ts +1 -1
  294. package/dist/cli/templates/nodes/conversation-memory.d.ts +1 -1
  295. package/dist/cli/templates/nodes/http.d.ts +1 -1
  296. package/dist/cli/templates/nodes/human-approval.d.ts +1 -1
  297. package/dist/cli/templates/nodes/json-extractor.d.ts +1 -1
  298. package/dist/cli/templates/nodes/llm-call.d.ts +1 -1
  299. package/dist/cli/templates/nodes/prompt-template.d.ts +1 -1
  300. package/dist/cli/templates/nodes/rag-retriever.d.ts +1 -1
  301. package/dist/cli/templates/nodes/tool-executor.d.ts +1 -1
  302. package/dist/cli/templates/nodes/transformer.d.ts +1 -1
  303. package/dist/cli/templates/nodes/validator.d.ts +1 -1
  304. package/dist/cli/templates/shared/approval-types.d.ts +1 -1
  305. package/dist/cli/templates/shared/case.d.ts +14 -0
  306. package/dist/cli/templates/shared/llm-types.d.ts +4 -4
  307. package/dist/cli/templates/workflows/aggregator.d.ts +1 -1
  308. package/dist/cli/templates/workflows/ai-agent.d.ts +1 -1
  309. package/dist/cli/templates/workflows/ai-chat.d.ts +1 -1
  310. package/dist/cli/templates/workflows/ai-rag.d.ts +1 -1
  311. package/dist/cli/templates/workflows/ai-react.d.ts +1 -1
  312. package/dist/cli/templates/workflows/approval.d.ts +10 -0
  313. package/dist/cli/templates/workflows/conditional.d.ts +2 -2
  314. package/dist/cli/templates/workflows/error-handler.d.ts +2 -2
  315. package/dist/cli/templates/workflows/foreach.d.ts +1 -1
  316. package/dist/cli/templates/workflows/sequential.d.ts +1 -1
  317. package/dist/cli/templates/workflows/webhook.d.ts +1 -1
  318. package/dist/cli/utils/interactive.d.ts +6 -0
  319. package/dist/cli/utils/json-option.d.ts +8 -0
  320. package/dist/cli/utils/logger.d.ts +2 -0
  321. package/dist/compiler/durable-source-proof.d.ts +23 -0
  322. package/dist/compiler/executable-artifact.d.ts +29 -0
  323. package/dist/compiler/index.d.ts +4 -0
  324. package/dist/compiler/index.js +36 -0
  325. package/dist/console/app.js +106 -0
  326. package/dist/console/assets/synergenius.svg +18 -0
  327. package/dist/console/author.d.ts +32 -0
  328. package/dist/console/cli-catalog.d.ts +21 -0
  329. package/dist/console/cli-run.d.ts +35 -0
  330. package/dist/console/cli-run.js +46 -0
  331. package/dist/console/debug.d.ts +67 -0
  332. package/dist/console/diff-view.d.ts +96 -0
  333. package/dist/console/export.d.ts +36 -0
  334. package/dist/console/git.d.ts +27 -0
  335. package/dist/console/index.d.ts +4 -0
  336. package/dist/console/index.html +16 -0
  337. package/dist/console/index.js +203 -0
  338. package/dist/console/packs.d.ts +100 -0
  339. package/dist/console/request-guard.d.ts +10 -0
  340. package/dist/console/respond.d.ts +16 -0
  341. package/dist/console/router.d.ts +64 -0
  342. package/dist/console/routes-agents.d.ts +14 -0
  343. package/dist/console/routes-project.d.ts +3 -0
  344. package/dist/console/routes-runs.d.ts +3 -0
  345. package/dist/console/routes-services.d.ts +7 -0
  346. package/dist/console/routes-tools.d.ts +3 -0
  347. package/dist/console/runs.d.ts +69 -0
  348. package/dist/console/scan.d.ts +49 -0
  349. package/dist/console/schema.d.ts +74 -0
  350. package/dist/console/server.d.ts +34 -0
  351. package/dist/console/server.js +43264 -0
  352. package/dist/console/services.d.ts +119 -0
  353. package/dist/console/source.d.ts +23 -0
  354. package/dist/console/status.d.ts +68 -0
  355. package/dist/console/styles.css +1023 -0
  356. package/dist/console/terminals.d.ts +22 -0
  357. package/dist/console/workflow-view.d.ts +153 -0
  358. package/dist/constants.d.ts +5 -1
  359. package/dist/constants.js +56 -167
  360. package/dist/context/index.d.ts +10 -0
  361. package/dist/context/index.js +14 -191
  362. package/dist/coordinator/agent-gate.d.ts +107 -0
  363. package/dist/coordinator/bundle-digest.d.ts +20 -0
  364. package/dist/coordinator/clock-tick.d.ts +4 -0
  365. package/dist/coordinator/effect-receipts.d.ts +10 -0
  366. package/dist/coordinator/errors.d.ts +31 -0
  367. package/dist/coordinator/file-store.d.ts +3 -0
  368. package/dist/coordinator/gate-labeling.d.ts +33 -0
  369. package/dist/coordinator/gate-resolution.d.ts +28 -0
  370. package/dist/coordinator/index.d.ts +12 -0
  371. package/dist/coordinator/index.js +107 -0
  372. package/dist/coordinator/memory-store.d.ts +3 -0
  373. package/dist/coordinator/params.d.ts +18 -0
  374. package/dist/coordinator/run-annotations.d.ts +6 -0
  375. package/dist/coordinator/run-context.d.ts +11 -0
  376. package/dist/coordinator/run-ending.d.ts +5 -0
  377. package/dist/coordinator/run-outcome.d.ts +31 -0
  378. package/dist/coordinator/run-resume.d.ts +6 -0
  379. package/dist/coordinator/run-start.d.ts +4 -0
  380. package/dist/coordinator/run-store.d.ts +275 -0
  381. package/dist/coordinator/run-trace.d.ts +41 -0
  382. package/dist/coordinator/run-views.d.ts +12 -0
  383. package/dist/coordinator/runs-dir.d.ts +26 -0
  384. package/dist/coordinator/store.d.ts +67 -0
  385. package/dist/coordinator/time.d.ts +39 -0
  386. package/dist/coordinator/workflow-selection.d.ts +6 -0
  387. package/dist/deployment/index.d.ts +11 -16
  388. package/dist/deployment/index.js +541 -50
  389. package/dist/deployment/targets/base.d.ts +11 -13
  390. package/dist/deployment/targets/openapi-parts.d.ts +92 -0
  391. package/dist/diagram/arms.d.ts +70 -0
  392. package/dist/diagram/ascii-renderer.d.ts +1 -1
  393. package/dist/diagram/geometry.d.ts +22 -29
  394. package/dist/diagram/graph/bounds.d.ts +30 -0
  395. package/dist/diagram/graph/metrics.d.ts +21 -0
  396. package/dist/diagram/graph/nodes.d.ts +33 -0
  397. package/dist/diagram/graph/placement.d.ts +22 -0
  398. package/dist/diagram/graph/ports.d.ts +23 -0
  399. package/dist/diagram/graph/routing.d.ts +40 -0
  400. package/dist/diagram/graph/scopes.d.ts +30 -0
  401. package/dist/diagram/index.d.ts +15 -23
  402. package/dist/diagram/index.js +632 -111
  403. package/dist/diagram/labels.d.ts +12 -0
  404. package/dist/diagram/lanes.d.ts +93 -0
  405. package/dist/diagram/layout.d.ts +1 -1
  406. package/dist/diagram/material-symbols.d.ts +7 -0
  407. package/dist/diagram/orthogonal-router.d.ts +15 -51
  408. package/dist/diagram/process-view.d.ts +79 -0
  409. package/dist/diagram/spine.d.ts +25 -0
  410. package/dist/diagram/theme.d.ts +3 -5
  411. package/dist/diagram/types.d.ts +6 -20
  412. package/dist/diff/index.js +53 -9
  413. package/dist/diff/types.d.ts +1 -5
  414. package/dist/doc-metadata/extractors/annotations.d.ts +0 -4
  415. package/dist/doc-metadata/extractors/cli-commands.d.ts +2 -1
  416. package/dist/doc-metadata/extractors/core-metadata.d.ts +19 -4
  417. package/dist/doc-metadata/extractors/error-codes.d.ts +1 -1
  418. package/dist/doc-metadata/extractors/mcp-tools.d.ts +7 -3
  419. package/dist/doc-metadata/index.d.ts +1 -2
  420. package/dist/doc-metadata/index.js +2368 -9
  421. package/dist/doc-metadata/types.d.ts +7 -24
  422. package/dist/docs/guide.d.ts +33 -0
  423. package/dist/docs/index.d.ts +7 -4
  424. package/dist/docs/index.js +298 -298
  425. package/dist/docs/pack-topics.d.ts +18 -0
  426. package/dist/editor-completions/annotationValues.d.ts +1 -1
  427. package/dist/editor-completions/contextParser.d.ts +3 -2
  428. package/dist/editor-completions/dataTypes.d.ts +1 -1
  429. package/dist/editor-completions/goToDefinition.d.ts +1 -1
  430. package/dist/editor-completions/index.d.ts +8 -8
  431. package/dist/editor-completions/index.js +1244 -175
  432. package/dist/editor-completions/jsDocAnnotations.d.ts +1 -1
  433. package/dist/editor-completions/modifierCompletions.d.ts +1 -1
  434. package/dist/export/index.d.ts +7 -1
  435. package/dist/generated-branding.js +8 -21
  436. package/dist/generated-version.d.ts +1 -1
  437. package/dist/generated-version.js +7 -3
  438. package/dist/generator/annotation-generator.d.ts +84 -0
  439. package/dist/generator/async-detection.d.ts +1 -1
  440. package/dist/{body-generator.d.ts → generator/body-generator.d.ts} +7 -3
  441. package/dist/generator/code-utils.d.ts +15 -60
  442. package/dist/generator/connection-reads.d.ts +94 -0
  443. package/dist/generator/control-flow-plan.d.ts +74 -0
  444. package/dist/generator/control-flow.d.ts +1 -1
  445. package/dist/generator/exit-assembly.d.ts +11 -0
  446. package/dist/generator/index.d.ts +4 -5
  447. package/dist/generator/index.js +34 -11
  448. package/dist/generator/input-port-values.d.ts +22 -0
  449. package/dist/generator/{scope-function-generator.d.ts → node-arguments.d.ts} +76 -1
  450. package/dist/generator/node-invocation.d.ts +74 -0
  451. package/dist/{node-types-generator.d.ts → generator/node-types-generator.d.ts} +3 -2
  452. package/dist/generator/scope-closure.d.ts +23 -0
  453. package/dist/generator/scoped-child.d.ts +49 -0
  454. package/dist/{sugar-optimizer.d.ts → generator/sugar-optimizer.d.ts} +1 -1
  455. package/dist/generator/unified.d.ts +14 -2
  456. package/dist/generator/workflow-generator.d.ts +37 -0
  457. package/dist/index.d.ts +29 -26
  458. package/dist/index.js +1322 -92
  459. package/dist/jsdoc-port-sync/apply-diff.d.ts +15 -0
  460. package/dist/jsdoc-port-sync/callback-signature.d.ts +17 -0
  461. package/dist/jsdoc-port-sync/diff.d.ts +5 -7
  462. package/dist/jsdoc-port-sync/incomplete-lines.d.ts +41 -0
  463. package/dist/jsdoc-port-sync/index.d.ts +11 -11
  464. package/dist/jsdoc-port-sync/index.js +88 -45
  465. package/dist/jsdoc-port-sync/jsdoc-to-signature.d.ts +66 -0
  466. package/dist/jsdoc-port-sync/port-parser.d.ts +6 -24
  467. package/dist/jsdoc-port-sync/port-tag-placement.d.ts +55 -0
  468. package/dist/jsdoc-port-sync/scoped-ports.d.ts +21 -0
  469. package/dist/jsdoc-port-sync/signature-parser.d.ts +8 -1
  470. package/dist/jsdoc-port-sync/signature-to-jsdoc.d.ts +77 -0
  471. package/dist/jsdoc-port-sync/sync.d.ts +4 -1
  472. package/dist/marketplace/index.d.ts +5 -3
  473. package/dist/marketplace/index.js +62 -10
  474. package/dist/marketplace/install.d.ts +24 -0
  475. package/dist/marketplace/manifest.d.ts +1 -1
  476. package/dist/marketplace/npmrc.d.ts +24 -0
  477. package/dist/marketplace/registry.d.ts +46 -11
  478. package/dist/marketplace/types.d.ts +41 -24
  479. package/dist/marketplace/validator.d.ts +1 -1
  480. package/dist/mcp/debug-session.d.ts +2 -4
  481. package/dist/mcp/dist-imports.d.ts +12 -0
  482. package/dist/mcp/response-utils.d.ts +11 -9
  483. package/dist/mcp/server.d.ts +0 -1
  484. package/dist/mcp/tools-context.d.ts +11 -0
  485. package/dist/mcp/tools-diagram.d.ts +1 -2
  486. package/dist/mcp/tools-export.d.ts +2 -2
  487. package/dist/mcp/tools-marketplace.d.ts +1 -1
  488. package/dist/mcp/tools-run.d.ts +17 -0
  489. package/dist/mcp/tools-workflow.d.ts +3 -0
  490. package/dist/mcp/types.d.ts +4 -14
  491. package/dist/mcp/workflow-executor.d.ts +57 -19
  492. package/dist/npm-packages.d.ts +1 -1
  493. package/dist/npm-packages.js +10 -473
  494. package/dist/parser/annotation-parser.d.ts +88 -0
  495. package/dist/parser/annotation-suggestion.d.ts +23 -0
  496. package/dist/parser/durable-effect-contract.d.ts +10 -0
  497. package/dist/parser/expression-references.d.ts +101 -0
  498. package/dist/parser/external-node-types.d.ts +69 -0
  499. package/dist/{function-like.d.ts → parser/function-like.d.ts} +10 -3
  500. package/dist/parser/generated-sections.d.ts +25 -0
  501. package/dist/parser/import-resolution.d.ts +67 -0
  502. package/dist/parser/import-stub.d.ts +29 -0
  503. package/dist/parser/jsdoc/config-types.d.ts +209 -0
  504. package/dist/parser/jsdoc/graph-tags.d.ts +54 -0
  505. package/dist/parser/jsdoc/node-type-block.d.ts +23 -0
  506. package/dist/parser/jsdoc/parse-line-once.d.ts +11 -0
  507. package/dist/parser/jsdoc/port-tags.d.ts +42 -0
  508. package/dist/parser/jsdoc/runtime-tags.d.ts +65 -0
  509. package/dist/parser/jsdoc/signature-types.d.ts +52 -0
  510. package/dist/parser/jsdoc/workflow-block.d.ts +22 -0
  511. package/dist/parser/jsdoc-parser.d.ts +23 -0
  512. package/dist/parser/macro-expansion.d.ts +80 -0
  513. package/dist/parser/module-resolution.d.ts +38 -0
  514. package/dist/parser/node-inference.d.ts +39 -0
  515. package/dist/parser/npm-node-types.d.ts +24 -0
  516. package/dist/parser/pack-handlers.d.ts +12 -0
  517. package/dist/parser/path-data-resolution.d.ts +75 -0
  518. package/dist/parser/port-inference.d.ts +15 -0
  519. package/dist/{resolve-package-types.d.ts → parser/resolve-package-types.d.ts} +4 -0
  520. package/dist/parser/serialize-deploy-annotations.d.ts +19 -0
  521. package/dist/parser/tag-registry.d.ts +22 -0
  522. package/dist/parser/workflow-extraction.d.ts +39 -0
  523. package/dist/runtime/ExecutionContext.d.ts +87 -99
  524. package/dist/runtime/continuation-core.d.ts +147 -0
  525. package/dist/runtime/continuation.d.ts +48 -0
  526. package/dist/runtime/debug-controller.d.ts +7 -22
  527. package/dist/runtime/durable-execution.d.ts +176 -0
  528. package/dist/runtime/events.d.ts +16 -1
  529. package/dist/runtime/executable-module-contract.d.ts +16 -0
  530. package/dist/runtime/index.d.ts +13 -10
  531. package/dist/runtime/index.js +947 -9
  532. package/dist/runtime/strict-json.d.ts +15 -0
  533. package/dist/server/access.d.ts +12 -0
  534. package/dist/server/api.d.ts +126 -0
  535. package/dist/server/callback-delivery.d.ts +62 -0
  536. package/dist/server/callback-url.d.ts +44 -0
  537. package/dist/server/context.d.ts +35 -0
  538. package/dist/server/http-error.d.ts +10 -0
  539. package/dist/server/index.d.ts +7 -1
  540. package/dist/server/index.js +125 -6
  541. package/dist/server/openapi-document.d.ts +33 -0
  542. package/dist/server/openapi.d.ts +32 -0
  543. package/dist/server/respond.d.ts +35 -0
  544. package/dist/server/route-params.d.ts +17 -0
  545. package/dist/server/route-plan.d.ts +41 -0
  546. package/dist/server/routes-catalog.d.ts +5 -0
  547. package/dist/server/routes-declared.d.ts +12 -0
  548. package/dist/server/routes-runs.d.ts +8 -0
  549. package/dist/server/run-driver.d.ts +58 -0
  550. package/dist/server/run-view.d.ts +26 -0
  551. package/dist/server/transport.d.ts +35 -0
  552. package/dist/server/types.d.ts +143 -52
  553. package/dist/server/webhook-server.d.ts +12 -38
  554. package/dist/server/workflow-registry.d.ts +7 -4
  555. package/dist/service-registry.d.ts +49 -0
  556. package/dist/service-registry.js +123 -0
  557. package/dist/testing/assertions.d.ts +2 -2
  558. package/dist/testing/index.d.ts +14 -13
  559. package/dist/testing/index.js +582 -24
  560. package/dist/testing/mock-approval.d.ts +3 -5
  561. package/dist/testing/mock-llm.d.ts +2 -3
  562. package/dist/testing/recorder.d.ts +5 -6
  563. package/dist/testing/replayer.d.ts +6 -7
  564. package/dist/testing/run-store-check.d.ts +3 -0
  565. package/dist/testing/token-tracker.d.ts +2 -2
  566. package/dist/{type-mappings.d.ts → types/type-mappings.d.ts} +13 -1
  567. package/dist/utils/error-utils.d.ts +4 -2
  568. package/dist/utils/port-ordering.d.ts +2 -2
  569. package/dist/utils/port-tag-utils.d.ts +1 -1
  570. package/dist/validation/agent-detection.d.ts +17 -5
  571. package/dist/validation/agent-rules.d.ts +6 -7
  572. package/dist/validation/core-rules.d.ts +49 -0
  573. package/dist/validation/design-rules.d.ts +9 -3
  574. package/dist/validation/rule-registry.d.ts +3 -3
  575. package/dist/validation/rules/connections.d.ts +27 -0
  576. package/dist/validation/rules/context.d.ts +11 -0
  577. package/dist/validation/rules/cycles.d.ts +17 -0
  578. package/dist/validation/rules/data-flow.d.ts +19 -0
  579. package/dist/validation/rules/scope-topology.d.ts +35 -0
  580. package/dist/validation/rules/type-compatibility.d.ts +30 -0
  581. package/dist/validation/type-checker.d.ts +39 -0
  582. package/dist/validation/validator-helpers.d.ts +31 -0
  583. package/dist/validation/validator.d.ts +30 -0
  584. package/docs/reference/advanced-annotations.md +277 -60
  585. package/docs/reference/built-in-nodes.md +164 -94
  586. package/docs/reference/cancellation.md +44 -0
  587. package/docs/reference/cli-reference.md +252 -234
  588. package/docs/reference/compilation.md +36 -109
  589. package/docs/reference/concepts.md +80 -63
  590. package/docs/reference/console.md +169 -0
  591. package/docs/reference/debugging.md +26 -57
  592. package/docs/reference/deployment.md +217 -143
  593. package/docs/reference/durable-gates.md +445 -0
  594. package/docs/reference/error-codes.md +90 -43
  595. package/docs/reference/export-interface.md +91 -26
  596. package/docs/reference/iterative-development.md +50 -28
  597. package/docs/reference/jsdoc-grammar.md +66 -311
  598. package/docs/reference/library.md +250 -0
  599. package/docs/reference/marketplace.md +301 -152
  600. package/docs/reference/mcp-tools.md +102 -0
  601. package/docs/reference/node-conversion.md +84 -59
  602. package/docs/reference/orientation.md +68 -0
  603. package/docs/reference/scaffold.md +5 -4
  604. package/docs/reference/tutorial.md +106 -166
  605. package/docs/reference/visual-reference.md +1 -1
  606. package/package.json +85 -50
  607. package/dist/agent/agent-loop.js +0 -156
  608. package/dist/agent/cli-spawn-config.js +0 -65
  609. package/dist/agent/device-connection.d.ts +0 -79
  610. package/dist/agent/device-connection.js +0 -184
  611. package/dist/agent/env-allowlist.js +0 -60
  612. package/dist/agent/providers/anthropic.js +0 -198
  613. package/dist/agent/providers/claude-cli.js +0 -161
  614. package/dist/agent/providers/openai-compat.js +0 -205
  615. package/dist/agent/providers/platform.d.ts +0 -23
  616. package/dist/agent/providers/platform.js +0 -132
  617. package/dist/agent/streaming.js +0 -186
  618. package/dist/agent/types.js +0 -20
  619. package/dist/annotation-generator.d.ts +0 -50
  620. package/dist/annotation-generator.js +0 -743
  621. package/dist/api/builder.js +0 -345
  622. package/dist/api/command-runner.js +0 -787
  623. package/dist/api/compile.js +0 -148
  624. package/dist/api/extract-types.js +0 -57
  625. package/dist/api/generate-in-place.js +0 -1477
  626. package/dist/api/generate.js +0 -514
  627. package/dist/api/helpers.js +0 -285
  628. package/dist/api/inline-runtime.js +0 -526
  629. package/dist/api/manipulation/connections.js +0 -151
  630. package/dist/api/manipulation/index.js +0 -41
  631. package/dist/api/manipulation/node-types.js +0 -200
  632. package/dist/api/manipulation/nodes.js +0 -355
  633. package/dist/api/manipulation/ports.js +0 -228
  634. package/dist/api/manipulation/scopes.js +0 -156
  635. package/dist/api/manipulation/workflow.js +0 -116
  636. package/dist/api/modify-operation.js +0 -177
  637. package/dist/api/parse.js +0 -115
  638. package/dist/api/patterns.d.ts +0 -112
  639. package/dist/api/patterns.js +0 -303
  640. package/dist/api/query.js +0 -840
  641. package/dist/api/templates.js +0 -117
  642. package/dist/api/transform.js +0 -40
  643. package/dist/api/validate.js +0 -64
  644. package/dist/api/validation-registry.js +0 -10
  645. package/dist/api/workflow-file-operations.js +0 -180
  646. package/dist/ast/builder.js +0 -395
  647. package/dist/ast/serialization-node.js +0 -30
  648. package/dist/ast/serialization.js +0 -134
  649. package/dist/ast/types.js +0 -2
  650. package/dist/ast/workflow-utils.js +0 -114
  651. package/dist/body-generator.js +0 -35
  652. package/dist/built-in-nodes/coercion-types.js +0 -61
  653. package/dist/built-in-nodes/delay.js +0 -29
  654. package/dist/built-in-nodes/generated-registry.js +0 -299
  655. package/dist/built-in-nodes/invoke-workflow.js +0 -36
  656. package/dist/built-in-nodes/mock-types.js +0 -42
  657. package/dist/built-in-nodes/wait-for-agent.js +0 -31
  658. package/dist/built-in-nodes/wait-for-event.js +0 -25
  659. package/dist/chevrotain-parser/coerce-parser.js +0 -103
  660. package/dist/chevrotain-parser/connect-parser.js +0 -136
  661. package/dist/chevrotain-parser/fan-parser.js +0 -149
  662. package/dist/chevrotain-parser/grammar-diagrams.js +0 -273
  663. package/dist/chevrotain-parser/index.js +0 -31
  664. package/dist/chevrotain-parser/map-parser.js +0 -130
  665. package/dist/chevrotain-parser/node-parser.js +0 -558
  666. package/dist/chevrotain-parser/path-parser.js +0 -140
  667. package/dist/chevrotain-parser/port-parser.js +0 -519
  668. package/dist/chevrotain-parser/position-parser.d.ts +0 -20
  669. package/dist/chevrotain-parser/position-parser.js +0 -83
  670. package/dist/chevrotain-parser/scope-parser.js +0 -104
  671. package/dist/chevrotain-parser/tokens.js +0 -429
  672. package/dist/chevrotain-parser/trigger-cancel-parser.js +0 -291
  673. package/dist/cli/commands/account.d.ts +0 -4
  674. package/dist/cli/commands/account.js +0 -50
  675. package/dist/cli/commands/ai-credentials.d.ts +0 -12
  676. package/dist/cli/commands/ai-credentials.js +0 -95
  677. package/dist/cli/commands/apikey.d.ts +0 -4
  678. package/dist/cli/commands/apikey.js +0 -64
  679. package/dist/cli/commands/auth.d.ts +0 -9
  680. package/dist/cli/commands/auth.js +0 -255
  681. package/dist/cli/commands/compile.js +0 -331
  682. package/dist/cli/commands/connect.d.ts +0 -4
  683. package/dist/cli/commands/connect.js +0 -163
  684. package/dist/cli/commands/context.js +0 -51
  685. package/dist/cli/commands/create.js +0 -139
  686. package/dist/cli/commands/deploy.d.ts +0 -6
  687. package/dist/cli/commands/deploy.js +0 -74
  688. package/dist/cli/commands/dev.js +0 -227
  689. package/dist/cli/commands/diagram.js +0 -39
  690. package/dist/cli/commands/diff.js +0 -57
  691. package/dist/cli/commands/docs.js +0 -74
  692. package/dist/cli/commands/export.js +0 -153
  693. package/dist/cli/commands/grammar.js +0 -40
  694. package/dist/cli/commands/implement.js +0 -91
  695. package/dist/cli/commands/init-personas.js +0 -541
  696. package/dist/cli/commands/init.js +0 -797
  697. package/dist/cli/commands/market.js +0 -440
  698. package/dist/cli/commands/mcp-setup.js +0 -433
  699. package/dist/cli/commands/migrate.js +0 -91
  700. package/dist/cli/commands/modify.js +0 -58
  701. package/dist/cli/commands/openapi.js +0 -71
  702. package/dist/cli/commands/org.d.ts +0 -8
  703. package/dist/cli/commands/org.js +0 -136
  704. package/dist/cli/commands/pattern.d.ts +0 -34
  705. package/dist/cli/commands/pattern.js +0 -186
  706. package/dist/cli/commands/plugin.d.ts +0 -16
  707. package/dist/cli/commands/plugin.js +0 -176
  708. package/dist/cli/commands/run.js +0 -742
  709. package/dist/cli/commands/serve.js +0 -93
  710. package/dist/cli/commands/status.js +0 -123
  711. package/dist/cli/commands/strip.js +0 -61
  712. package/dist/cli/commands/templates.js +0 -58
  713. package/dist/cli/commands/validate.js +0 -267
  714. package/dist/cli/commands/watch.js +0 -71
  715. package/dist/cli/config/credentials.d.ts +0 -15
  716. package/dist/cli/config/credentials.js +0 -43
  717. package/dist/cli/config/platform-client.d.ts +0 -123
  718. package/dist/cli/config/platform-client.js +0 -248
  719. package/dist/cli/env-setup.js +0 -12
  720. package/dist/cli/index.js +0 -850
  721. package/dist/cli/pack-commands.js +0 -122
  722. package/dist/cli/postinstall.d.ts +0 -16
  723. package/dist/cli/postinstall.js +0 -119
  724. package/dist/cli/templates/ai/mock-provider.js +0 -64
  725. package/dist/cli/templates/ai/types.js +0 -5
  726. package/dist/cli/templates/approvals/index.d.ts +0 -15
  727. package/dist/cli/templates/approvals/index.js +0 -241
  728. package/dist/cli/templates/index.js +0 -123
  729. package/dist/cli/templates/nodes/agent-router.js +0 -114
  730. package/dist/cli/templates/nodes/aggregator.js +0 -63
  731. package/dist/cli/templates/nodes/conversation-memory.js +0 -85
  732. package/dist/cli/templates/nodes/http.js +0 -80
  733. package/dist/cli/templates/nodes/human-approval.js +0 -109
  734. package/dist/cli/templates/nodes/json-extractor.js +0 -119
  735. package/dist/cli/templates/nodes/llm-call.js +0 -106
  736. package/dist/cli/templates/nodes/prompt-template.js +0 -52
  737. package/dist/cli/templates/nodes/rag-retriever.js +0 -128
  738. package/dist/cli/templates/nodes/tool-executor.js +0 -108
  739. package/dist/cli/templates/nodes/transformer.js +0 -68
  740. package/dist/cli/templates/nodes/validator.js +0 -62
  741. package/dist/cli/templates/pack-loader.js +0 -58
  742. package/dist/cli/templates/providers/index.js +0 -239
  743. package/dist/cli/templates/shared/approval-types.js +0 -31
  744. package/dist/cli/templates/shared/llm-types.js +0 -109
  745. package/dist/cli/templates/workflows/aggregator.js +0 -101
  746. package/dist/cli/templates/workflows/ai-agent.js +0 -326
  747. package/dist/cli/templates/workflows/ai-chat.js +0 -167
  748. package/dist/cli/templates/workflows/ai-rag.js +0 -184
  749. package/dist/cli/templates/workflows/ai-react.js +0 -293
  750. package/dist/cli/templates/workflows/conditional.js +0 -139
  751. package/dist/cli/templates/workflows/error-handler.js +0 -145
  752. package/dist/cli/templates/workflows/foreach.js +0 -140
  753. package/dist/cli/templates/workflows/sequential.js +0 -200
  754. package/dist/cli/templates/workflows/webhook.js +0 -158
  755. package/dist/cli/utils/cli-helpers.d.ts +0 -44
  756. package/dist/cli/utils/cli-helpers.js +0 -99
  757. package/dist/cli/utils/logger.js +0 -126
  758. package/dist/cli/utils/parse-int-strict.js +0 -17
  759. package/dist/cli/utils/safe-write.js +0 -54
  760. package/dist/deployment/config/defaults.d.ts +0 -29
  761. package/dist/deployment/config/defaults.js +0 -98
  762. package/dist/deployment/config/loader.d.ts +0 -24
  763. package/dist/deployment/config/loader.js +0 -237
  764. package/dist/deployment/config/types.d.ts +0 -117
  765. package/dist/deployment/config/types.js +0 -5
  766. package/dist/deployment/core/adapters.d.ts +0 -66
  767. package/dist/deployment/core/adapters.js +0 -156
  768. package/dist/deployment/core/executor.d.ts +0 -62
  769. package/dist/deployment/core/executor.js +0 -197
  770. package/dist/deployment/core/formatters.d.ts +0 -42
  771. package/dist/deployment/core/formatters.js +0 -146
  772. package/dist/deployment/openapi/generator.d.ts +0 -146
  773. package/dist/deployment/openapi/generator.js +0 -347
  774. package/dist/deployment/openapi/schema-converter.d.ts +0 -49
  775. package/dist/deployment/openapi/schema-converter.js +0 -192
  776. package/dist/deployment/targets/base.js +0 -855
  777. package/dist/deployment/types.d.ts +0 -140
  778. package/dist/deployment/types.js +0 -8
  779. package/dist/diagram/ascii-renderer.js +0 -528
  780. package/dist/diagram/geometry.js +0 -1267
  781. package/dist/diagram/html-viewer.d.ts +0 -21
  782. package/dist/diagram/html-viewer.js +0 -1689
  783. package/dist/diagram/layout.js +0 -143
  784. package/dist/diagram/orthogonal-router.js +0 -568
  785. package/dist/diagram/renderer.d.ts +0 -3
  786. package/dist/diagram/renderer.js +0 -266
  787. package/dist/diagram/theme.js +0 -282
  788. package/dist/diagram/types.js +0 -2
  789. package/dist/diff/WorkflowDiffer.js +0 -429
  790. package/dist/diff/formatDiff.js +0 -239
  791. package/dist/diff/impact.js +0 -119
  792. package/dist/diff/types.js +0 -35
  793. package/dist/doc-metadata/extractors/annotations.js +0 -638
  794. package/dist/doc-metadata/extractors/cli-commands.js +0 -326
  795. package/dist/doc-metadata/extractors/core-metadata.js +0 -61
  796. package/dist/doc-metadata/extractors/error-codes.js +0 -372
  797. package/dist/doc-metadata/extractors/grammar-rules.js +0 -51
  798. package/dist/doc-metadata/extractors/mcp-tools.js +0 -705
  799. package/dist/doc-metadata/extractors/plugin-api.d.ts +0 -19
  800. package/dist/doc-metadata/extractors/plugin-api.js +0 -279
  801. package/dist/doc-metadata/types.js +0 -5
  802. package/dist/editor-completions/annotationValues.js +0 -146
  803. package/dist/editor-completions/contextParser.js +0 -410
  804. package/dist/editor-completions/dataTypes.js +0 -95
  805. package/dist/editor-completions/goToDefinition.js +0 -112
  806. package/dist/editor-completions/jsDocAnnotations.js +0 -359
  807. package/dist/editor-completions/modifierCompletions.js +0 -197
  808. package/dist/editor-completions/types.js +0 -8
  809. package/dist/export/index.js +0 -212
  810. package/dist/extensions/index.d.ts +0 -16
  811. package/dist/extensions/index.js +0 -17
  812. package/dist/friendly-errors.js +0 -761
  813. package/dist/function-like.js +0 -84
  814. package/dist/generator/async-detection.js +0 -56
  815. package/dist/generator/code-utils.js +0 -551
  816. package/dist/generator/compile-target-registry.d.ts +0 -20
  817. package/dist/generator/compile-target-registry.js +0 -20
  818. package/dist/generator/control-flow.js +0 -358
  819. package/dist/generator/dev-mode-registry.d.ts +0 -27
  820. package/dist/generator/dev-mode-registry.js +0 -20
  821. package/dist/generator/scope-function-generator.js +0 -397
  822. package/dist/generator/unified.js +0 -1831
  823. package/dist/generator.d.ts +0 -54
  824. package/dist/generator.js +0 -101
  825. package/dist/jsdoc-parser.d.ts +0 -377
  826. package/dist/jsdoc-parser.js +0 -1189
  827. package/dist/jsdoc-port-sync/constants.js +0 -103
  828. package/dist/jsdoc-port-sync/diff.js +0 -319
  829. package/dist/jsdoc-port-sync/port-parser.js +0 -579
  830. package/dist/jsdoc-port-sync/rename.js +0 -256
  831. package/dist/jsdoc-port-sync/signature-parser.js +0 -559
  832. package/dist/jsdoc-port-sync/sync.js +0 -653
  833. package/dist/marketplace/manifest.js +0 -194
  834. package/dist/marketplace/registry.js +0 -198
  835. package/dist/marketplace/types.js +0 -9
  836. package/dist/marketplace/validator.js +0 -150
  837. package/dist/mcp/agent-channel.d.ts +0 -35
  838. package/dist/mcp/agent-channel.js +0 -61
  839. package/dist/mcp/auto-registration.d.ts +0 -3
  840. package/dist/mcp/auto-registration.js +0 -62
  841. package/dist/mcp/debug-session.js +0 -25
  842. package/dist/mcp/index.d.ts +0 -11
  843. package/dist/mcp/index.js +0 -10
  844. package/dist/mcp/pack-tools.js +0 -59
  845. package/dist/mcp/prompts.js +0 -68
  846. package/dist/mcp/response-utils.js +0 -97
  847. package/dist/mcp/run-registry.d.ts +0 -29
  848. package/dist/mcp/run-registry.js +0 -24
  849. package/dist/mcp/server.js +0 -63
  850. package/dist/mcp/tools-context.js +0 -51
  851. package/dist/mcp/tools-debug.js +0 -451
  852. package/dist/mcp/tools-diagram.js +0 -97
  853. package/dist/mcp/tools-docs.js +0 -62
  854. package/dist/mcp/tools-export.js +0 -222
  855. package/dist/mcp/tools-marketplace.js +0 -132
  856. package/dist/mcp/tools-model.d.ts +0 -3
  857. package/dist/mcp/tools-model.js +0 -279
  858. package/dist/mcp/tools-pattern.d.ts +0 -3
  859. package/dist/mcp/tools-pattern.js +0 -604
  860. package/dist/mcp/tools-query.js +0 -377
  861. package/dist/mcp/tools-resources.js +0 -41
  862. package/dist/mcp/tools-template.js +0 -119
  863. package/dist/mcp/tools-workflow-run.d.ts +0 -40
  864. package/dist/mcp/tools-workflow-run.js +0 -150
  865. package/dist/mcp/types.js +0 -2
  866. package/dist/mcp/workflow-executor.js +0 -242
  867. package/dist/migration/registry.js +0 -29
  868. package/dist/node-types-generator.js +0 -139
  869. package/dist/parser/tag-registry.js +0 -57
  870. package/dist/parser.d.ts +0 -232
  871. package/dist/parser.js +0 -2500
  872. package/dist/plugin/PluginPanel.d.ts +0 -12
  873. package/dist/plugin/PluginPanel.js +0 -5
  874. package/dist/plugin/index.d.ts +0 -13
  875. package/dist/plugin/index.js +0 -14
  876. package/dist/plugin/types.d.ts +0 -75
  877. package/dist/plugin/types.js +0 -8
  878. package/dist/resolve-package-types.js +0 -123
  879. package/dist/runtime/CancellationError.js +0 -20
  880. package/dist/runtime/ExecutionContext.js +0 -280
  881. package/dist/runtime/builtin-functions.js +0 -549
  882. package/dist/runtime/checkpoint.d.ts +0 -84
  883. package/dist/runtime/checkpoint.js +0 -225
  884. package/dist/runtime/debug-controller.js +0 -247
  885. package/dist/runtime/events.js +0 -2
  886. package/dist/runtime/function-registry.js +0 -66
  887. package/dist/runtime/parameter-resolver.js +0 -113
  888. package/dist/server/types.js +0 -5
  889. package/dist/server/webhook-server.js +0 -269
  890. package/dist/server/workflow-registry.js +0 -202
  891. package/dist/shared-project.js +0 -28
  892. package/dist/sugar-optimizer.js +0 -498
  893. package/dist/testing/assertions.js +0 -127
  894. package/dist/testing/mock-approval.js +0 -98
  895. package/dist/testing/mock-llm.js +0 -119
  896. package/dist/testing/recorder.js +0 -70
  897. package/dist/testing/replayer.js +0 -143
  898. package/dist/testing/token-tracker.js +0 -94
  899. package/dist/type-checker.d.ts +0 -42
  900. package/dist/type-checker.js +0 -190
  901. package/dist/type-mappings.js +0 -131
  902. package/dist/types/branded-ports.d.ts +0 -151
  903. package/dist/types/branded-ports.js +0 -121
  904. package/dist/types/index.d.ts +0 -5
  905. package/dist/types/index.js +0 -5
  906. package/dist/types.d.ts +0 -139
  907. package/dist/types.js +0 -15
  908. package/dist/utils/error-utils.js +0 -27
  909. package/dist/utils/lru-cache.js +0 -40
  910. package/dist/utils/port-ordering.js +0 -81
  911. package/dist/utils/port-tag-utils.js +0 -41
  912. package/dist/utils/string-distance.js +0 -56
  913. package/dist/validation/agent-detection.js +0 -115
  914. package/dist/validation/agent-rules.js +0 -262
  915. package/dist/validation/design-rules.js +0 -377
  916. package/dist/validation/rule-registry.js +0 -37
  917. package/dist/validator.d.ts +0 -113
  918. package/dist/validator.js +0 -1631
  919. package/docs/reference/patterns.md +0 -159
  920. package/scripts/postinstall.cjs +0 -86
  921. /package/dist/{shared-project.d.ts → parser/shared-project.d.ts} +0 -0
  922. /package/dist/{friendly-errors.d.ts → validation/friendly-errors.d.ts} +0 -0
@@ -1,1477 +0,0 @@
1
- /**
2
- * In-Place Code Generation
3
- *
4
- * Generates executable code directly into the source file while preserving
5
- * user code (node functions). Updates:
6
- * - Runtime section (between markers)
7
- * - Workflow JSDoc annotations (when AST changes)
8
- * - Function body (between markers)
9
- */
10
- import { bodyGenerator } from '../body-generator.js';
11
- import { generateInlineRuntime } from './inline-runtime.js';
12
- import { isExecutePort, isSuccessPort, isFailurePort, isControlFlowPort } from '../constants.js';
13
- import { generateJSDocPortTag, assignPortOrders, generateNodeInstanceTag, } from '../annotation-generator.js';
14
- import { shouldWorkflowBeAsync } from '../generator/async-detection.js';
15
- import { detectSugarPatterns, filterStaleMacros } from '../sugar-optimizer.js';
16
- import * as ts from 'typescript';
17
- import * as path from 'path';
18
- // Marker constants
19
- export const MARKERS = {
20
- RUNTIME_START: '// @flow-weaver-runtime-start',
21
- RUNTIME_END: '// @flow-weaver-runtime-end',
22
- BODY_START: '// @flow-weaver-body-start',
23
- BODY_END: '// @flow-weaver-body-end',
24
- };
25
- /**
26
- * Generate executable code in-place, preserving user code.
27
- *
28
- * @param sourceCode - The original source code
29
- * @param ast - The parsed workflow AST
30
- * @param options - Generation options
31
- * @returns The updated source code with generated sections
32
- */
33
- export function generateInPlace(sourceCode, ast, options = {}) {
34
- const { production = false, allWorkflows, moduleFormat = 'esm', sourceFile, skipParamReturns = false } = options;
35
- let result = sourceCode;
36
- let hasChanges = false;
37
- // Step 1: Update JSDoc annotations for node type functions
38
- // Skip sibling workflows (variant IMPORTED_WORKFLOW/WORKFLOW) — their JSDoc should not be rewritten
39
- for (const nodeType of ast.nodeTypes) {
40
- if (nodeType.variant === 'IMPORTED_WORKFLOW' || nodeType.variant === 'WORKFLOW' || nodeType.variant === 'MAP_ITERATOR') {
41
- continue;
42
- }
43
- // Skip node types imported from other files — the import statement handles them.
44
- // Inlining would create duplicate declarations (TS2440) and duplicate node type names.
45
- // Compare basenames as a fallback: after a client roundtrip (JSON serialization),
46
- // sourceLocation.file may contain a virtual path ("/testing.ts") instead of the
47
- // real workspace path. Full-path comparison would incorrectly skip the node type.
48
- // Normalize separators for cross-platform (Windows backslash → forward slash).
49
- if (nodeType.sourceLocation?.file) {
50
- const ntFile = nodeType.sourceLocation.file.replace(/\\/g, '/');
51
- const astFile = ast.sourceFile.replace(/\\/g, '/');
52
- const ntBase = ntFile.split('/').filter(Boolean).pop() ?? '';
53
- const astBase = astFile.split('/').filter(Boolean).pop() ?? '';
54
- if (path.resolve(ntFile) !== path.resolve(astFile) &&
55
- ntBase !== astBase) {
56
- continue;
57
- }
58
- }
59
- // Skip built-in auto-injected nodes — step 1.2 handles their insertion
60
- if (!nodeType.sourceLocation && nodeType.helperText != null) {
61
- continue;
62
- }
63
- const nodeTypeResult = replaceNodeTypeJSDoc(result, nodeType);
64
- if (nodeTypeResult.changed) {
65
- result = nodeTypeResult.code;
66
- hasChanges = true;
67
- }
68
- }
69
- // Step 1.2: Insert built-in node functions that are auto-injected (no source in the file)
70
- const usedNodeTypes = new Set(ast.instances.map((i) => i.nodeType));
71
- const builtInNodes = ast.nodeTypes.filter((nt) => !nt.sourceLocation && nt.functionText && nt.helperText != null && usedNodeTypes.has(nt.name));
72
- if (builtInNodes.length > 0) {
73
- // Find insertion point: just before the workflow function's JSDoc
74
- const workflowFnPattern = new RegExp(`(/\\*\\*[\\s\\S]*?@flowWeaver\\s+workflow[\\s\\S]*?\\*/)\\s*\\n\\s*(?:export\\s+)?(?:async\\s+)?function\\s+${ast.functionName}\\b`);
75
- const match = result.match(workflowFnPattern);
76
- if (match && match.index !== undefined) {
77
- const insertionLines = [];
78
- // Emit shared helpers once (deduplicated)
79
- const emittedHelpers = new Set();
80
- for (const node of builtInNodes) {
81
- const helperText = production ? (node.helperTextProduction ?? null) : (node.helperText ?? null);
82
- if (helperText && !emittedHelpers.has(helperText)) {
83
- emittedHelpers.add(helperText);
84
- insertionLines.push(helperText);
85
- insertionLines.push('');
86
- }
87
- }
88
- // Emit each built-in function with its JSDoc
89
- for (const node of builtInNodes) {
90
- const funcText = (production && node.functionTextProduction != null) ? node.functionTextProduction : node.functionText;
91
- if (funcText) {
92
- // Add JSDoc annotation so the function is recognized on re-parse
93
- const portAnnotations = [];
94
- portAnnotations.push('/**');
95
- portAnnotations.push(` * @flowWeaver nodeType`);
96
- for (const [name, port] of Object.entries(node.inputs)) {
97
- if (name === 'execute')
98
- continue;
99
- const optPrefix = port.optional ? '[' : '';
100
- const optSuffix = port.optional ? ']' : '';
101
- portAnnotations.push(` * @input ${optPrefix}${name}${optSuffix} - ${port.label || name}`);
102
- }
103
- for (const [name, port] of Object.entries(node.outputs)) {
104
- if (name === 'onSuccess' || name === 'onFailure')
105
- continue;
106
- portAnnotations.push(` * @output ${name} - ${port.label || name}`);
107
- }
108
- portAnnotations.push(' */');
109
- insertionLines.push(portAnnotations.join('\n'));
110
- insertionLines.push(funcText);
111
- insertionLines.push('');
112
- }
113
- }
114
- const insertionCode = insertionLines.join('\n');
115
- result = result.slice(0, match.index) + insertionCode + '\n' + result.slice(match.index);
116
- hasChanges = true;
117
- }
118
- }
119
- // Step 1.5: Remove orphaned nodeType functions (functions that don't match any AST nodeType)
120
- // When multi-workflow, consider ALL workflows' node types to avoid deleting types used by siblings
121
- const cleanupResult = removeOrphanedNodeTypeFunctions(result, ast, allWorkflows);
122
- if (cleanupResult.changed) {
123
- result = cleanupResult.code;
124
- hasChanges = true;
125
- }
126
- // Step 2: Update JSDoc annotations for workflow function
127
- const jsdocResult = replaceWorkflowJSDoc(result, ast, { skipParamReturns });
128
- if (jsdocResult.changed) {
129
- result = jsdocResult.code;
130
- hasChanges = true;
131
- }
132
- // Step 3: Generate and insert/replace runtime section (always inlined — zero runtime dependencies)
133
- const runtimeCode = generateRuntimeSection(ast.functionName, production, moduleFormat);
134
- const runtimeResult = replaceOrInsertSection(result, MARKERS.RUNTIME_START, MARKERS.RUNTIME_END, runtimeCode, 'top');
135
- if (runtimeResult.changed) {
136
- result = runtimeResult.code;
137
- hasChanges = true;
138
- }
139
- // Step 4: Ensure function signature includes __abortSignal__ parameter
140
- const signatureResult = ensureAbortSignalParameter(result, ast.functionName);
141
- if (signatureResult.changed) {
142
- result = signatureResult.code;
143
- hasChanges = true;
144
- }
145
- // Step 5: Detect async from node composition + source signature
146
- // If any node is async, force async (even if source isn't marked async)
147
- // In dev mode (!production), always force async so the debugger can pause execution
148
- // at breakpoints (sendStatusChangedEvent must be awaited).
149
- const nodesRequireAsync = shouldWorkflowBeAsync(ast, ast.nodeTypes);
150
- const sourceIsAsync = detectFunctionIsAsync(result, ast.functionName);
151
- const forceAsync = nodesRequireAsync || !production;
152
- const isAsync = forceAsync || sourceIsAsync;
153
- // Add async keyword to source if nodes or debug hooks require it
154
- const asyncSigResult = ensureAsyncKeyword(result, ast.functionName, forceAsync);
155
- if (asyncSigResult.changed) {
156
- result = asyncSigResult.code;
157
- hasChanges = true;
158
- }
159
- // Step 5b: Wrap return type in Promise<T> when async was added
160
- const returnTypeResult = ensurePromiseReturnType(result, ast.functionName, forceAsync);
161
- if (returnTypeResult.changed) {
162
- result = returnTypeResult.code;
163
- hasChanges = true;
164
- }
165
- const functionBody = generateFunctionBody(ast, production, isAsync);
166
- const bodyResult = replaceWorkflowFunctionBody(result, ast.functionName, functionBody);
167
- if (bodyResult.changed) {
168
- result = bodyResult.code;
169
- hasChanges = true;
170
- }
171
- // Final check: if the output equals the input, there were no real changes
172
- // This catches cases where individual steps report changes but produce identical output
173
- if (hasChanges && result === sourceCode) {
174
- hasChanges = false;
175
- }
176
- return { code: result, hasChanges };
177
- }
178
- /**
179
- * Generate the runtime section with proper markers.
180
- * Runtime is always inlined — zero runtime dependencies.
181
- */
182
- function generateRuntimeSection(functionName, production, moduleFormat = 'esm') {
183
- const lines = [];
184
- lines.push('// ============================================================================');
185
- lines.push('// DO NOT EDIT - This section is auto-generated by Flow Weaver');
186
- lines.push('// ============================================================================');
187
- lines.push('');
188
- lines.push(generateInlineRuntime(production));
189
- return lines.join('\n');
190
- }
191
- /**
192
- * Detect if a workflow function is declared as async
193
- */
194
- function detectFunctionIsAsync(source, functionName) {
195
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
196
- let isAsync = false;
197
- ts.forEachChild(sourceFile, (node) => {
198
- if (ts.isFunctionDeclaration(node) && node.name?.text === functionName) {
199
- isAsync = !!node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword);
200
- }
201
- });
202
- return isAsync;
203
- }
204
- /**
205
- * Ensure the workflow function has __abortSignal__ parameter.
206
- * Adds it if not present.
207
- */
208
- function ensureAbortSignalParameter(source, functionName) {
209
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
210
- let functionNode;
211
- ts.forEachChild(sourceFile, (node) => {
212
- if (ts.isFunctionDeclaration(node) && node.name?.text === functionName) {
213
- functionNode = node;
214
- }
215
- });
216
- if (!functionNode) {
217
- return { code: source, changed: false };
218
- }
219
- // Check if __abortSignal__ parameter already exists
220
- const hasAbortSignal = functionNode.parameters.some((param) => ts.isIdentifier(param.name) && param.name.text === '__abortSignal__');
221
- if (hasAbortSignal) {
222
- return { code: source, changed: false };
223
- }
224
- // Find the closing parenthesis of the parameter list
225
- const lastParam = functionNode.parameters[functionNode.parameters.length - 1];
226
- if (!lastParam) {
227
- // No parameters - find the opening parenthesis and insert after it
228
- const openParen = source.indexOf('(', functionNode.name?.end || 0);
229
- if (openParen === -1) {
230
- return { code: source, changed: false };
231
- }
232
- const before = source.slice(0, openParen + 1);
233
- const after = source.slice(openParen + 1);
234
- return {
235
- code: before + '__abortSignal__?: AbortSignal' + after,
236
- changed: true,
237
- };
238
- }
239
- // Has parameters - insert after the last one with a comma
240
- const lastParamEnd = lastParam.end;
241
- const before = source.slice(0, lastParamEnd);
242
- const after = source.slice(lastParamEnd);
243
- return {
244
- code: before + ', __abortSignal__?: AbortSignal' + after,
245
- changed: true,
246
- };
247
- }
248
- /**
249
- * Ensure the workflow function has the correct async/non-async modifier.
250
- * If shouldBeAsync is true and the function is not async, adds the `async` keyword.
251
- */
252
- function ensureAsyncKeyword(source, functionName, shouldBeAsync) {
253
- if (!shouldBeAsync) {
254
- return { code: source, changed: false };
255
- }
256
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
257
- let functionNode;
258
- ts.forEachChild(sourceFile, (node) => {
259
- if (ts.isFunctionDeclaration(node) && node.name?.text === functionName) {
260
- functionNode = node;
261
- }
262
- });
263
- if (!functionNode) {
264
- return { code: source, changed: false };
265
- }
266
- const alreadyAsync = !!functionNode.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword);
267
- if (alreadyAsync) {
268
- return { code: source, changed: false };
269
- }
270
- // Find the 'function' keyword position and insert 'async ' before it
271
- const funcStart = functionNode.getStart();
272
- const textAfter = source.slice(funcStart);
273
- // The text at funcStart starts with optional 'export' then 'function'
274
- // Insert 'async ' right before 'function'
275
- const functionKeywordOffset = textAfter.indexOf('function');
276
- if (functionKeywordOffset === -1) {
277
- return { code: source, changed: false };
278
- }
279
- const insertPos = funcStart + functionKeywordOffset;
280
- const before = source.slice(0, insertPos);
281
- const after = source.slice(insertPos);
282
- return {
283
- code: before + 'async ' + after,
284
- changed: true,
285
- };
286
- }
287
- /**
288
- * Ensure the workflow function's return type is wrapped in Promise<T> when async is required.
289
- * If shouldBeAsync is true and the return type is not already Promise<...>, wraps it.
290
- */
291
- function ensurePromiseReturnType(source, functionName, shouldBeAsync) {
292
- if (!shouldBeAsync) {
293
- return { code: source, changed: false };
294
- }
295
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
296
- let functionNode;
297
- ts.forEachChild(sourceFile, (node) => {
298
- if (ts.isFunctionDeclaration(node) && node.name?.text === functionName) {
299
- functionNode = node;
300
- }
301
- });
302
- if (!functionNode || !functionNode.type) {
303
- return { code: source, changed: false };
304
- }
305
- const returnTypeText = source.slice(functionNode.type.pos, functionNode.type.end).trim();
306
- // Already wrapped in Promise<...>
307
- if (returnTypeText.startsWith('Promise<')) {
308
- return { code: source, changed: false };
309
- }
310
- const before = source.slice(0, functionNode.type.pos);
311
- const after = source.slice(functionNode.type.end);
312
- return {
313
- code: before + ' Promise<' + returnTypeText + '>' + after,
314
- changed: true,
315
- };
316
- }
317
- /**
318
- * Generate the workflow function body
319
- */
320
- function generateFunctionBody(ast, production, isAsync) {
321
- const lines = [];
322
- lines.push(' // ============================================================================');
323
- lines.push(' // DO NOT EDIT - This section is auto-generated by Flow Weaver');
324
- lines.push(' // Edit the @flowWeaver annotations above to modify workflow behavior');
325
- lines.push(' // ============================================================================');
326
- lines.push('');
327
- // Get the generated body from existing body generator
328
- const body = bodyGenerator.generateWithExecutionContext(ast, ast.nodeTypes, isAsync, // Respect original function's async/sync nature
329
- production);
330
- // Add proper indentation
331
- const indentedBody = body
332
- .split('\n')
333
- .map((line) => (line.trim() ? ' ' + line : line))
334
- .join('\n');
335
- lines.push(indentedBody);
336
- return lines.join('\n');
337
- }
338
- /**
339
- * Replace content between markers, or insert if markers don't exist
340
- */
341
- function replaceOrInsertSection(source, startMarker, endMarker, newContent, insertPosition) {
342
- const startIdx = source.indexOf(startMarker);
343
- const endIdx = source.indexOf(endMarker);
344
- // If both markers exist, replace content between them
345
- if (startIdx !== -1 && endIdx !== -1) {
346
- const before = source.slice(0, startIdx + startMarker.length);
347
- const after = source.slice(endIdx);
348
- const newCode = before + '\n' + newContent + '\n' + after;
349
- // Check if content actually changed
350
- const originalContent = source.slice(startIdx + startMarker.length, endIdx);
351
- const changed = originalContent.trim() !== newContent.trim();
352
- return { code: newCode, changed };
353
- }
354
- // Markers don't exist - insert them
355
- if (insertPosition === 'top') {
356
- // Insert after imports (if any)
357
- const insertIdx = findInsertPositionAfterImports(source);
358
- const before = source.slice(0, insertIdx);
359
- const after = source.slice(insertIdx);
360
- const newSection = ['', startMarker, newContent, endMarker, ''].join('\n');
361
- return {
362
- code: before + newSection + after,
363
- changed: true,
364
- };
365
- }
366
- return { code: source, changed: false };
367
- }
368
- /**
369
- * Find the position after all imports in the source code
370
- */
371
- function findInsertPositionAfterImports(source) {
372
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
373
- let lastImportEnd = 0;
374
- ts.forEachChild(sourceFile, (node) => {
375
- if (ts.isImportDeclaration(node)) {
376
- lastImportEnd = node.end;
377
- }
378
- });
379
- // Find the next line after the last import
380
- if (lastImportEnd > 0) {
381
- const nextNewline = source.indexOf('\n', lastImportEnd);
382
- return nextNewline !== -1 ? nextNewline + 1 : lastImportEnd;
383
- }
384
- // No imports - insert at the very beginning
385
- return 0;
386
- }
387
- /**
388
- * Replace the body of a workflow function with generated code
389
- */
390
- function replaceWorkflowFunctionBody(source, functionName, newBody) {
391
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
392
- let functionNode;
393
- // Find the workflow function
394
- ts.forEachChild(sourceFile, (node) => {
395
- if (ts.isFunctionDeclaration(node) && node.name?.text === functionName) {
396
- functionNode = node;
397
- }
398
- });
399
- if (!functionNode || !functionNode.body) {
400
- return { code: source, changed: false };
401
- }
402
- // Check if body already has markers
403
- const bodyText = source.slice(functionNode.body.pos, functionNode.body.end);
404
- const bodyStartMarkerIdx = bodyText.indexOf(MARKERS.BODY_START);
405
- const bodyEndMarkerIdx = bodyText.indexOf(MARKERS.BODY_END);
406
- if (bodyStartMarkerIdx !== -1 && bodyEndMarkerIdx !== -1) {
407
- // Replace content between body markers
408
- const absoluteBodyStart = functionNode.body.pos + bodyStartMarkerIdx + MARKERS.BODY_START.length;
409
- const absoluteBodyEnd = functionNode.body.pos + bodyEndMarkerIdx;
410
- const before = source.slice(0, absoluteBodyStart);
411
- const after = source.slice(absoluteBodyEnd);
412
- const newCode = before + '\n' + newBody + '\n ' + after;
413
- // Check if content changed
414
- const originalBody = source.slice(absoluteBodyStart, absoluteBodyEnd);
415
- const changed = originalBody.trim() !== newBody.trim();
416
- return { code: newCode, changed };
417
- }
418
- // No markers in body - insert them
419
- // Find the opening brace of the function body
420
- const openBraceIdx = source.indexOf('{', functionNode.body.pos);
421
- if (openBraceIdx === -1) {
422
- return { code: source, changed: false };
423
- }
424
- // Find the closing brace
425
- const closeBraceIdx = functionNode.body.end - 1;
426
- if (closeBraceIdx <= openBraceIdx) {
427
- return { code: source, changed: false };
428
- }
429
- const before = source.slice(0, openBraceIdx + 1);
430
- const after = source.slice(closeBraceIdx);
431
- const newBodyWithMarkers = [
432
- '',
433
- ' ' + MARKERS.BODY_START,
434
- newBody,
435
- ' ' + MARKERS.BODY_END,
436
- '',
437
- ].join('\n');
438
- return {
439
- code: before + newBodyWithMarkers + after,
440
- changed: true,
441
- };
442
- }
443
- /**
444
- * Rename a function in the provided code to a new name.
445
- * Handles both regular functions and arrow functions.
446
- */
447
- function renameFunctionInCode(code, newName) {
448
- const codeSourceFile = ts.createSourceFile('temp.ts', code, ts.ScriptTarget.Latest, true);
449
- let functionName;
450
- let functionNameStart;
451
- let functionNameEnd;
452
- // Find the function declaration
453
- ts.forEachChild(codeSourceFile, (node) => {
454
- if (ts.isFunctionDeclaration(node) && node.name) {
455
- functionName = node.name.text;
456
- functionNameStart = node.name.getStart();
457
- functionNameEnd = node.name.getEnd();
458
- }
459
- });
460
- if (!functionName || functionNameStart === undefined || functionNameEnd === undefined) {
461
- // No function found - return as-is
462
- return code;
463
- }
464
- if (functionName === newName) {
465
- // Already has the correct name
466
- return code;
467
- }
468
- // Replace the function name
469
- const before = code.slice(0, functionNameStart);
470
- const after = code.slice(functionNameEnd);
471
- return before + newName + after;
472
- }
473
- /**
474
- * Insert a new node type function into the source code.
475
- * Inserts before the workflow function (exported function).
476
- * Renames the function to match nodeType.functionName if different.
477
- */
478
- function insertNodeTypeFunction(source, nodeType, functionCode) {
479
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
480
- // Find position AFTER the runtime section end marker to avoid being overwritten
481
- // when the runtime section is replaced
482
- const runtimeEndMarker = '// @flow-weaver-runtime-end';
483
- const runtimeEndPos = source.indexOf(runtimeEndMarker);
484
- let insertPosition = -1;
485
- if (runtimeEndPos !== -1) {
486
- // Insert after the runtime-end marker line
487
- const afterMarker = source.indexOf('\n', runtimeEndPos);
488
- insertPosition = afterMarker !== -1 ? afterMarker + 1 : runtimeEndPos + runtimeEndMarker.length;
489
- }
490
- else {
491
- // No runtime marker - find the first exported function to insert before it
492
- let foundExportedFunction = false;
493
- ts.forEachChild(sourceFile, (node) => {
494
- if (!foundExportedFunction &&
495
- ts.isFunctionDeclaration(node) &&
496
- node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {
497
- insertPosition = node.getFullStart();
498
- foundExportedFunction = true;
499
- }
500
- });
501
- if (insertPosition === -1) {
502
- insertPosition = source.length;
503
- }
504
- }
505
- // Rename the function in the code to match nodeType.functionName
506
- const renamedCode = renameFunctionInCode(functionCode, nodeType.functionName);
507
- // The functionCode should already have JSDoc, but ensure it does
508
- const hasJSDoc = renamedCode.trim().startsWith('/**');
509
- let finalCode = renamedCode;
510
- if (!hasJSDoc) {
511
- // Generate JSDoc for the function
512
- const jsdoc = generateNodeTypeJSDoc(nodeType);
513
- finalCode = jsdoc + '\n' + renamedCode;
514
- }
515
- // Insert the function with proper spacing
516
- const before = source.slice(0, insertPosition);
517
- const after = source.slice(insertPosition);
518
- // Ensure proper newlines
519
- const needsLeadingNewline = before.length > 0 && !before.endsWith('\n\n');
520
- const needsTrailingNewline = after.length > 0 && !after.startsWith('\n');
521
- const newCode = before +
522
- (needsLeadingNewline ? '\n\n' : '') +
523
- finalCode +
524
- (needsTrailingNewline ? '\n\n' : '') +
525
- after;
526
- return { code: newCode, changed: true };
527
- }
528
- /**
529
- * Remove nodeType functions that don't match any AST nodeType.
530
- * This cleans up orphaned functions left behind after renames.
531
- */
532
- function removeOrphanedNodeTypeFunctions(source, ast, allWorkflows) {
533
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
534
- // Get all valid functionNames from AST — include ALL workflows' node types when available
535
- const validFunctionNames = new Set(ast.nodeTypes.map((nt) => nt.functionName));
536
- if (allWorkflows) {
537
- for (const workflow of allWorkflows) {
538
- for (const nt of workflow.nodeTypes) {
539
- validFunctionNames.add(nt.functionName);
540
- }
541
- }
542
- }
543
- // Find all nodeType functions to potentially remove
544
- const functionsToRemove = [];
545
- ts.forEachChild(sourceFile, (node) => {
546
- if (ts.isFunctionDeclaration(node) && node.name) {
547
- const functionName = node.name.text;
548
- // Check if this function has @flowWeaver nodeType JSDoc
549
- const functionStart = node.getFullStart();
550
- const leadingComments = ts.getLeadingCommentRanges(source, functionStart);
551
- if (!leadingComments)
552
- return;
553
- let isNodeTypeFunction = false;
554
- let jsdocStart = functionStart;
555
- for (const comment of leadingComments) {
556
- if (comment.kind === ts.SyntaxKind.MultiLineCommentTrivia) {
557
- const commentText = source.slice(comment.pos, comment.end);
558
- if (commentText.includes('@flowWeaver nodeType')) {
559
- isNodeTypeFunction = true;
560
- jsdocStart = comment.pos;
561
- break;
562
- }
563
- }
564
- }
565
- if (!isNodeTypeFunction)
566
- return;
567
- // If this nodeType function's name doesn't match any valid functionName, mark for removal
568
- if (!validFunctionNames.has(functionName)) {
569
- // Find the start (including JSDoc) and end of the function
570
- const fullStart = jsdocStart;
571
- const fullEnd = node.end;
572
- // Include any trailing newlines
573
- let endPos = fullEnd;
574
- while (endPos < source.length && (source[endPos] === '\n' || source[endPos] === '\r')) {
575
- endPos++;
576
- }
577
- functionsToRemove.push({ start: fullStart, end: endPos });
578
- }
579
- }
580
- });
581
- if (functionsToRemove.length === 0) {
582
- return { code: source, changed: false };
583
- }
584
- // Remove functions from end to start to preserve positions
585
- let result = source;
586
- for (const { start, end } of functionsToRemove.sort((a, b) => b.start - a.start)) {
587
- result = result.slice(0, start) + result.slice(end);
588
- }
589
- return { code: result, changed: true };
590
- }
591
- /**
592
- * Find a function by @name tag in its JSDoc comment.
593
- * Returns the function node and the @name value if found.
594
- */
595
- function findFunctionByNameTag(source, sourceFile, targetName) {
596
- let result;
597
- ts.forEachChild(sourceFile, (node) => {
598
- if (ts.isFunctionDeclaration(node) && node.name) {
599
- // Check if this function has a @name tag matching targetName
600
- const functionStart = node.getFullStart();
601
- const leadingComments = ts.getLeadingCommentRanges(source, functionStart);
602
- if (leadingComments) {
603
- for (const comment of leadingComments) {
604
- if (comment.kind === ts.SyntaxKind.MultiLineCommentTrivia) {
605
- const commentText = source.slice(comment.pos, comment.end);
606
- // Look for @name tag
607
- const nameMatch = commentText.match(/@name\s+(\S+)/);
608
- if (nameMatch && nameMatch[1] === targetName) {
609
- result = node;
610
- return;
611
- }
612
- }
613
- }
614
- }
615
- }
616
- });
617
- return result;
618
- }
619
- /**
620
- * Replace a node type function's JSDoc comment with updated annotations.
621
- * If the function doesn't exist but nodeType has code/functionText, INSERT the function.
622
- * Handles function renames by looking up @name tag when functionName doesn't match.
623
- */
624
- function replaceNodeTypeJSDoc(source, nodeType) {
625
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
626
- let functionNode;
627
- let needsRename = false;
628
- // First, try to find the function by its functionName
629
- ts.forEachChild(sourceFile, (node) => {
630
- if (ts.isFunctionDeclaration(node) && node.name?.text === nodeType.functionName) {
631
- functionNode = node;
632
- }
633
- });
634
- // If not found by functionName, try to find by @name tag (handles renames)
635
- if (!functionNode && nodeType.name) {
636
- functionNode = findFunctionByNameTag(source, sourceFile, nodeType.name);
637
- if (functionNode && functionNode.name?.text !== nodeType.functionName) {
638
- needsRename = true;
639
- }
640
- }
641
- // If still not found and name !== functionName, try finding by name as function name
642
- // This handles the case where no @name tag exists yet (first rename after creation)
643
- if (!functionNode && nodeType.name && nodeType.name !== nodeType.functionName) {
644
- ts.forEachChild(sourceFile, (node) => {
645
- if (ts.isFunctionDeclaration(node) &&
646
- node.name?.text === nodeType.name // Find by stable identifier as function name
647
- ) {
648
- functionNode = node;
649
- needsRename = true;
650
- }
651
- });
652
- }
653
- if (!functionNode) {
654
- // Function doesn't exist - try to INSERT it if we have the code
655
- // Check for code property (dynamically added in some contexts) or functionText
656
- const nodeTypeWithCode = nodeType;
657
- const functionCode = nodeTypeWithCode.code || nodeType.functionText;
658
- if (functionCode) {
659
- return insertNodeTypeFunction(source, nodeType, functionCode);
660
- }
661
- return { code: source, changed: false };
662
- }
663
- let result = source;
664
- let hasChanges = false;
665
- // If function needs to be renamed (found by @name but has old functionName)
666
- if (needsRename && functionNode.name) {
667
- const nameStart = functionNode.name.getStart();
668
- const nameEnd = functionNode.name.getEnd();
669
- result = result.slice(0, nameStart) + nodeType.functionName + result.slice(nameEnd);
670
- hasChanges = true;
671
- // Re-parse to get updated positions after rename
672
- const updatedSourceFile = ts.createSourceFile('temp.ts', result, ts.ScriptTarget.Latest, true);
673
- // Find the renamed function
674
- ts.forEachChild(updatedSourceFile, (node) => {
675
- if (ts.isFunctionDeclaration(node) && node.name?.text === nodeType.functionName) {
676
- functionNode = node;
677
- }
678
- });
679
- if (!functionNode) {
680
- return { code: result, changed: hasChanges };
681
- }
682
- }
683
- // Find the JSDoc comment before the function
684
- const functionStart = functionNode.getFullStart();
685
- const leadingComments = ts.getLeadingCommentRanges(result, functionStart);
686
- if (!leadingComments || leadingComments.length === 0) {
687
- return { code: result, changed: hasChanges };
688
- }
689
- // Find ALL /** JSDoc comments in the leading trivia and separate them:
690
- // - flowWeaverJSDocs: contain @flowWeaver (these are node type annotations)
691
- // - The LAST one is the primary JSDoc to replace
692
- // - Any earlier @flowWeaver JSDoc blocks are stale duplicates to remove
693
- const jsdocComments = [];
694
- for (const c of leadingComments) {
695
- if (c.kind === ts.SyntaxKind.MultiLineCommentTrivia &&
696
- result.slice(c.pos, c.pos + 3) === '/**') {
697
- jsdocComments.push(c);
698
- }
699
- }
700
- if (jsdocComments.length === 0) {
701
- return { code: result, changed: hasChanges };
702
- }
703
- // Use the LAST /** comment as the primary JSDoc (closest to the function).
704
- // This avoids picking up file headers that also start with /**.
705
- const jsdocComment = jsdocComments[jsdocComments.length - 1];
706
- // Detect stale duplicate @flowWeaver JSDoc blocks from previous buggy compilations.
707
- // Any earlier /** that contains @flowWeaver is a stale duplicate to remove.
708
- const staleDuplicates = [];
709
- for (let i = 0; i < jsdocComments.length - 1; i++) {
710
- const text = result.slice(jsdocComments[i].pos, jsdocComments[i].end);
711
- if (text.includes('@flowWeaver')) {
712
- staleDuplicates.push(jsdocComments[i]);
713
- }
714
- }
715
- // Generate new JSDoc using AnnotationGenerator
716
- const newJSDoc = generateNodeTypeJSDoc(nodeType);
717
- // Remove stale duplicates first (process from end to start to preserve positions)
718
- if (staleDuplicates.length > 0) {
719
- for (let i = staleDuplicates.length - 1; i >= 0; i--) {
720
- const dupe = staleDuplicates[i];
721
- // Remove the duplicate and any trailing whitespace/newline
722
- let removeEnd = dupe.end;
723
- while (removeEnd < result.length &&
724
- (result[removeEnd] === '\n' || result[removeEnd] === '\r')) {
725
- removeEnd++;
726
- }
727
- result = result.slice(0, dupe.pos) + result.slice(removeEnd);
728
- hasChanges = true;
729
- }
730
- // Re-parse to get updated positions after removal
731
- const updatedSourceFile = ts.createSourceFile('temp.ts', result, ts.ScriptTarget.Latest, true);
732
- let updatedFunctionNode;
733
- ts.forEachChild(updatedSourceFile, (node) => {
734
- if (ts.isFunctionDeclaration(node) && node.name?.text === nodeType.functionName) {
735
- updatedFunctionNode = node;
736
- }
737
- });
738
- if (!updatedFunctionNode) {
739
- return { code: result, changed: hasChanges };
740
- }
741
- // Re-find the JSDoc comment with updated positions
742
- const updatedStart = updatedFunctionNode.getFullStart();
743
- const updatedComments = ts.getLeadingCommentRanges(result, updatedStart);
744
- if (!updatedComments) {
745
- return { code: result, changed: hasChanges };
746
- }
747
- let updatedJsdoc;
748
- for (const c of updatedComments) {
749
- if (c.kind === ts.SyntaxKind.MultiLineCommentTrivia &&
750
- result.slice(c.pos, c.pos + 3) === '/**') {
751
- updatedJsdoc = c;
752
- }
753
- }
754
- if (!updatedJsdoc) {
755
- return { code: result, changed: hasChanges };
756
- }
757
- // Continue with the updated positions
758
- return replaceJSDocContent(result, updatedJsdoc, updatedFunctionNode, nodeType, newJSDoc, hasChanges);
759
- }
760
- return replaceJSDocContent(result, jsdocComment, functionNode, nodeType, newJSDoc, hasChanges);
761
- }
762
- function replaceJSDocContent(source, jsdocComment, functionNode, nodeType, newJSDoc, hasChanges) {
763
- const originalJSDoc = source.slice(jsdocComment.pos, jsdocComment.end);
764
- // Check if JSDoc changed
765
- const jsdocChanged = originalJSDoc.trim() !== newJSDoc.trim();
766
- // Check if function body needs updating (when functionText is provided)
767
- const nodeTypeWithCode = nodeType;
768
- const newFunctionText = nodeTypeWithCode.code || nodeType.functionText;
769
- let functionBodyChanged = false;
770
- let newFunctionDeclaration = '';
771
- if (newFunctionText) {
772
- // Extract function declaration from functionText (strip ALL leading JSDoc blocks).
773
- // The parser's functionText may include multiple JSDoc blocks (e.g. file header + nodeType JSDoc).
774
- // We must strip ALL of them, not just the first one.
775
- let strippedFunctionText = newFunctionText.trim();
776
- while (strippedFunctionText.startsWith('/**')) {
777
- strippedFunctionText = strippedFunctionText.replace(/^\/\*\*[\s\S]*?\*\/\s*/, '').trim();
778
- }
779
- newFunctionDeclaration = strippedFunctionText;
780
- // Get current function declaration (without JSDoc)
781
- const currentFunctionDeclaration = source
782
- .slice(functionNode.getStart(), functionNode.getEnd())
783
- .trim();
784
- // Normalize for comparison (strip whitespace differences)
785
- const normalizedNew = newFunctionDeclaration.replace(/\s+/g, ' ');
786
- const normalizedCurrent = currentFunctionDeclaration.replace(/\s+/g, ' ');
787
- functionBodyChanged = normalizedNew !== normalizedCurrent;
788
- }
789
- // If nothing changed, return early
790
- if (!jsdocChanged && !functionBodyChanged) {
791
- return { code: source, changed: hasChanges };
792
- }
793
- // Replace the JSDoc and optionally the function body
794
- if (functionBodyChanged && newFunctionDeclaration) {
795
- // Replace entire function (JSDoc + body)
796
- const before = source.slice(0, jsdocComment.pos);
797
- const after = source.slice(functionNode.getEnd());
798
- return {
799
- code: before + newJSDoc + '\n' + newFunctionDeclaration + after,
800
- changed: true,
801
- };
802
- }
803
- else if (jsdocChanged) {
804
- // Only replace JSDoc
805
- const before = source.slice(0, jsdocComment.pos);
806
- const after = source.slice(jsdocComment.end);
807
- return {
808
- code: before + newJSDoc + after,
809
- changed: true,
810
- };
811
- }
812
- return { code: source, changed: hasChanges };
813
- }
814
- /**
815
- * Generate JSDoc comment for node type function
816
- */
817
- function generateNodeTypeJSDoc(nodeType) {
818
- const lines = [];
819
- lines.push('/**');
820
- // Add description
821
- if (nodeType.description) {
822
- lines.push(` * ${nodeType.description}`);
823
- lines.push(` *`);
824
- }
825
- // @flowWeaver marker
826
- lines.push(' * @flowWeaver nodeType');
827
- // Add @expression tag for expression nodes
828
- if (nodeType.expression) {
829
- lines.push(' * @expression');
830
- }
831
- // Add @name tag when name differs from functionName (preserves stable identity across renames)
832
- if (nodeType.name && nodeType.name !== nodeType.functionName) {
833
- lines.push(` * @name ${nodeType.name}`);
834
- }
835
- // Add label if present
836
- if (nodeType.label) {
837
- lines.push(` * @label ${nodeType.label}`);
838
- }
839
- // Add scope if present
840
- if (nodeType.scope) {
841
- lines.push(` * @scope ${nodeType.scope}`);
842
- }
843
- // Add pullExecution if present
844
- if (nodeType.defaultConfig?.pullExecution) {
845
- lines.push(` * @pullExecution ${nodeType.defaultConfig.pullExecution.triggerPort}`);
846
- }
847
- // Add visual annotations
848
- if (nodeType.visuals) {
849
- if (nodeType.visuals.color) {
850
- lines.push(` * @color ${nodeType.visuals.color}`);
851
- }
852
- if (nodeType.visuals.icon) {
853
- lines.push(` * @icon ${nodeType.visuals.icon}`);
854
- }
855
- if (nodeType.visuals.tags && nodeType.visuals.tags.length > 0) {
856
- for (const tag of nodeType.visuals.tags) {
857
- if (tag.tooltip) {
858
- lines.push(` * @tag ${tag.label} "${tag.tooltip}"`);
859
- }
860
- else {
861
- lines.push(` * @tag ${tag.label}`);
862
- }
863
- }
864
- }
865
- }
866
- // Handle both formats: inputs/outputs dictionaries OR ports array
867
- let inputEntries = [];
868
- let outputEntries = [];
869
- if (nodeType.inputs && Object.keys(nodeType.inputs).length > 0) {
870
- // Use native inputs/outputs format
871
- // For expression nodes, skip auto-generated control flow ports (execute, onSuccess, onFailure)
872
- const filterControlFlow = nodeType.expression
873
- ? ([name]) => !isExecutePort(name) && !isSuccessPort(name) && !isFailurePort(name)
874
- : () => true;
875
- inputEntries = assignPortOrders(Object.entries(nodeType.inputs).filter(filterControlFlow), 'input');
876
- outputEntries = assignPortOrders(Object.entries(nodeType.outputs || {}).filter(filterControlFlow), 'output');
877
- }
878
- else if (nodeType.ports && nodeType.ports.length > 0) {
879
- // Convert from ports array format (UI format)
880
- const inputs = [];
881
- const outputs = [];
882
- for (const port of nodeType.ports) {
883
- // Skip mandatory control flow ports - they're implicit
884
- if (isExecutePort(port.name) || isSuccessPort(port.name) || isFailurePort(port.name)) {
885
- continue;
886
- }
887
- const portDef = {
888
- dataType: (port.type || port.dataType || 'ANY'),
889
- label: port.defaultLabel || port.name,
890
- scope: port.scope,
891
- metadata: { order: port.defaultOrder },
892
- };
893
- if (port.direction === 'INPUT') {
894
- inputs.push([port.name, portDef]);
895
- }
896
- else {
897
- outputs.push([port.name, portDef]);
898
- }
899
- }
900
- inputEntries = assignPortOrders(inputs, 'input');
901
- outputEntries = assignPortOrders(outputs, 'output');
902
- }
903
- // Add input ports
904
- for (const [name, port] of inputEntries) {
905
- const portTag = generateJSDocPortTag(name, port, 'input');
906
- lines.push(` * ${portTag}`);
907
- }
908
- // Add output ports
909
- for (const [name, port] of outputEntries) {
910
- const portTag = generateJSDocPortTag(name, port, 'output');
911
- lines.push(` * ${portTag}`);
912
- }
913
- lines.push(' */');
914
- return lines.join('\n');
915
- }
916
- // Note: generateJSDocPortTag and assignPortOrders are now imported from annotation-generator
917
- // to maintain DRY principle and ensure consistent behavior across all code generation
918
- /**
919
- * Replace the workflow function's JSDoc comment with updated annotations
920
- */
921
- function replaceWorkflowJSDoc(source, ast, options = {}) {
922
- const sourceFile = ts.createSourceFile('temp.ts', source, ts.ScriptTarget.Latest, true);
923
- let functionNode;
924
- // Find the FIRST workflow function with the matching name.
925
- // ts.forEachChild visits all children — we break on first match to avoid
926
- // targeting a later duplicate (which corrupts the wrong function's JSDoc).
927
- ts.forEachChild(sourceFile, (node) => {
928
- if (functionNode)
929
- return; // already found — skip
930
- if (ts.isFunctionDeclaration(node) && node.name?.text === ast.functionName) {
931
- functionNode = node;
932
- }
933
- });
934
- if (!functionNode) {
935
- return { code: source, changed: false };
936
- }
937
- // Find the JSDoc comment before the function
938
- const functionStart = functionNode.getFullStart();
939
- const leadingComments = ts.getLeadingCommentRanges(source, functionStart);
940
- if (!leadingComments || leadingComments.length === 0) {
941
- return { code: source, changed: false };
942
- }
943
- // Find the JSDoc comment (starts with /**)
944
- const jsdocComment = leadingComments.find((c) => c.kind === ts.SyntaxKind.MultiLineCommentTrivia && source.slice(c.pos, c.pos + 3) === '/**');
945
- if (!jsdocComment) {
946
- return { code: source, changed: false };
947
- }
948
- // Generate new JSDoc
949
- const newJSDoc = generateWorkflowJSDoc(ast, { skipParamReturns: options.skipParamReturns });
950
- // Get the original JSDoc
951
- const originalJSDoc = source.slice(jsdocComment.pos, jsdocComment.end);
952
- // Check if changed
953
- if (originalJSDoc.trim() === newJSDoc.trim()) {
954
- return { code: source, changed: false };
955
- }
956
- // Replace the JSDoc
957
- const before = source.slice(0, jsdocComment.pos);
958
- const after = source.slice(jsdocComment.end);
959
- return {
960
- code: before + newJSDoc + after,
961
- changed: true,
962
- };
963
- }
964
- /**
965
- * Check if a connection is covered by a macro (and should not be written as @connect).
966
- * Handles @map and @path macros.
967
- */
968
- function isConnectionCoveredByMacro(conn, macros) {
969
- for (const macro of macros) {
970
- if (macro.type === 'map') {
971
- const [sourceNode, sourcePort] = macro.sourcePort.split('.');
972
- // Scoped connections between the map instance and its child
973
- if ((conn.from.node === macro.instanceId || conn.from.node === macro.childId) &&
974
- (conn.to.node === macro.instanceId || conn.to.node === macro.childId) &&
975
- (conn.from.scope === 'iterate' || conn.to.scope === 'iterate')) {
976
- return true;
977
- }
978
- // Upstream connection: source.port -> mapInstance.items
979
- if (conn.from.node === sourceNode &&
980
- conn.from.port === sourcePort &&
981
- !conn.from.scope &&
982
- conn.to.node === macro.instanceId &&
983
- conn.to.port === 'items' &&
984
- !conn.to.scope) {
985
- return true;
986
- }
987
- }
988
- else if (macro.type === 'path') {
989
- if (conn.from.scope || conn.to.scope)
990
- continue;
991
- const steps = macro.steps;
992
- const fromIdx = steps.findIndex(s => s.node === conn.from.node);
993
- const toIdx = steps.findIndex(s => s.node === conn.to.node);
994
- if (fromIdx === -1 || toIdx === -1 || fromIdx >= toIdx)
995
- continue;
996
- // Control flow: check consecutive pairs
997
- if (toIdx === fromIdx + 1) {
998
- const route = steps[fromIdx].route || 'ok';
999
- if (conn.from.node === 'Start' && conn.from.port === 'execute' && conn.to.port === 'execute')
1000
- return true;
1001
- if (conn.to.node === 'Exit') {
1002
- if (route === 'fail' && conn.from.port === 'onFailure' && conn.to.port === 'onFailure')
1003
- return true;
1004
- if (route === 'ok' && conn.from.port === 'onSuccess' && conn.to.port === 'onSuccess')
1005
- return true;
1006
- }
1007
- if (route === 'fail' && conn.from.port === 'onFailure' && conn.to.port === 'execute')
1008
- return true;
1009
- if (route === 'ok' && conn.from.port === 'onSuccess' && conn.to.port === 'execute')
1010
- return true;
1011
- }
1012
- // Data: same-name non-control-flow, from before to, to is not Exit
1013
- if (conn.to.node !== 'Exit' &&
1014
- !isControlFlowPort(conn.from.port) &&
1015
- !isControlFlowPort(conn.to.port) &&
1016
- conn.from.port === conn.to.port) {
1017
- return true;
1018
- }
1019
- }
1020
- else if (macro.type === 'fanOut') {
1021
- if (conn.from.scope || conn.to.scope)
1022
- continue;
1023
- if (conn.from.node === macro.source.node && conn.from.port === macro.source.port) {
1024
- for (const target of macro.targets) {
1025
- const targetPort = target.port ?? macro.source.port;
1026
- if (conn.to.node === target.node && conn.to.port === targetPort) {
1027
- return true;
1028
- }
1029
- }
1030
- }
1031
- }
1032
- else if (macro.type === 'fanIn') {
1033
- if (conn.from.scope || conn.to.scope)
1034
- continue;
1035
- if (conn.to.node === macro.target.node && conn.to.port === macro.target.port) {
1036
- for (const source of macro.sources) {
1037
- const sourcePort = source.port ?? macro.target.port;
1038
- if (conn.from.node === source.node && conn.from.port === sourcePort) {
1039
- return true;
1040
- }
1041
- }
1042
- }
1043
- }
1044
- }
1045
- return false;
1046
- }
1047
- /**
1048
- * Generate JSDoc comment for workflow function
1049
- */
1050
- function generateWorkflowJSDoc(ast, options = {}) {
1051
- const lines = [];
1052
- // Build macro coverage sets for filtering (@map and @coerce)
1053
- const macroInstanceIds = new Set();
1054
- const macroChildIds = new Set();
1055
- const macroScopeNames = new Set();
1056
- const allCoerceInstanceIds = new Set();
1057
- if (ast.macros && ast.macros.length > 0) {
1058
- for (const macro of ast.macros) {
1059
- if (macro.type === 'map') {
1060
- macroInstanceIds.add(macro.instanceId);
1061
- macroChildIds.add(macro.childId);
1062
- macroScopeNames.add(`${macro.instanceId}.iterate`);
1063
- }
1064
- else if (macro.type === 'coerce') {
1065
- allCoerceInstanceIds.add(macro.instanceId);
1066
- }
1067
- }
1068
- }
1069
- lines.push('/**');
1070
- // Add description
1071
- if (ast.description) {
1072
- lines.push(` * ${ast.description}`);
1073
- lines.push(` *`);
1074
- }
1075
- // @flowWeaver marker
1076
- lines.push(' * @flowWeaver workflow');
1077
- // Add workflow options
1078
- if (ast.options?.strictTypes) {
1079
- lines.push(' * @strictTypes');
1080
- }
1081
- if (ast.options?.autoConnect) {
1082
- lines.push(' * @autoConnect');
1083
- }
1084
- // @trigger round-trip
1085
- if (ast.options?.trigger) {
1086
- const t = ast.options.trigger;
1087
- const parts = [];
1088
- if (t.event)
1089
- parts.push(`event="${t.event}"`);
1090
- if (t.cron)
1091
- parts.push(`cron="${t.cron}"`);
1092
- if (parts.length > 0)
1093
- lines.push(` * @trigger ${parts.join(' ')}`);
1094
- }
1095
- // @cancelOn round-trip
1096
- if (ast.options?.cancelOn) {
1097
- const c = ast.options.cancelOn;
1098
- let line = ` * @cancelOn event="${c.event}"`;
1099
- if (c.match)
1100
- line += ` match="${c.match}"`;
1101
- if (c.timeout)
1102
- line += ` timeout="${c.timeout}"`;
1103
- lines.push(line);
1104
- }
1105
- // @retries round-trip
1106
- if (ast.options?.retries !== undefined) {
1107
- lines.push(` * @retries ${ast.options.retries}`);
1108
- }
1109
- // @timeout round-trip
1110
- if (ast.options?.timeout) {
1111
- lines.push(` * @timeout "${ast.options.timeout}"`);
1112
- }
1113
- // @throttle round-trip
1114
- if (ast.options?.throttle) {
1115
- const t = ast.options.throttle;
1116
- let line = ` * @throttle limit=${t.limit}`;
1117
- if (t.period)
1118
- line += ` period="${t.period}"`;
1119
- lines.push(line);
1120
- }
1121
- // CI/CD annotations round-trip (from pack-contributed tag handlers)
1122
- if (ast.options?.cicd) {
1123
- const cicd = ast.options.cicd;
1124
- if (cicd.triggers && Array.isArray(cicd.triggers)) {
1125
- for (const trigger of cicd.triggers) {
1126
- const parts = [String(trigger.type || '')];
1127
- if (trigger.branches)
1128
- parts.push(`branches="${trigger.branches}"`);
1129
- if (trigger.types)
1130
- parts.push(`types="${trigger.types}"`);
1131
- if (trigger.pattern)
1132
- parts.push(`pattern="${trigger.pattern}"`);
1133
- if (trigger.cron)
1134
- parts.push(`cron="${trigger.cron}"`);
1135
- lines.push(` * @trigger ${parts.join(' ')}`);
1136
- }
1137
- }
1138
- if (cicd.secrets && Array.isArray(cicd.secrets)) {
1139
- for (const secret of cicd.secrets) {
1140
- let line = ` * @secret ${secret.name}`;
1141
- if (secret.description)
1142
- line += ` - ${secret.description}`;
1143
- lines.push(line);
1144
- }
1145
- }
1146
- if (cicd.runner) {
1147
- lines.push(` * @runner ${cicd.runner}`);
1148
- }
1149
- if (cicd.caches && Array.isArray(cicd.caches)) {
1150
- for (const cache of cicd.caches) {
1151
- let line = ` * @cache ${cache.strategy || 'npm'}`;
1152
- if (cache.key)
1153
- line += ` key="${cache.key}"`;
1154
- if (cache.path)
1155
- line += ` path="${cache.path}"`;
1156
- lines.push(line);
1157
- }
1158
- }
1159
- }
1160
- // Add name if different from function name
1161
- if (ast.name && ast.name !== ast.functionName) {
1162
- lines.push(` * @name ${ast.name}`);
1163
- }
1164
- // Add npm package imports (external node types with importSource)
1165
- // Format: @fwImport nodeName functionName from "packageName"
1166
- // This persists npm node types so they survive file re-parsing
1167
- const npmNodeTypes = ast.nodeTypes.filter((nt) => nt.importSource);
1168
- const seenImportNames = new Set();
1169
- for (const npmType of npmNodeTypes) {
1170
- if (seenImportNames.has(npmType.name))
1171
- continue;
1172
- seenImportNames.add(npmType.name);
1173
- // Derive the actual function name:
1174
- // - If functionName differs from name, use functionName (explicitly set)
1175
- // - Otherwise, extract from npm path: "npm/package/funcName" -> "funcName"
1176
- let actualFunctionName = npmType.functionName;
1177
- if (npmType.functionName === npmType.name && npmType.name.startsWith('npm/')) {
1178
- // Extract function name from npm path: npm/package/funcName -> funcName
1179
- const parts = npmType.name.split('/');
1180
- actualFunctionName = parts[parts.length - 1];
1181
- }
1182
- lines.push(` * @fwImport ${npmType.name} ${actualFunctionName} from "${npmType.importSource}"`);
1183
- }
1184
- // Auto-position: compute default positions for nodes without explicit positions.
1185
- // Must happen before instance tags are generated so [position:] can be emitted.
1186
- const autoPositions = computeAutoPositions(ast);
1187
- // Add node instances — skip synthetic MAP_ITERATOR/COERCION instances, strip parent from macro children.
1188
- // Merge auto-computed positions into instance config (without mutating the AST).
1189
- for (const instance of ast.instances) {
1190
- if (macroInstanceIds.has(instance.id))
1191
- continue;
1192
- if (allCoerceInstanceIds.has(instance.id))
1193
- continue;
1194
- // Merge auto-position into config if not already set
1195
- let inst = instance;
1196
- if (inst.config?.x === undefined || inst.config?.y === undefined) {
1197
- const autoPos = autoPositions.get(inst.id);
1198
- if (autoPos) {
1199
- inst = {
1200
- ...inst,
1201
- config: {
1202
- ...inst.config,
1203
- x: inst.config?.x ?? autoPos.x,
1204
- y: inst.config?.y ?? autoPos.y,
1205
- },
1206
- };
1207
- }
1208
- }
1209
- if (macroChildIds.has(inst.id) && inst.parent) {
1210
- // Write child @node without parent scope — @map handles it
1211
- const stripped = { ...inst, parent: undefined };
1212
- lines.push(generateNodeInstanceTag(stripped));
1213
- }
1214
- else {
1215
- lines.push(generateNodeInstanceTag(inst));
1216
- }
1217
- }
1218
- // Filter stale macros (e.g. paths whose connections were deleted)
1219
- const existingMacros = filterStaleMacros(ast.macros || [], ast.connections, ast.instances, ast.nodeTypes, ast.startPorts, ast.exitPorts);
1220
- // Compute dropped coerce instance IDs — their synthetic instances and connections must be excluded
1221
- const survivingCoerceIds = new Set();
1222
- for (const macro of existingMacros) {
1223
- if (macro.type === 'coerce')
1224
- survivingCoerceIds.add(macro.instanceId);
1225
- }
1226
- const droppedCoerceIds = new Set();
1227
- for (const id of allCoerceInstanceIds) {
1228
- if (!survivingCoerceIds.has(id))
1229
- droppedCoerceIds.add(id);
1230
- }
1231
- // Auto-detect @path sugar patterns from connections
1232
- const detected = detectSugarPatterns(ast.connections, ast.instances, existingMacros, ast.nodeTypes, ast.startPorts, ast.exitPorts);
1233
- // Merge detected macros with existing ones
1234
- const allMacros = [
1235
- ...existingMacros,
1236
- ...detected.paths,
1237
- ];
1238
- // Add @map and @path macros
1239
- if (allMacros.length > 0) {
1240
- for (const macro of allMacros) {
1241
- if (macro.type === 'map') {
1242
- let mapLine = ` * @map ${macro.instanceId} ${macro.childId}`;
1243
- if (macro.inputPort || macro.outputPort) {
1244
- mapLine += `(${macro.inputPort} -> ${macro.outputPort})`;
1245
- }
1246
- mapLine += ` over ${macro.sourcePort}`;
1247
- lines.push(mapLine);
1248
- }
1249
- else if (macro.type === 'path') {
1250
- const stepsStr = macro.steps.map(s => s.route ? `${s.node}:${s.route}` : s.node).join(' -> ');
1251
- lines.push(` * @path ${stepsStr}`);
1252
- }
1253
- else if (macro.type === 'fanOut') {
1254
- const src = `${macro.source.node}.${macro.source.port}`;
1255
- const tgts = macro.targets.map(t => t.port ? `${t.node}.${t.port}` : t.node).join(', ');
1256
- lines.push(` * @fanOut ${src} -> ${tgts}`);
1257
- }
1258
- else if (macro.type === 'fanIn') {
1259
- const srcs = macro.sources.map(s => s.port ? `${s.node}.${s.port}` : s.node).join(', ');
1260
- const tgt = `${macro.target.node}.${macro.target.port}`;
1261
- lines.push(` * @fanIn ${srcs} -> ${tgt}`);
1262
- }
1263
- }
1264
- }
1265
- // Add positions - Start node (virtual, standalone @position)
1266
- const startX = ast.ui?.startNode?.x ?? autoPositions.get('Start')?.x;
1267
- const startY = ast.ui?.startNode?.y ?? autoPositions.get('Start')?.y;
1268
- if (startX !== undefined && startY !== undefined) {
1269
- lines.push(` * @position Start ${Math.round(startX)} ${Math.round(startY)}`);
1270
- }
1271
- // Add positions - Exit node (virtual, standalone @position)
1272
- const exitX = ast.ui?.exitNode?.x ?? autoPositions.get('Exit')?.x;
1273
- const exitY = ast.ui?.exitNode?.y ?? autoPositions.get('Exit')?.y;
1274
- if (exitX !== undefined && exitY !== undefined) {
1275
- lines.push(` * @position Exit ${Math.round(exitX)} ${Math.round(exitY)}`);
1276
- }
1277
- // Add connections (with scope suffix when present)
1278
- // Skip connections covered by macros, autoConnect-generated connections, and dropped coerce connections
1279
- if (!ast.options?.autoConnect) {
1280
- for (const conn of ast.connections) {
1281
- if (allMacros.length > 0 && isConnectionCoveredByMacro(conn, allMacros))
1282
- continue;
1283
- if (droppedCoerceIds.has(conn.from.node) || droppedCoerceIds.has(conn.to.node))
1284
- continue;
1285
- const fromScope = conn.from.scope ? `:${conn.from.scope}` : '';
1286
- const toScope = conn.to.scope ? `:${conn.to.scope}` : '';
1287
- lines.push(` * @connect ${conn.from.node}.${conn.from.port}${fromScope} -> ${conn.to.node}.${conn.to.port}${toScope}`);
1288
- }
1289
- }
1290
- // Add @param annotations for start ports (workflow inputs)
1291
- if (!options.skipParamReturns && ast.startPorts && Object.keys(ast.startPorts).length > 0) {
1292
- const startPortEntries = assignPortOrders(Object.entries(ast.startPorts), 'input');
1293
- startPortEntries.forEach(([name, port], index) => {
1294
- const paramTag = generateJSDocPortTag(name, port, 'input', index);
1295
- // Replace @input with @param for workflow-level JSDoc
1296
- lines.push(` * ${paramTag.replace('@input', '@param')}`);
1297
- });
1298
- }
1299
- // Add @returns annotations for exit ports (workflow outputs)
1300
- if (!options.skipParamReturns && ast.exitPorts && Object.keys(ast.exitPorts).length > 0) {
1301
- const exitPortEntries = assignPortOrders(Object.entries(ast.exitPorts), 'output');
1302
- exitPortEntries.forEach(([name, port], index) => {
1303
- const returnTag = generateJSDocPortTag(name, port, 'output', index);
1304
- // Replace @output with @returns for workflow-level JSDoc
1305
- lines.push(` * ${returnTag.replace('@output', '@returns')}`);
1306
- });
1307
- }
1308
- // Add scopes — skip scopes covered by @map macros
1309
- if (ast.scopes) {
1310
- for (const [scopeName, children] of Object.entries(ast.scopes)) {
1311
- if (macroScopeNames.has(scopeName))
1312
- continue;
1313
- lines.push(` * @scope ${scopeName} [${children.join(', ')}]`);
1314
- }
1315
- }
1316
- lines.push(' */');
1317
- return lines.join('\n');
1318
- }
1319
- /**
1320
- * Compute auto-layout positions for nodes that don't have explicit positions.
1321
- * Uses topological order (from connections) for left-to-right layout.
1322
- * Only computes positions for nodes that are missing them.
1323
- *
1324
- * Layout strategy:
1325
- * - Start node at x=0, y=0
1326
- * - Each subsequent node gets x += 270 (standard node width + gap)
1327
- * - Exit node placed after the last instance
1328
- * - Uses topological order when connections are available
1329
- * - Falls back to declaration order otherwise
1330
- *
1331
- * @returns Map of nodeId -> {x, y} for nodes that need auto-positioned
1332
- */
1333
- function computeAutoPositions(ast) {
1334
- const positions = new Map();
1335
- const SPACING_X = 270; // Standard horizontal spacing between nodes
1336
- // Determine which nodes need positions
1337
- const needsPosition = (nodeId) => {
1338
- if (nodeId === 'Start') {
1339
- return ast.ui?.startNode?.x === undefined || ast.ui?.startNode?.y === undefined;
1340
- }
1341
- if (nodeId === 'Exit') {
1342
- return ast.ui?.exitNode?.x === undefined || ast.ui?.exitNode?.y === undefined;
1343
- }
1344
- const instance = ast.instances.find((inst) => inst.id === nodeId);
1345
- return !instance || instance.config?.x === undefined || instance.config?.y === undefined;
1346
- };
1347
- // Check if any nodes need auto-positioning
1348
- const startNeedsPosition = needsPosition('Start');
1349
- const exitNeedsPosition = needsPosition('Exit');
1350
- const instancesNeedingPosition = ast.instances.filter((inst) => needsPosition(inst.id));
1351
- // If nothing needs positioning, return empty map
1352
- if (!startNeedsPosition && !exitNeedsPosition && instancesNeedingPosition.length === 0) {
1353
- return positions;
1354
- }
1355
- // Compute topological order from connections, or fall back to declaration order
1356
- const orderedIds = computeTopologicalOrder(ast);
1357
- // Assign positions left-to-right
1358
- let currentX = 0;
1359
- const y = 0;
1360
- // Start node
1361
- if (startNeedsPosition) {
1362
- positions.set('Start', { x: currentX, y });
1363
- }
1364
- currentX += SPACING_X;
1365
- // Instance nodes in topological/declaration order
1366
- for (const instanceId of orderedIds) {
1367
- if (needsPosition(instanceId)) {
1368
- positions.set(instanceId, { x: currentX, y });
1369
- }
1370
- currentX += SPACING_X;
1371
- }
1372
- // Exit node
1373
- if (exitNeedsPosition) {
1374
- positions.set('Exit', { x: currentX, y });
1375
- }
1376
- return positions;
1377
- }
1378
- /**
1379
- * Compute topological order for workflow instances using connections.
1380
- * Falls back to declaration order when connections don't provide a clear ordering.
1381
- */
1382
- function computeTopologicalOrder(ast) {
1383
- const instanceIds = ast.instances.map((inst) => inst.id);
1384
- // If no connections, use declaration order
1385
- if (!ast.connections || ast.connections.length === 0) {
1386
- return instanceIds;
1387
- }
1388
- // Build adjacency list from execution flow connections only
1389
- // (control flow connections determine order, data connections don't)
1390
- const graph = new Map();
1391
- const inDegree = new Map();
1392
- for (const id of instanceIds) {
1393
- graph.set(id, new Set());
1394
- inDegree.set(id, 0);
1395
- }
1396
- for (const conn of ast.connections) {
1397
- const fromNode = conn.from.node;
1398
- const toNode = conn.to.node;
1399
- // Only consider connections between instances (skip Start/Exit)
1400
- if (!graph.has(fromNode) || !graph.has(toNode))
1401
- continue;
1402
- // Only use execution flow (onSuccess/onFailure -> execute) for ordering
1403
- const isExecutionFlow = (conn.from.port === 'onSuccess' || conn.from.port === 'onFailure') &&
1404
- conn.to.port === 'execute';
1405
- if (isExecutionFlow && !graph.get(fromNode).has(toNode)) {
1406
- graph.get(fromNode).add(toNode);
1407
- inDegree.set(toNode, (inDegree.get(toNode) || 0) + 1);
1408
- }
1409
- }
1410
- // Kahn's algorithm for topological sort
1411
- const queue = [];
1412
- for (const id of instanceIds) {
1413
- if ((inDegree.get(id) || 0) === 0) {
1414
- queue.push(id);
1415
- }
1416
- }
1417
- const sorted = [];
1418
- while (queue.length > 0) {
1419
- const node = queue.shift();
1420
- sorted.push(node);
1421
- for (const neighbor of graph.get(node) || []) {
1422
- const newDegree = (inDegree.get(neighbor) || 1) - 1;
1423
- inDegree.set(neighbor, newDegree);
1424
- if (newDegree === 0) {
1425
- queue.push(neighbor);
1426
- }
1427
- }
1428
- }
1429
- // If topological sort didn't include all nodes (cycles or disconnected),
1430
- // append remaining nodes in declaration order
1431
- if (sorted.length < instanceIds.length) {
1432
- const sortedSet = new Set(sorted);
1433
- for (const id of instanceIds) {
1434
- if (!sortedSet.has(id)) {
1435
- sorted.push(id);
1436
- }
1437
- }
1438
- }
1439
- return sorted;
1440
- }
1441
- /**
1442
- * Check if source code has in-place generation markers
1443
- */
1444
- export function hasInPlaceMarkers(source) {
1445
- return (source.includes(MARKERS.RUNTIME_START) &&
1446
- source.includes(MARKERS.RUNTIME_END) &&
1447
- source.includes(MARKERS.BODY_START) &&
1448
- source.includes(MARKERS.BODY_END));
1449
- }
1450
- /**
1451
- * Remove all generated sections from source code
1452
- */
1453
- export function stripGeneratedSections(source) {
1454
- let result = source;
1455
- // Remove runtime section
1456
- const runtimeStartIdx = result.indexOf(MARKERS.RUNTIME_START);
1457
- const runtimeEndIdx = result.indexOf(MARKERS.RUNTIME_END);
1458
- if (runtimeStartIdx !== -1 && runtimeEndIdx !== -1) {
1459
- const lineStart = result.lastIndexOf('\n', runtimeStartIdx);
1460
- const lineEnd = result.indexOf('\n', runtimeEndIdx + MARKERS.RUNTIME_END.length);
1461
- result =
1462
- result.slice(0, lineStart === -1 ? 0 : lineStart) +
1463
- result.slice(lineEnd === -1 ? result.length : lineEnd);
1464
- }
1465
- // Remove ALL body sections (multi-workflow files have multiple)
1466
- while (true) {
1467
- const bodyStartIdx = result.indexOf(MARKERS.BODY_START);
1468
- const bodyEndIdx = result.indexOf(MARKERS.BODY_END);
1469
- if (bodyStartIdx === -1 || bodyEndIdx === -1 || bodyEndIdx < bodyStartIdx)
1470
- break;
1471
- const before = result.slice(0, bodyStartIdx);
1472
- const after = result.slice(bodyEndIdx + MARKERS.BODY_END.length);
1473
- result = before + `throw new Error('Not implemented');` + after;
1474
- }
1475
- return result;
1476
- }
1477
- //# sourceMappingURL=generate-in-place.js.map