@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,1267 +0,0 @@
1
- import { isExecutePort, isSuccessPort, isFailurePort, SCOPED_PORT_NAMES, isScopedStartPort, isScopedSuccessPort, isScopedFailurePort } from '../constants.js';
2
- import { assignImplicitPortOrders } from '../utils/port-ordering.js';
3
- import { getPortColor, NODE_VARIANT_COLORS, NODE_DEFAULT_COLOR, TYPE_ABBREVIATIONS } from './theme.js';
4
- import { layoutWorkflow } from './layout.js';
5
- import { calculateOrthogonalPathSafe, TrackAllocator } from './orthogonal-router.js';
6
- // ---- Constants (matching React component-node) ----
7
- export const PORT_RADIUS = 7;
8
- export const PORT_SIZE = PORT_RADIUS * 2; // 14px — matches portRootStyle
9
- export const PORT_GAP = 8; // matches port column gap
10
- export const PORT_PADDING_Y = 18; // matches inputsStyle paddingTop/Bottom
11
- export const NODE_MIN_WIDTH = 90; // matches NODE_MIN_WIDTH in styles.ts
12
- export const NODE_MIN_HEIGHT = 90; // matches NODE_MIN_HEIGHT in styles.ts
13
- export const BORDER_RADIUS = 6; // matches wrapperStyle borderRadius
14
- export const LAYER_GAP_X = 300; // target center-to-center; actual gap adapts to port labels
15
- export const LABEL_CLEARANCE = 42; // breathing room between opposing port label badges
16
- export const MIN_EDGE_GAP = 112; // minimum edge-to-edge gap between node boxes
17
- export const NODE_GAP_Y = 60;
18
- export const LABEL_HEIGHT = 20; // 13px font + padding
19
- export const LABEL_GAP = 12; // matches labelRootStyle bottom: calc(100% + 12px)
20
- // Scope rendering constants
21
- export const SCOPE_PADDING_X = 140; // horizontal padding inside scope (between port columns and children)
22
- export const SCOPE_PADDING_Y = 40; // vertical padding inside scope (top/bottom)
23
- export const SCOPE_PORT_COLUMN = 50; // width for scoped port column on inner edges
24
- export const SCOPE_INNER_GAP_X = 240; // horizontal gap between children inside scope
25
- // Routing mode threshold — connections longer than this use orthogonal routing
26
- // (midpoint of original 250–350 hysteresis thresholds)
27
- export const ORTHOGONAL_DISTANCE_THRESHOLD = 300;
28
- // Connections beyond this x-distance show as stubs only (no full path).
29
- // Must be higher than ORTHOGONAL_DISTANCE_THRESHOLD so adjacent-layer connections
30
- // still render their full orthogonal path.
31
- export const STUB_DISTANCE_THRESHOLD = 500;
32
- // Stub length for long-distance connections (short segment from port center outward)
33
- export const STUB_LENGTH = 30;
34
- // ---- Font metrics (Montserrat 600-weight, 10px — measured via SVG getBBox) ----
35
- const CHAR_WIDTHS = {
36
- ' ': 2.78, '!': 3.34, '"': 4.74, '#': 5.56, '$': 5.56, '%': 8.9, '&': 7.23,
37
- "'": 2.38, '(': 3.34, ')': 3.34, '*': 3.9, '+': 5.84, ',': 2.78, '-': 3.34,
38
- '.': 2.78, '/': 3.95, '0': 5.56, '1': 5.56, '2': 5.56, '3': 5.56, '4': 5.56,
39
- '5': 5.56, '6': 5.56, '7': 5.56, '8': 5.56, '9': 5.56, ':': 3.34, ';': 3.34,
40
- '<': 5.86, '=': 5.84, '>': 5.86, '?': 6.11, '@': 9.76,
41
- A: 7.23, B: 7.23, C: 7.23, D: 7.23, E: 6.67, F: 6.11, G: 7.78, H: 7.23,
42
- I: 2.78, J: 5.56, K: 7.23, L: 6.11, M: 8.34, N: 7.23, O: 7.78, P: 6.67,
43
- Q: 7.78, R: 7.23, S: 6.67, T: 6.11, U: 7.23, V: 6.67, W: 9.45, X: 6.67,
44
- Y: 6.67, Z: 6.11, '[': 3.34, '\\': 3.95, ']': 3.34, '^': 5.84, '_': 5.56, '`': 3.58,
45
- a: 5.56, b: 6.11, c: 5.56, d: 6.11, e: 5.56, f: 3.34, g: 6.11, h: 6.11,
46
- i: 2.78, j: 2.78, k: 5.56, l: 2.78, m: 8.9, n: 6.11, o: 6.11, p: 6.11,
47
- q: 6.11, r: 3.9, s: 5.56, t: 3.34, u: 6.11, v: 5.56, w: 7.78, x: 5.56,
48
- y: 5.56, z: 5, '{': 3.9, '|': 2.8, '}': 3.9, '~': 5.96,
49
- };
50
- const DEFAULT_CHAR_WIDTH = 5.56;
51
- /** Measure text width using pre-computed Montserrat 600/10px SVG character widths */
52
- export function measureText(text) {
53
- let width = 0;
54
- for (let i = 0; i < text.length; i++) {
55
- width += CHAR_WIDTHS[text[i]] ?? DEFAULT_CHAR_WIDTH;
56
- }
57
- return width;
58
- }
59
- /** Compute the full badge width for a port label (matches renderer badge layout) */
60
- export function portBadgeWidth(port) {
61
- const abbrev = TYPE_ABBREVIATIONS[port.dataType] ?? port.dataType;
62
- const typeWidth = measureText(abbrev);
63
- const labelWidth = measureText(port.label);
64
- const pad = 7;
65
- const divGap = 4;
66
- return pad + typeWidth + divGap + 1 + divGap + labelWidth + pad;
67
- }
68
- /** Total extent of a port label from the port dot center outward (badge + gap + dot radius) */
69
- function portLabelExtent(port) {
70
- const badgeGap = 5;
71
- return PORT_RADIUS + badgeGap + portBadgeWidth(port);
72
- }
73
- // ---- Dimension computation ----
74
- export function computeNodeDimensions(node) {
75
- const maxPorts = Math.max(node.inputs.length, node.outputs.length);
76
- // React: paddingTop + n * (PORT_SIZE + PORT_GAP) - PORT_GAP + paddingBottom
77
- const portsHeight = maxPorts > 0
78
- ? PORT_PADDING_Y + maxPorts * PORT_SIZE + (maxPorts - 1) * PORT_GAP + PORT_PADDING_Y
79
- : 0;
80
- node.width = NODE_MIN_WIDTH;
81
- node.height = Math.max(NODE_MIN_HEIGHT, portsHeight);
82
- }
83
- // ---- Port positions ----
84
- export function computePortPositions(node) {
85
- positionPortList(node.inputs, node.x, node.y, node.height);
86
- positionPortList(node.outputs, node.x + node.width, node.y, node.height);
87
- }
88
- function positionPortList(ports, cx, nodeY, _nodeHeight) {
89
- if (ports.length === 0)
90
- return;
91
- // Matches React portPositionCalculator: y = nodeY + paddingTop + i * (size + gap) + size/2
92
- for (let i = 0; i < ports.length; i++) {
93
- ports[i].cx = cx;
94
- ports[i].cy = nodeY + PORT_PADDING_Y + i * (PORT_SIZE + PORT_GAP) + PORT_SIZE / 2;
95
- }
96
- }
97
- // ---- Connection path (ported from connectionCalculator.ts) ----
98
- /**
99
- * Compute a quad-curve connection from B towards D with consistent tangent.
100
- * U is a unit vector from B to C with the same slope as B→D.
101
- */
102
- function quadCurveControl(ax, ay, bx, by, ux, uy) {
103
- const dn = Math.abs(ay - by);
104
- const cx = bx + (ux * dn) / Math.abs(uy);
105
- const cy = ay;
106
- return [cx, cy];
107
- }
108
- export function computeConnectionPath(sx, sy, tx, ty) {
109
- const e = 0.0001; // insignificant shift to avoid degenerate tangents
110
- const ax = sx + e;
111
- const ay = sy + e;
112
- const hx = tx - e;
113
- const hy = ty - e;
114
- const ramp = Math.min(20, (hx - ax) / 10);
115
- const bx = ax + ramp;
116
- const by = ay + e;
117
- const gx = hx - ramp;
118
- const gy = hy - e;
119
- const curveSizeX = Math.min(60, Math.abs(ax - hx) / 4);
120
- const curveSizeY = Math.min(60, Math.abs(ay - hy) / 4);
121
- const curveMag = Math.sqrt(curveSizeX * curveSizeX + curveSizeY * curveSizeY);
122
- const bgX = gx - bx;
123
- const bgY = gy - by;
124
- const bgLen = Math.sqrt(bgX * bgX + bgY * bgY);
125
- const bgUx = bgX / bgLen;
126
- const bgUy = bgY / bgLen;
127
- const dx = bx + bgUx * curveMag;
128
- const dy = by + (bgUy * curveMag) / 2;
129
- const ex = gx - bgUx * curveMag;
130
- const ey = gy - (bgUy * curveMag) / 2;
131
- const deX = ex - dx;
132
- const deY = ey - dy;
133
- const deLen = Math.sqrt(deX * deX + deY * deY);
134
- const deUx = deX / deLen;
135
- const deUy = deY / deLen;
136
- const [cx, cy] = quadCurveControl(bx, by, dx, dy, -deUx, -deUy);
137
- const [fx, fy] = quadCurveControl(gx, gy, ex, ey, deUx, deUy);
138
- let path = `M ${cx},${cy} M ${ax},${ay}`;
139
- path += ` L ${bx},${by}`;
140
- path += ` Q ${cx},${cy} ${dx},${dy}`;
141
- path += ` L ${ex},${ey}`;
142
- path += ` Q ${fx},${fy} ${gx},${gy}`;
143
- path += ` L ${hx},${hy}`;
144
- return path;
145
- }
146
- // ---- Port ordering helpers ----
147
- /**
148
- * Get ordered ports from a port definition record using metadata.order.
149
- * Uses assignImplicitPortOrders to ensure all ports have proper ordering
150
- * (mandatory ports like execute/onSuccess/onFailure get precedence).
151
- */
152
- function orderedPorts(ports, direction) {
153
- // Clone port definitions so assignImplicitPortOrders can mutate safely
154
- const cloned = {};
155
- for (const [name, def] of Object.entries(ports)) {
156
- cloned[name] = { ...def, metadata: def.metadata ? { ...def.metadata } : undefined };
157
- }
158
- // Ensure all ports have order values (mandatory ports get precedence)
159
- assignImplicitPortOrders(cloned);
160
- return Object.entries(cloned)
161
- .sort(([, a], [, b]) => {
162
- const orderA = a.metadata?.order ?? Infinity;
163
- const orderB = b.metadata?.order ?? Infinity;
164
- return orderA - orderB;
165
- })
166
- .map(([name, def]) => ({
167
- name,
168
- label: def.label ?? name,
169
- dataType: def.dataType,
170
- direction,
171
- isControlFlow: def.dataType === 'STEP',
172
- isFailure: !!def.failure,
173
- cx: 0,
174
- cy: 0,
175
- }));
176
- }
177
- // ---- Instance node builder (shared by main graph and scope sub-graphs) ----
178
- function buildInstanceNode(instId, instNodeType, instConfig, nodeTypeMap, theme = 'dark') {
179
- const nt = nodeTypeMap.get(instNodeType);
180
- const allInputs = nt
181
- ? filterHiddenPorts(filterNonScopedPorts(nt.inputs))
182
- : {};
183
- const allOutputs = nt
184
- ? filterHiddenPorts(filterNonScopedPorts(nt.outputs))
185
- : {};
186
- if (nt && !nt.expression) {
187
- if (!allInputs.execute && !nt.inputs.execute?.hidden)
188
- allInputs.execute = { dataType: 'STEP' };
189
- }
190
- if (nt && nt.hasSuccessPort && !allOutputs.onSuccess && !nt.outputs.onSuccess?.hidden) {
191
- allOutputs.onSuccess = { dataType: 'STEP', isControlFlow: true };
192
- }
193
- if (nt && nt.hasFailurePort && !allOutputs.onFailure && !nt.outputs.onFailure?.hidden) {
194
- allOutputs.onFailure = { dataType: 'STEP', isControlFlow: true, failure: true };
195
- }
196
- // Resolve icon: instance config → node type visuals → auto-detection
197
- const resolvedIcon = instConfig?.icon
198
- ?? nt?.visuals?.icon
199
- ?? resolveDefaultIcon(nt);
200
- return {
201
- id: instId,
202
- label: instConfig?.label ?? nt?.label ?? instId,
203
- color: resolveNodeColor(instConfig?.color ?? nt?.visuals?.color, theme),
204
- icon: resolvedIcon,
205
- isVirtual: false,
206
- inputs: orderedPorts(allInputs, 'INPUT'),
207
- outputs: orderedPorts(allOutputs, 'OUTPUT'),
208
- x: 0, y: 0,
209
- width: NODE_MIN_WIDTH,
210
- height: NODE_MIN_HEIGHT,
211
- };
212
- }
213
- // ---- Scope sub-graph builder ----
214
- function buildScopeSubGraph(parentNode, parentNt, scopeName, childIds, ast, nodeTypeMap, theme = 'dark') {
215
- const childIdSet = new Set(childIds);
216
- // Extract scoped port definitions from parent's node type (ports with explicit scope marker)
217
- const scopedOutputDefs = {};
218
- const scopedInputDefs = {};
219
- for (const [name, def] of Object.entries(parentNt.outputs)) {
220
- if (def.scope === scopeName)
221
- scopedOutputDefs[name] = def;
222
- }
223
- for (const [name, def] of Object.entries(parentNt.inputs)) {
224
- if (def.scope === scopeName)
225
- scopedInputDefs[name] = def;
226
- }
227
- // Derive additional scope ports from connections involving scope children.
228
- // Parent→child connections need a scope OUTPUT port (left inner edge).
229
- // Child→parent connections need a scope INPUT port (right inner edge).
230
- for (const conn of ast.connections) {
231
- // Parent → child: parent's output becomes scope output
232
- if (conn.from.node === parentNode.id && childIdSet.has(conn.to.node)) {
233
- const portName = conn.from.port;
234
- if (!scopedOutputDefs[portName]) {
235
- const parentDef = parentNt.outputs[portName];
236
- if (parentDef) {
237
- // Move existing output from external to scoped
238
- scopedOutputDefs[portName] = { ...parentDef, scope: scopeName };
239
- }
240
- else {
241
- // Implicit scoped port (e.g. forEach.item:iteration) — infer type and label from child
242
- const childInst = ast.instances.find(i => i.id === conn.to.node);
243
- const childNt = childInst ? nodeTypeMap.get(childInst.nodeType) : undefined;
244
- const childInputDef = childNt?.inputs[conn.to.port];
245
- scopedOutputDefs[portName] = {
246
- dataType: childInputDef?.dataType ?? 'ANY',
247
- scope: scopeName,
248
- label: childInputDef?.label ?? portName,
249
- };
250
- }
251
- }
252
- }
253
- // Child → parent: parent's input becomes scope input
254
- if (conn.to.node === parentNode.id && childIdSet.has(conn.from.node)) {
255
- const portName = conn.to.port;
256
- if (!scopedInputDefs[portName]) {
257
- const parentDef = parentNt.inputs[portName];
258
- if (parentDef) {
259
- scopedInputDefs[portName] = { ...parentDef, scope: scopeName };
260
- }
261
- else {
262
- // Implicit scoped port — infer type and label from child
263
- const childInst = ast.instances.find(i => i.id === conn.from.node);
264
- const childNt = childInst ? nodeTypeMap.get(childInst.nodeType) : undefined;
265
- const childOutputDef = childNt?.outputs[conn.from.port];
266
- scopedInputDefs[portName] = {
267
- dataType: childOutputDef?.dataType ?? 'ANY',
268
- scope: scopeName,
269
- label: childOutputDef?.label ?? portName,
270
- };
271
- }
272
- }
273
- }
274
- }
275
- // Add mandatory STEP scope ports for non-expression scoped nodes.
276
- // Use scoped port names (start/success/failure) so assignImplicitPortOrders gives them priority.
277
- if (!parentNt.expression) {
278
- if (!scopedOutputDefs[SCOPED_PORT_NAMES.START]) {
279
- scopedOutputDefs[SCOPED_PORT_NAMES.START] = { dataType: 'STEP', scope: scopeName, label: 'Execute' };
280
- }
281
- if (!scopedInputDefs[SCOPED_PORT_NAMES.SUCCESS]) {
282
- scopedInputDefs[SCOPED_PORT_NAMES.SUCCESS] = { dataType: 'STEP', isControlFlow: true, scope: scopeName, label: 'On Success' };
283
- }
284
- if (!scopedInputDefs[SCOPED_PORT_NAMES.FAILURE]) {
285
- scopedInputDefs[SCOPED_PORT_NAMES.FAILURE] = { dataType: 'STEP', isControlFlow: true, scope: scopeName, failure: true, label: 'On Failure' };
286
- }
287
- }
288
- // Remove scope-derived ports from parent's external port lists
289
- // (they should only appear on inner edges, not outer edges)
290
- parentNode.outputs = parentNode.outputs.filter(p => !scopedOutputDefs[p.name]);
291
- parentNode.inputs = parentNode.inputs.filter(p => !scopedInputDefs[p.name]);
292
- const scopeOutputPorts = orderedPorts(scopedOutputDefs, 'OUTPUT');
293
- const scopeInputPorts = orderedPorts(scopedInputDefs, 'INPUT');
294
- // Build child nodes
295
- const children = [];
296
- const childNodeMap = new Map();
297
- for (const childId of childIds) {
298
- const childInst = ast.instances.find(i => i.id === childId);
299
- if (!childInst)
300
- continue;
301
- const childNode = buildInstanceNode(childId, childInst.nodeType, childInst.config, nodeTypeMap, theme);
302
- computeNodeDimensions(childNode);
303
- if (childInst.config?.width != null)
304
- childNode.width = childInst.config.width;
305
- if (childInst.config?.height != null)
306
- childNode.height = childInst.config.height;
307
- children.push(childNode);
308
- childNodeMap.set(childId, childNode);
309
- }
310
- if (children.length === 0)
311
- return;
312
- // Layout children left-to-right in local coordinates
313
- let childX = 0;
314
- const maxChildHeight = Math.max(...children.map(c => c.height + LABEL_HEIGHT + LABEL_GAP));
315
- for (const child of children) {
316
- child.x = childX;
317
- child.y = LABEL_HEIGHT + LABEL_GAP + (maxChildHeight - LABEL_HEIGHT - LABEL_GAP - child.height) / 2;
318
- childX += child.width + SCOPE_INNER_GAP_X;
319
- }
320
- const childrenWidth = childX > 0 ? childX - SCOPE_INNER_GAP_X : 0;
321
- const childrenHeight = maxChildHeight;
322
- // Compute scope port column heights
323
- const scopeOutPortsHeight = portsColumnHeight(scopeOutputPorts.length);
324
- const scopeInPortsHeight = portsColumnHeight(scopeInputPorts.length);
325
- // Use persisted UI dimensions if available, otherwise compute from children
326
- const parentUI = ast.ui?.instances?.find(u => u.name === parentNode.id);
327
- const uiWidth = parentUI?.expandedWidth ?? parentUI?.width;
328
- const uiHeight = parentUI?.expandedHeight ?? parentUI?.height;
329
- // Minimum inner width so opposing scope port labels don't collide
330
- const maxLeftLabelExtent = scopeOutputPorts.length > 0
331
- ? Math.max(...scopeOutputPorts.map(portLabelExtent))
332
- : 0;
333
- const maxRightLabelExtent = scopeInputPorts.length > 0
334
- ? Math.max(...scopeInputPorts.map(portLabelExtent))
335
- : 0;
336
- const minInnerWidth = maxLeftLabelExtent + LABEL_CLEARANCE + maxRightLabelExtent;
337
- const contentWidth = Math.max(childrenWidth, minInnerWidth);
338
- const computedWidth = SCOPE_PORT_COLUMN + SCOPE_PADDING_X + contentWidth + SCOPE_PADDING_X + SCOPE_PORT_COLUMN;
339
- const computedHeight = SCOPE_PADDING_Y * 2 + Math.max(childrenHeight, scopeOutPortsHeight, scopeInPortsHeight);
340
- parentNode.width = Math.max(parentNode.width, uiWidth ?? computedWidth);
341
- parentNode.height = Math.max(parentNode.height, uiHeight ?? computedHeight);
342
- // Store scope data (children positions are in local coordinates, will be offset later)
343
- parentNode.scopeChildren = children;
344
- parentNode.scopePorts = { inputs: scopeInputPorts, outputs: scopeOutputPorts };
345
- parentNode.scopeConnections = []; // populated after positioning
346
- }
347
- /** Position scope children and ports relative to the parent's final position */
348
- function finalizeScopePositions(parentNode, ast, theme = 'dark') {
349
- const children = parentNode.scopeChildren;
350
- const scopePorts = parentNode.scopePorts;
351
- if (!children || children.length === 0 || !scopePorts)
352
- return;
353
- // Scope inner area (between the two port columns)
354
- const innerLeft = parentNode.x + SCOPE_PORT_COLUMN + SCOPE_PADDING_X;
355
- const innerRight = parentNode.x + parentNode.width - SCOPE_PORT_COLUMN - SCOPE_PADDING_X;
356
- const innerWidth = innerRight - innerLeft;
357
- // Compute children block width from local coordinates
358
- const lastChild = children[children.length - 1];
359
- const childrenBlockWidth = lastChild.x + lastChild.width;
360
- // Center children horizontally within the inner area
361
- const centerOffsetX = innerLeft + (innerWidth - childrenBlockWidth) / 2;
362
- const scopeOriginY = parentNode.y + SCOPE_PADDING_Y;
363
- // Offset children to absolute positions
364
- for (const child of children) {
365
- child.x += centerOffsetX;
366
- child.y += scopeOriginY;
367
- computePortPositions(child);
368
- }
369
- // Position scoped output ports on left inner edge
370
- const leftEdgeX = parentNode.x + SCOPE_PORT_COLUMN;
371
- positionPortList(scopePorts.outputs, leftEdgeX, parentNode.y, parentNode.height);
372
- // Position scoped input ports on right inner edge
373
- const rightEdgeX = parentNode.x + parentNode.width - SCOPE_PORT_COLUMN;
374
- positionPortList(scopePorts.inputs, rightEdgeX, parentNode.y, parentNode.height);
375
- // Build scope connections — match by child membership, not scope qualifiers
376
- const childNodeMap = new Map();
377
- for (const child of children)
378
- childNodeMap.set(child.id, child);
379
- const childIdSet = new Set(children.map(c => c.id));
380
- parentNode.scopeConnections = [];
381
- for (const conn of ast.connections) {
382
- const fromIsChild = childIdSet.has(conn.from.node);
383
- const toIsChild = childIdSet.has(conn.to.node);
384
- const fromIsParent = conn.from.node === parentNode.id;
385
- const toIsParent = conn.to.node === parentNode.id;
386
- // Only process connections that involve at least one scope child
387
- if (!fromIsChild && !toIsChild)
388
- continue;
389
- // Parent port → child input (scope output feeds child)
390
- if (fromIsParent && toIsChild) {
391
- const sourcePort = scopePorts.outputs.find(p => p.name === conn.from.port);
392
- const targetChild = childNodeMap.get(conn.to.node);
393
- const targetPort = targetChild?.inputs.find(p => p.name === conn.to.port);
394
- if (sourcePort && targetPort) {
395
- parentNode.scopeConnections.push(buildConnection(parentNode.id, conn.from.port, conn.to.node, conn.to.port, sourcePort, targetPort, theme));
396
- }
397
- continue;
398
- }
399
- // Child output → parent port (child feeds scope input)
400
- if (fromIsChild && toIsParent) {
401
- const sourceChild = childNodeMap.get(conn.from.node);
402
- const sourcePort = sourceChild?.outputs.find(p => p.name === conn.from.port);
403
- const targetPort = scopePorts.inputs.find(p => p.name === conn.to.port);
404
- if (sourcePort && targetPort) {
405
- parentNode.scopeConnections.push(buildConnection(conn.from.node, conn.from.port, parentNode.id, conn.to.port, sourcePort, targetPort, theme));
406
- }
407
- continue;
408
- }
409
- // Child → child within scope
410
- if (fromIsChild && toIsChild) {
411
- const sourceChild = childNodeMap.get(conn.from.node);
412
- const targetChild = childNodeMap.get(conn.to.node);
413
- if (sourceChild && targetChild) {
414
- const sourcePort = sourceChild.outputs.find(p => p.name === conn.from.port);
415
- const targetPort = targetChild.inputs.find(p => p.name === conn.to.port);
416
- if (sourcePort && targetPort) {
417
- parentNode.scopeConnections.push(buildConnection(conn.from.node, conn.from.port, conn.to.node, conn.to.port, sourcePort, targetPort, theme));
418
- }
419
- }
420
- continue;
421
- }
422
- // Cross-scope: child → external or external → child
423
- // These are handled in the main connection loop (which looks up scope children)
424
- }
425
- // Auto-connect mandatory STEP scope ports that have no explicit connections.
426
- // scope.execute → first child's execute, last child's onSuccess/onFailure → scope inputs.
427
- if (children.length > 0) {
428
- const connectedScopePorts = new Set(parentNode.scopeConnections.map(c => c.fromNode === parentNode.id ? `out:${c.fromPort}` : `in:${c.toPort}`).filter(k => k.startsWith('out:') || k.startsWith('in:')));
429
- const firstChild = children[0];
430
- const lastChild = children[children.length - 1];
431
- // scope.start → first child.execute (scoped port uses "start", child uses "execute")
432
- const execScopePort = scopePorts.outputs.find(p => isScopedStartPort(p.name));
433
- const execChildPort = firstChild.inputs.find(p => isExecutePort(p.name));
434
- if (execScopePort && execChildPort && !connectedScopePorts.has(`out:${execScopePort.name}`)) {
435
- parentNode.scopeConnections.push(buildConnection(parentNode.id, execScopePort.name, firstChild.id, execChildPort.name, execScopePort, execChildPort, theme));
436
- }
437
- // last child.onSuccess → scope.success (child uses "onSuccess", scoped port uses "success")
438
- const successScopePort = scopePorts.inputs.find(p => isScopedSuccessPort(p.name));
439
- const successChildPort = lastChild.outputs.find(p => isSuccessPort(p.name));
440
- if (successScopePort && successChildPort && !connectedScopePorts.has(`in:${successScopePort.name}`)) {
441
- parentNode.scopeConnections.push(buildConnection(lastChild.id, successChildPort.name, parentNode.id, successScopePort.name, successChildPort, successScopePort, theme));
442
- }
443
- // last child.onFailure → scope.failure (child uses "onFailure", scoped port uses "failure")
444
- const failureScopePort = scopePorts.inputs.find(p => isScopedFailurePort(p.name));
445
- const failureChildPort = lastChild.outputs.find(p => isFailurePort(p.name));
446
- if (failureScopePort && failureChildPort && !connectedScopePorts.has(`in:${failureScopePort.name}`)) {
447
- parentNode.scopeConnections.push(buildConnection(lastChild.id, failureChildPort.name, parentNode.id, failureScopePort.name, failureChildPort, failureScopePort, theme));
448
- }
449
- }
450
- }
451
- function buildConnection(fromNode, fromPort, toNode, toPort, sourcePort, targetPort, theme = 'dark') {
452
- const sourceColor = getPortColor(sourcePort.dataType, sourcePort.isFailure, theme);
453
- const targetColor = getPortColor(targetPort.dataType, targetPort.isFailure, theme);
454
- const path = computeConnectionPath(sourcePort.cx, sourcePort.cy, targetPort.cx, targetPort.cy);
455
- return {
456
- fromNode, fromPort, toNode, toPort,
457
- sourceColor, targetColor,
458
- isStepConnection: sourcePort.dataType === 'STEP',
459
- path,
460
- };
461
- }
462
- function portsColumnHeight(count) {
463
- if (count === 0)
464
- return 0;
465
- return PORT_PADDING_Y + count * PORT_SIZE + (count - 1) * PORT_GAP + PORT_PADDING_Y;
466
- }
467
- // ---- Position extraction ----
468
- /**
469
- * Extract explicit positions from AST metadata.
470
- * Returns a map of node ID → {x, y} for nodes that have both x and y defined.
471
- * Sources: ast.ui.startNode, ast.ui.exitNode, instance.config.x/y
472
- */
473
- function extractExplicitPositions(ast) {
474
- const positions = new Map();
475
- if (ast.ui?.startNode?.x != null && ast.ui.startNode.y != null) {
476
- positions.set('Start', { x: ast.ui.startNode.x, y: ast.ui.startNode.y });
477
- }
478
- if (ast.ui?.exitNode?.x != null && ast.ui.exitNode.y != null) {
479
- positions.set('Exit', { x: ast.ui.exitNode.x, y: ast.ui.exitNode.y });
480
- }
481
- for (const inst of ast.instances) {
482
- if (inst.config?.x != null && inst.config.y != null) {
483
- positions.set(inst.id, { x: inst.config.x, y: inst.config.y });
484
- }
485
- }
486
- return positions;
487
- }
488
- /**
489
- * Compute the maximum right-side overhang for a layer (external output port labels only).
490
- * Scope inner-edge port labels face inward and don't extend past the node boundary.
491
- */
492
- function layerOutputExtent(layerNodes, diagramNodes) {
493
- let max = 0;
494
- for (const id of layerNodes) {
495
- const node = diagramNodes.get(id);
496
- max = Math.max(max, maxPortLabelExtent(node.outputs));
497
- }
498
- return max;
499
- }
500
- /**
501
- * Compute the maximum left-side overhang for a layer (external input port labels only).
502
- * Scope inner-edge port labels face inward and don't extend past the node boundary.
503
- */
504
- function layerInputExtent(layerNodes, diagramNodes) {
505
- let max = 0;
506
- for (const id of layerNodes) {
507
- const node = diagramNodes.get(id);
508
- max = Math.max(max, maxPortLabelExtent(node.inputs));
509
- }
510
- return max;
511
- }
512
- /**
513
- * Assign coordinates to nodes using auto-layout layer assignments.
514
- * Gap between layers adapts to port label extents so labels never overlap,
515
- * while using LAYER_GAP_X as the target center-to-center distance.
516
- */
517
- function adaptiveGapY(layerSize) {
518
- if (layerSize <= 2)
519
- return NODE_GAP_Y;
520
- return Math.max(24, Math.round(NODE_GAP_Y * 2 / layerSize));
521
- }
522
- function assignLayerCoordinates(layers, diagramNodes) {
523
- // Pre-compute filtered layers
524
- const filtered = layers.map(l => l.filter(id => diagramNodes.has(id)));
525
- let currentX = 0;
526
- for (let i = 0; i < filtered.length; i++) {
527
- const layerNodes = filtered[i];
528
- if (layerNodes.length === 0) {
529
- currentX += LAYER_GAP_X;
530
- continue;
531
- }
532
- const maxWidth = Math.max(...layerNodes.map(id => diagramNodes.get(id).width));
533
- const gapY = adaptiveGapY(layerNodes.length);
534
- const totalHeight = layerNodes.reduce((sum, id) => {
535
- const n = diagramNodes.get(id);
536
- return sum + n.height + LABEL_HEIGHT + LABEL_GAP;
537
- }, 0) + (layerNodes.length - 1) * gapY;
538
- let currentY = -totalHeight / 2;
539
- for (const id of layerNodes) {
540
- const node = diagramNodes.get(id);
541
- currentY += LABEL_HEIGHT + LABEL_GAP;
542
- node.x = currentX + (maxWidth - node.width) / 2;
543
- node.y = currentY;
544
- currentY += node.height + gapY;
545
- }
546
- // Compute label-aware edge gap to the next layer
547
- const nextLayerNodes = filtered[i + 1];
548
- if (nextLayerNodes && nextLayerNodes.length > 0) {
549
- const outputOverhang = layerOutputExtent(layerNodes, diagramNodes);
550
- const inputOverhang = layerInputExtent(nextLayerNodes, diagramNodes);
551
- const labelMinGap = outputOverhang + LABEL_CLEARANCE + inputOverhang;
552
- const edgeGap = Math.max(labelMinGap, LAYER_GAP_X - maxWidth, MIN_EDGE_GAP);
553
- currentX += maxWidth + edgeGap;
554
- }
555
- else {
556
- currentX += maxWidth + LAYER_GAP_X;
557
- }
558
- }
559
- }
560
- /**
561
- * Hybrid positioning: apply explicit positions to positioned nodes,
562
- * then auto-layout only the remaining unpositioned nodes.
563
- */
564
- function assignUnpositionedNodes(layers, diagramNodes, explicitPositions) {
565
- // Apply explicit positions first
566
- for (const [id, pos] of explicitPositions) {
567
- const node = diagramNodes.get(id);
568
- if (node) {
569
- node.x = pos.x;
570
- node.y = pos.y;
571
- }
572
- }
573
- // Auto-layout only unpositioned nodes using the same layer-based algorithm
574
- const filtered = layers.map(l => l.filter(id => diagramNodes.has(id)));
575
- let currentX = 0;
576
- for (let i = 0; i < filtered.length; i++) {
577
- const layerNodes = filtered[i];
578
- if (layerNodes.length === 0) {
579
- currentX += LAYER_GAP_X;
580
- continue;
581
- }
582
- const unpositioned = layerNodes.filter(id => !explicitPositions.has(id));
583
- const maxWidth = Math.max(...layerNodes.map(id => diagramNodes.get(id).width));
584
- if (unpositioned.length > 0) {
585
- const gapY = adaptiveGapY(unpositioned.length);
586
- const totalHeight = unpositioned.reduce((sum, id) => {
587
- const n = diagramNodes.get(id);
588
- return sum + n.height + LABEL_HEIGHT + LABEL_GAP;
589
- }, 0) + (unpositioned.length - 1) * gapY;
590
- let currentY = -totalHeight / 2;
591
- for (const id of unpositioned) {
592
- const node = diagramNodes.get(id);
593
- currentY += LABEL_HEIGHT + LABEL_GAP;
594
- node.x = currentX + (maxWidth - node.width) / 2;
595
- node.y = currentY;
596
- currentY += node.height + gapY;
597
- }
598
- }
599
- // Label-aware edge gap
600
- const nextLayerNodes = filtered[i + 1];
601
- if (nextLayerNodes && nextLayerNodes.length > 0) {
602
- const outputOverhang = layerOutputExtent(layerNodes, diagramNodes);
603
- const inputOverhang = layerInputExtent(nextLayerNodes, diagramNodes);
604
- const labelMinGap = outputOverhang + LABEL_CLEARANCE + inputOverhang;
605
- const edgeGap = Math.max(labelMinGap, LAYER_GAP_X - maxWidth, MIN_EDGE_GAP);
606
- currentX += maxWidth + edgeGap;
607
- }
608
- else {
609
- currentX += maxWidth + LAYER_GAP_X;
610
- }
611
- }
612
- }
613
- /**
614
- * After applying explicit positions, ensure no nodes overlap horizontally.
615
- * Sorts nodes by x, then pushes any node whose left edge (minus its input
616
- * label extent) intrudes into the previous node's right edge (plus its
617
- * output label extent and clearance).
618
- */
619
- function resolveHorizontalOverlaps(diagramNodes, explicitPositions) {
620
- const nodes = [...diagramNodes.values()].sort((a, b) => a.x - b.x);
621
- for (let i = 1; i < nodes.length; i++) {
622
- const prev = nodes[i - 1];
623
- const curr = nodes[i];
624
- if (explicitPositions.has(curr.id))
625
- continue; // respect author-set positions
626
- // Only external port labels overhang the node boundary.
627
- // Scope inner-edge port labels face inward and don't extend past the node box.
628
- const prevRightExtent = maxPortLabelExtent(prev.outputs);
629
- const currLeftExtent = maxPortLabelExtent(curr.inputs);
630
- const minGap = Math.max(prevRightExtent + LABEL_CLEARANCE + currLeftExtent, MIN_EDGE_GAP);
631
- const actualGap = curr.x - (prev.x + prev.width);
632
- if (actualGap < minGap) {
633
- curr.x = prev.x + prev.width + minGap;
634
- }
635
- }
636
- }
637
- /**
638
- * After all positioning, resolve overlaps caused by expanded scope boxes.
639
- * Only checks nodes immediately after a scope parent — regular node spacing
640
- * is left to the user's explicit positions. When a node falls inside the
641
- * expanded scope box, shift it and all further-right nodes to clear.
642
- */
643
- function resolvePostLayoutOverlaps(diagramNodes) {
644
- const hasScopeParent = [...diagramNodes.values()].some(n => n.scopeChildren && n.scopeChildren.length > 0);
645
- if (!hasScopeParent)
646
- return;
647
- const nodes = [...diagramNodes.values()].sort((a, b) => a.x - b.x);
648
- for (let i = 1; i < nodes.length; i++) {
649
- const prev = nodes[i - 1];
650
- const curr = nodes[i];
651
- // Only resolve overlaps caused by scope parent expansion
652
- if (!prev.scopeChildren || prev.scopeChildren.length === 0)
653
- continue;
654
- const actualGap = curr.x - (prev.x + prev.width);
655
- if (actualGap < MIN_EDGE_GAP) {
656
- const shift = MIN_EDGE_GAP - actualGap;
657
- for (let j = i; j < nodes.length; j++) {
658
- nodes[j].x += shift;
659
- }
660
- }
661
- }
662
- }
663
- // ---- Main orchestrator ----
664
- export function buildDiagramGraph(ast, options = {}) {
665
- const themeName = options.theme ?? 'dark';
666
- const nodeTypeMap = new Map();
667
- for (const nt of ast.nodeTypes) {
668
- nodeTypeMap.set(nt.name, nt);
669
- if (nt.functionName && nt.functionName !== nt.name) {
670
- nodeTypeMap.set(nt.functionName, nt);
671
- }
672
- }
673
- // Track scoped children — from explicit ast.scopes and from scope-qualified connections
674
- const scopedChildren = new Set();
675
- const allScopes = { ...(ast.scopes ?? {}) };
676
- if (ast.scopes) {
677
- for (const children of Object.values(ast.scopes)) {
678
- for (const child of children)
679
- scopedChildren.add(child);
680
- }
681
- }
682
- // Infer scopes from per-port scope annotations (connections with :scopeName qualifiers)
683
- const inferredScopes = new Map();
684
- for (const conn of ast.connections) {
685
- if (conn.from.scope) {
686
- const key = `${conn.from.node}.${conn.from.scope}`;
687
- if (!inferredScopes.has(key))
688
- inferredScopes.set(key, new Set());
689
- inferredScopes.get(key).add(conn.to.node);
690
- }
691
- if (conn.to.scope) {
692
- const key = `${conn.to.node}.${conn.to.scope}`;
693
- if (!inferredScopes.has(key))
694
- inferredScopes.set(key, new Set());
695
- inferredScopes.get(key).add(conn.from.node);
696
- }
697
- }
698
- for (const [key, childSet] of inferredScopes) {
699
- if (!allScopes[key]) {
700
- allScopes[key] = [...childSet];
701
- for (const child of childSet)
702
- scopedChildren.add(child);
703
- }
704
- }
705
- // Build diagram nodes
706
- const diagramNodes = new Map();
707
- // Start node — ensure mandatory execute STEP port exists
708
- const allStartPorts = filterHiddenPorts({ ...ast.startPorts });
709
- if (!allStartPorts.execute && !ast.startPorts.execute?.hidden) {
710
- allStartPorts.execute = { dataType: 'STEP' };
711
- }
712
- const startOutputs = orderedPorts(allStartPorts, 'OUTPUT');
713
- diagramNodes.set('Start', {
714
- id: 'Start',
715
- label: 'Start',
716
- color: NODE_DEFAULT_COLOR,
717
- icon: 'startNode',
718
- isVirtual: true,
719
- inputs: [],
720
- outputs: startOutputs,
721
- x: 0, y: 0,
722
- width: NODE_MIN_WIDTH,
723
- height: NODE_MIN_HEIGHT,
724
- });
725
- // Exit node — ensure mandatory onSuccess/onFailure STEP ports exist
726
- const allExitPorts = filterHiddenPorts({ ...ast.exitPorts });
727
- if (!allExitPorts.onSuccess && !ast.exitPorts.onSuccess?.hidden) {
728
- allExitPorts.onSuccess = { dataType: 'STEP', isControlFlow: true };
729
- }
730
- if (!allExitPorts.onFailure && !ast.exitPorts.onFailure?.hidden) {
731
- allExitPorts.onFailure = { dataType: 'STEP', isControlFlow: true, failure: true };
732
- }
733
- else if (allExitPorts.onFailure) {
734
- allExitPorts.onFailure = { ...allExitPorts.onFailure, failure: true };
735
- }
736
- const exitInputs = orderedPorts(allExitPorts, 'INPUT');
737
- diagramNodes.set('Exit', {
738
- id: 'Exit',
739
- label: 'Exit',
740
- color: NODE_DEFAULT_COLOR,
741
- icon: 'exitNode',
742
- isVirtual: true,
743
- inputs: exitInputs,
744
- outputs: [],
745
- x: 0, y: 0,
746
- width: NODE_MIN_WIDTH,
747
- height: NODE_MIN_HEIGHT,
748
- });
749
- // Instance nodes (skip scoped children — they are built inside their parent)
750
- for (const inst of ast.instances) {
751
- if (scopedChildren.has(inst.id))
752
- continue;
753
- const node = buildInstanceNode(inst.id, inst.nodeType, inst.config, nodeTypeMap, themeName);
754
- diagramNodes.set(inst.id, node);
755
- }
756
- // Compute base dimensions
757
- for (const node of diagramNodes.values()) {
758
- computeNodeDimensions(node);
759
- }
760
- // Build scope sub-graphs (expands parent dimensions)
761
- for (const [scopeKey, childIds] of Object.entries(allScopes)) {
762
- const dotIndex = scopeKey.indexOf('.');
763
- const parentId = scopeKey.substring(0, dotIndex);
764
- const scopeName = scopeKey.substring(dotIndex + 1);
765
- const parentNode = diagramNodes.get(parentId);
766
- if (!parentNode)
767
- continue;
768
- const parentInst = ast.instances.find(i => i.id === parentId);
769
- if (!parentInst)
770
- continue;
771
- const parentNt = nodeTypeMap.get(parentInst.nodeType);
772
- if (!parentNt)
773
- continue;
774
- buildScopeSubGraph(parentNode, parentNt, scopeName, childIds, ast, nodeTypeMap, themeName);
775
- }
776
- // Apply explicit [size: W H] annotation — hard override (not a floor)
777
- for (const inst of ast.instances) {
778
- if (scopedChildren.has(inst.id))
779
- continue;
780
- const node = diagramNodes.get(inst.id);
781
- if (!node)
782
- continue;
783
- if (inst.config?.width != null)
784
- node.width = inst.config.width;
785
- if (inst.config?.height != null)
786
- node.height = inst.config.height;
787
- }
788
- // Layout — use explicit positions when available, auto-layout otherwise
789
- const explicitPositions = extractExplicitPositions(ast);
790
- const allPositioned = [...diagramNodes.keys()].every(id => explicitPositions.has(id));
791
- const nonePositioned = ![...diagramNodes.keys()].some(id => explicitPositions.has(id));
792
- if (allPositioned) {
793
- // All nodes have explicit positions — apply them as-is
794
- for (const [id, pos] of explicitPositions) {
795
- const node = diagramNodes.get(id);
796
- if (node) {
797
- node.x = pos.x;
798
- node.y = pos.y;
799
- }
800
- }
801
- }
802
- else if (nonePositioned) {
803
- // No positions — full auto-layout (original behavior)
804
- const { layers } = layoutWorkflow(ast);
805
- assignLayerCoordinates(layers, diagramNodes);
806
- }
807
- else {
808
- // Mixed — explicit positions + auto-layout for remaining nodes
809
- const { layers } = layoutWorkflow(ast);
810
- assignUnpositionedNodes(layers, diagramNodes, explicitPositions);
811
- resolveHorizontalOverlaps(diagramNodes, explicitPositions);
812
- }
813
- // Resolve overlaps caused by expanded scope boxes. When all positions are
814
- // explicit, resolveHorizontalOverlaps is never called (or skips all nodes).
815
- // Scope parents can be far wider than the user anticipates, so we cascade
816
- // a rightward shift to all downstream nodes that fall inside the expanded box.
817
- resolvePostLayoutOverlaps(diagramNodes);
818
- // Compute external port positions
819
- for (const node of diagramNodes.values()) {
820
- computePortPositions(node);
821
- }
822
- // Finalize scope sub-graph positions (offset children + build scope connections)
823
- for (const node of diagramNodes.values()) {
824
- if (node.scopeChildren) {
825
- finalizeScopePositions(node, ast, themeName);
826
- }
827
- }
828
- const pendingConnections = [];
829
- for (const conn of ast.connections) {
830
- // Skip scope-qualified connections (handled by scope logic)
831
- if (conn.from.scope || conn.to.scope)
832
- continue;
833
- // Look up nodes — check main diagram nodes first, then scope children
834
- let fromNode = diagramNodes.get(conn.from.node);
835
- let toNode = diagramNodes.get(conn.to.node);
836
- // Cross-scope: look up scope children for nodes not in main diagram
837
- if (!fromNode) {
838
- for (const node of diagramNodes.values()) {
839
- const child = node.scopeChildren?.find(c => c.id === conn.from.node);
840
- if (child) {
841
- fromNode = child;
842
- break;
843
- }
844
- }
845
- }
846
- if (!toNode) {
847
- for (const node of diagramNodes.values()) {
848
- const child = node.scopeChildren?.find(c => c.id === conn.to.node);
849
- if (child) {
850
- toNode = child;
851
- break;
852
- }
853
- }
854
- }
855
- if (!fromNode || !toNode)
856
- continue;
857
- // Skip connections where both endpoints are scope children or parent↔child
858
- // (these are handled as scope connections in finalizeScopePositions)
859
- const fromIsScoped = scopedChildren.has(conn.from.node);
860
- const toIsScoped = scopedChildren.has(conn.to.node);
861
- if (fromIsScoped && toIsScoped)
862
- continue; // child→child
863
- if (fromIsScoped && diagramNodes.has(conn.to.node) && findScopeParent(conn.from.node, diagramNodes) === conn.to.node)
864
- continue; // child→parent
865
- if (toIsScoped && diagramNodes.has(conn.from.node) && findScopeParent(conn.to.node, diagramNodes) === conn.from.node)
866
- continue; // parent→child
867
- const sourcePort = fromNode.outputs.find(p => p.name === conn.from.port);
868
- const targetPort = toNode.inputs.find(p => p.name === conn.to.port);
869
- if (!sourcePort || !targetPort)
870
- continue;
871
- const fromPortIndex = fromNode.outputs.indexOf(sourcePort);
872
- const toPortIndex = toNode.inputs.indexOf(targetPort);
873
- pendingConnections.push({
874
- fromNodeId: conn.from.node, fromPortName: conn.from.port,
875
- toNodeId: conn.to.node, toPortName: conn.to.port,
876
- sourcePort, targetPort,
877
- fromPortIndex, toPortIndex,
878
- });
879
- }
880
- // Compute bounds (include scope children and port labels in calculation)
881
- const nodes = Array.from(diagramNodes.values());
882
- let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
883
- for (const node of nodes) {
884
- const labelTop = node.y - LABEL_HEIGHT - LABEL_GAP;
885
- // Port label badges extend beyond node boundaries
886
- const inputLabelExtent = maxPortLabelExtent(node.inputs);
887
- const outputLabelExtent = maxPortLabelExtent(node.outputs);
888
- minX = Math.min(minX, node.x - inputLabelExtent);
889
- minY = Math.min(minY, labelTop);
890
- maxX = Math.max(maxX, node.x + node.width + outputLabelExtent);
891
- maxY = Math.max(maxY, node.y + node.height);
892
- }
893
- const padding = options.padding ?? 40;
894
- const offsetX = -minX + padding;
895
- const offsetY = -minY + padding;
896
- // Normalize all coordinates
897
- for (const node of nodes) {
898
- node.x += offsetX;
899
- node.y += offsetY;
900
- for (const p of node.inputs) {
901
- p.cx += offsetX;
902
- p.cy += offsetY;
903
- }
904
- for (const p of node.outputs) {
905
- p.cx += offsetX;
906
- p.cy += offsetY;
907
- }
908
- // Offset scope children and scope ports
909
- if (node.scopeChildren) {
910
- for (const child of node.scopeChildren) {
911
- child.x += offsetX;
912
- child.y += offsetY;
913
- for (const p of child.inputs) {
914
- p.cx += offsetX;
915
- p.cy += offsetY;
916
- }
917
- for (const p of child.outputs) {
918
- p.cx += offsetX;
919
- p.cy += offsetY;
920
- }
921
- }
922
- }
923
- if (node.scopePorts) {
924
- for (const p of node.scopePorts.inputs) {
925
- p.cx += offsetX;
926
- p.cy += offsetY;
927
- }
928
- for (const p of node.scopePorts.outputs) {
929
- p.cx += offsetX;
930
- p.cy += offsetY;
931
- }
932
- }
933
- }
934
- // Build NodeBox array for orthogonal routing (after coordinate normalization)
935
- // Include scope children so the router can route around them
936
- const nodeBoxes = nodes.map(node => ({
937
- id: node.id,
938
- x: node.x,
939
- y: node.y,
940
- width: node.width,
941
- height: node.height,
942
- }));
943
- for (const node of nodes) {
944
- if (node.scopeChildren) {
945
- for (const child of node.scopeChildren) {
946
- nodeBoxes.push({ id: child.id, x: child.x, y: child.y, width: child.width, height: child.height });
947
- }
948
- }
949
- }
950
- // Sort connections: short spans first, then by source X, then by source Y
951
- // (matching original editor for deterministic track allocation)
952
- pendingConnections.sort((a, b) => {
953
- const aSpan = Math.abs(a.targetPort.cx - a.sourcePort.cx);
954
- const bSpan = Math.abs(b.targetPort.cx - b.sourcePort.cx);
955
- if (Math.abs(aSpan - bSpan) > 1)
956
- return aSpan - bSpan;
957
- if (Math.abs(a.sourcePort.cx - b.sourcePort.cx) > 1)
958
- return a.sourcePort.cx - b.sourcePort.cx;
959
- return a.sourcePort.cy - b.sourcePort.cy;
960
- });
961
- // Create a single TrackAllocator for deterministic batch routing
962
- const allocator = new TrackAllocator();
963
- // Pre-compute routing mode consistency for fan-out and fan-in:
964
- // When multiple connections share the same source port (fan-out), target
965
- // port (fan-in), or target node (multi-port fan-in), use the same routing
966
- // mode for visual consistency. If ANY connection in the group would use
967
- // curves, force ALL connections in the group to curves.
968
- const srcPortKey = (pc) => `srcPort:${pc.fromNodeId}.${pc.fromPortName}`;
969
- const tgtPortKey = (pc) => `tgtPort:${pc.toNodeId}.${pc.toPortName}`;
970
- const tgtNodeKey = (pc) => `tgtNode:${pc.toNodeId}`;
971
- const routingGroups = new Map();
972
- for (const pc of pendingConnections) {
973
- for (const key of [srcPortKey(pc), tgtPortKey(pc), tgtNodeKey(pc)]) {
974
- if (!routingGroups.has(key))
975
- routingGroups.set(key, []);
976
- routingGroups.get(key).push(pc);
977
- }
978
- }
979
- const forceCurveKeys = new Set();
980
- for (const [key, group] of routingGroups) {
981
- if (group.length < 2)
982
- continue;
983
- const anyShort = group.some(pc => {
984
- const dx = pc.targetPort.cx - pc.sourcePort.cx;
985
- const dy = pc.targetPort.cy - pc.sourcePort.cy;
986
- return Math.sqrt(dx * dx + dy * dy) <= ORTHOGONAL_DISTANCE_THRESHOLD;
987
- });
988
- if (anyShort)
989
- forceCurveKeys.add(key);
990
- }
991
- const forceCurveSet = new Set();
992
- for (const pc of pendingConnections) {
993
- if (forceCurveKeys.has(srcPortKey(pc)) || forceCurveKeys.has(tgtPortKey(pc)) || forceCurveKeys.has(tgtNodeKey(pc))) {
994
- forceCurveSet.add(pc);
995
- }
996
- }
997
- // Compute all connection paths with routing mode selection
998
- const connections = [];
999
- for (const pc of pendingConnections) {
1000
- const sx = pc.sourcePort.cx;
1001
- const sy = pc.sourcePort.cy;
1002
- const tx = pc.targetPort.cx;
1003
- const ty = pc.targetPort.cy;
1004
- const dx = tx - sx;
1005
- const dy = ty - sy;
1006
- const distance = Math.sqrt(dx * dx + dy * dy);
1007
- const useCurve = forceCurveSet.has(pc);
1008
- const sourceColor = getPortColor(pc.sourcePort.dataType, pc.sourcePort.isFailure, themeName);
1009
- const targetColor = getPortColor(pc.targetPort.dataType, pc.targetPort.isFailure, themeName);
1010
- const xDistance = Math.abs(tx - sx);
1011
- // Always compute stubs so the HTML viewer can toggle between path/stubs on drag.
1012
- // In static SVG (labels always visible), stubs start after the port label badge.
1013
- // In HTML, stubs start from port center by default and push out when labels appear.
1014
- const dashed = pc.sourcePort.dataType !== 'STEP';
1015
- const srcLabelEnd = portLabelExtent(pc.sourcePort);
1016
- const tgtLabelEnd = portLabelExtent(pc.targetPort);
1017
- const sourceStub = {
1018
- x: sx + srcLabelEnd, y: sy,
1019
- endX: sx + srcLabelEnd + STUB_LENGTH,
1020
- labelOffset: srcLabelEnd,
1021
- color: sourceColor,
1022
- dashed,
1023
- };
1024
- const targetStub = {
1025
- x: tx - tgtLabelEnd, y: ty,
1026
- endX: tx - tgtLabelEnd - STUB_LENGTH,
1027
- labelOffset: tgtLabelEnd,
1028
- color: targetColor,
1029
- dashed,
1030
- };
1031
- let path;
1032
- if (xDistance > STUB_DISTANCE_THRESHOLD) {
1033
- // Long-distance: static SVG hides the full path, only shows stubs
1034
- path = '';
1035
- }
1036
- else if (!useCurve && distance > ORTHOGONAL_DISTANCE_THRESHOLD) {
1037
- const orthoPath = calculateOrthogonalPathSafe([sx, sy], [tx, ty], nodeBoxes, pc.fromNodeId, pc.toNodeId, { fromPortIndex: pc.fromPortIndex, toPortIndex: pc.toPortIndex }, allocator);
1038
- path = orthoPath ?? computeConnectionPath(sx, sy, tx, ty);
1039
- }
1040
- else {
1041
- path = computeConnectionPath(sx, sy, tx, ty);
1042
- }
1043
- connections.push({
1044
- fromNode: pc.fromNodeId, fromPort: pc.fromPortName,
1045
- toNode: pc.toNodeId, toPort: pc.toPortName,
1046
- sourceColor, targetColor,
1047
- isStepConnection: pc.sourcePort.dataType === 'STEP',
1048
- path,
1049
- sourceStub,
1050
- targetStub,
1051
- });
1052
- }
1053
- // Recompute scope connection paths with the same routing logic as external connections
1054
- for (const node of nodes) {
1055
- if (!node.scopeConnections || !node.scopePorts || !node.scopeChildren)
1056
- continue;
1057
- const childMap = new Map();
1058
- for (const c of node.scopeChildren)
1059
- childMap.set(c.id, c);
1060
- const scopePending = [];
1061
- for (const conn of node.scopeConnections) {
1062
- const sPort = findScopePort(conn.fromNode, conn.fromPort, node, childMap, 'output');
1063
- const tPort = findScopePort(conn.toNode, conn.toPort, node, childMap, 'input');
1064
- if (!sPort || !tPort)
1065
- continue;
1066
- let fromPortIndex = 0;
1067
- let toPortIndex = 0;
1068
- if (conn.fromNode === node.id) {
1069
- fromPortIndex = node.scopePorts.outputs.indexOf(sPort);
1070
- }
1071
- else {
1072
- const fromChild = childMap.get(conn.fromNode);
1073
- if (fromChild)
1074
- fromPortIndex = fromChild.outputs.indexOf(sPort);
1075
- }
1076
- if (conn.toNode === node.id) {
1077
- toPortIndex = node.scopePorts.inputs.indexOf(tPort);
1078
- }
1079
- else {
1080
- const toChild = childMap.get(conn.toNode);
1081
- if (toChild)
1082
- toPortIndex = toChild.inputs.indexOf(tPort);
1083
- }
1084
- scopePending.push({
1085
- conn, sourcePort: sPort, targetPort: tPort,
1086
- fromNodeId: conn.fromNode, toNodeId: conn.toNode,
1087
- fromPortIndex: Math.max(0, fromPortIndex),
1088
- toPortIndex: Math.max(0, toPortIndex),
1089
- });
1090
- }
1091
- // Sort: short spans first, then by source X, then source Y
1092
- scopePending.sort((a, b) => {
1093
- const aSpan = Math.abs(a.targetPort.cx - a.sourcePort.cx);
1094
- const bSpan = Math.abs(b.targetPort.cx - b.sourcePort.cx);
1095
- if (Math.abs(aSpan - bSpan) > 1)
1096
- return aSpan - bSpan;
1097
- if (Math.abs(a.sourcePort.cx - b.sourcePort.cx) > 1)
1098
- return a.sourcePort.cx - b.sourcePort.cx;
1099
- return a.sourcePort.cy - b.sourcePort.cy;
1100
- });
1101
- // Fan-out/fan-in consistency: force all to curves if any in the group is short
1102
- const spSrcKey = (sp) => `s:${sp.fromNodeId}.${sp.conn.fromPort}`;
1103
- const spTgtKey = (sp) => `t:${sp.toNodeId}.${sp.conn.toPort}`;
1104
- const spTgtNodeKey = (sp) => `n:${sp.toNodeId}`;
1105
- const spGroups = new Map();
1106
- for (const sp of scopePending) {
1107
- for (const key of [spSrcKey(sp), spTgtKey(sp), spTgtNodeKey(sp)]) {
1108
- if (!spGroups.has(key))
1109
- spGroups.set(key, []);
1110
- spGroups.get(key).push(sp);
1111
- }
1112
- }
1113
- const spForceCurveKeys = new Set();
1114
- for (const [key, group] of spGroups) {
1115
- if (group.length < 2)
1116
- continue;
1117
- const anyShort = group.some(sp => {
1118
- const ddx = sp.targetPort.cx - sp.sourcePort.cx;
1119
- const ddy = sp.targetPort.cy - sp.sourcePort.cy;
1120
- return Math.sqrt(ddx * ddx + ddy * ddy) <= ORTHOGONAL_DISTANCE_THRESHOLD;
1121
- });
1122
- if (anyShort)
1123
- spForceCurveKeys.add(key);
1124
- }
1125
- const spForceCurveSet = new Set();
1126
- for (const sp of scopePending) {
1127
- if (spForceCurveKeys.has(spSrcKey(sp)) || spForceCurveKeys.has(spTgtKey(sp)) || spForceCurveKeys.has(spTgtNodeKey(sp))) {
1128
- spForceCurveSet.add(sp);
1129
- }
1130
- }
1131
- // Route each scope connection
1132
- for (const sp of scopePending) {
1133
- const sx = sp.sourcePort.cx;
1134
- const sy = sp.sourcePort.cy;
1135
- const tx = sp.targetPort.cx;
1136
- const ty = sp.targetPort.cy;
1137
- const ddx = tx - sx;
1138
- const ddy = ty - sy;
1139
- const dist = Math.sqrt(ddx * ddx + ddy * ddy);
1140
- const useCurve = spForceCurveSet.has(sp);
1141
- if (!useCurve && dist > ORTHOGONAL_DISTANCE_THRESHOLD) {
1142
- const orthoPath = calculateOrthogonalPathSafe([sx, sy], [tx, ty], nodeBoxes, sp.fromNodeId, sp.toNodeId, { fromPortIndex: sp.fromPortIndex, toPortIndex: sp.toPortIndex }, allocator);
1143
- sp.conn.path = orthoPath ?? computeConnectionPath(sx, sy, tx, ty);
1144
- }
1145
- else {
1146
- sp.conn.path = computeConnectionPath(sx, sy, tx, ty);
1147
- }
1148
- }
1149
- }
1150
- // Extend bounds to include connection paths (routes can go outside node area)
1151
- let originX = 0;
1152
- let originY = 0;
1153
- let normalizedMaxY = (maxY - minY) + padding * 2;
1154
- let normalizedMaxX = (maxX - minX) + padding * 2;
1155
- const allConns = [...connections];
1156
- for (const node of nodes) {
1157
- if (node.scopeConnections)
1158
- allConns.push(...node.scopeConnections);
1159
- }
1160
- for (const conn of allConns) {
1161
- const extent = pathExtent(conn.path);
1162
- if (extent.maxY + padding > normalizedMaxY)
1163
- normalizedMaxY = extent.maxY + padding;
1164
- if (extent.maxX + padding > normalizedMaxX)
1165
- normalizedMaxX = extent.maxX + padding;
1166
- if (extent.minY - padding < originY)
1167
- originY = extent.minY - padding;
1168
- if (extent.minX - padding < originX)
1169
- originX = extent.minX - padding;
1170
- }
1171
- // Expand dimensions to cover the shifted origin
1172
- normalizedMaxX -= originX;
1173
- normalizedMaxY -= originY;
1174
- return {
1175
- nodes,
1176
- connections,
1177
- bounds: { width: normalizedMaxX, height: normalizedMaxY, originX, originY },
1178
- workflowName: ast.name,
1179
- };
1180
- }
1181
- /** Find a port for scope connection path recomputation */
1182
- function findScopePort(nodeId, portName, parentNode, childMap, side) {
1183
- // Check if it's a scope port on the parent
1184
- if (nodeId === parentNode.id) {
1185
- const ports = side === 'output' ? parentNode.scopePorts?.outputs : parentNode.scopePorts?.inputs;
1186
- return ports?.find(p => p.name === portName);
1187
- }
1188
- // Check child nodes
1189
- const child = childMap.get(nodeId);
1190
- if (!child)
1191
- return undefined;
1192
- return side === 'output'
1193
- ? child.outputs.find(p => p.name === portName)
1194
- : child.inputs.find(p => p.name === portName);
1195
- }
1196
- // ---- Helpers ----
1197
- /** Find the parent diagram node that contains a scope child */
1198
- function findScopeParent(childId, diagramNodes) {
1199
- for (const node of diagramNodes.values()) {
1200
- if (node.scopeChildren?.some(c => c.id === childId))
1201
- return node.id;
1202
- }
1203
- return undefined;
1204
- }
1205
- function filterHiddenPorts(ports) {
1206
- const result = {};
1207
- for (const [name, def] of Object.entries(ports)) {
1208
- if (!def.hidden)
1209
- result[name] = def;
1210
- }
1211
- return result;
1212
- }
1213
- function filterNonScopedPorts(ports) {
1214
- const result = {};
1215
- for (const [name, def] of Object.entries(ports)) {
1216
- if (!def.scope)
1217
- result[name] = def;
1218
- }
1219
- return result;
1220
- }
1221
- function resolveNodeColor(color, theme = 'dark') {
1222
- if (!color)
1223
- return NODE_DEFAULT_COLOR;
1224
- const variant = NODE_VARIANT_COLORS[color];
1225
- if (variant)
1226
- return theme === 'dark' ? variant.darkBorder : variant.border;
1227
- return color;
1228
- }
1229
- /** Auto-detect icon based on node type variant (matching original getNodeIcon logic) */
1230
- function resolveDefaultIcon(nt) {
1231
- if (!nt)
1232
- return 'code';
1233
- if (nt.variant === 'WORKFLOW' || nt.variant === 'IMPORTED_WORKFLOW')
1234
- return 'flow';
1235
- return 'code';
1236
- }
1237
- /** Extract min/max X/Y extent from an SVG path string (for bounds calculation) */
1238
- function pathExtent(path) {
1239
- let minX = Infinity, minY = Infinity;
1240
- let maxX = -Infinity, maxY = -Infinity;
1241
- const pattern = /(-?[\d.]+),(-?[\d.]+)/g;
1242
- let m;
1243
- while ((m = pattern.exec(path)) !== null) {
1244
- const x = parseFloat(m[1]);
1245
- const y = parseFloat(m[2]);
1246
- minX = Math.min(minX, x);
1247
- minY = Math.min(minY, y);
1248
- maxX = Math.max(maxX, x);
1249
- maxY = Math.max(maxY, y);
1250
- }
1251
- return { minX, minY, maxX, maxY };
1252
- }
1253
- /** Estimate the maximum port label badge extent beyond the node edge */
1254
- function maxPortLabelExtent(ports) {
1255
- if (ports.length === 0)
1256
- return 0;
1257
- let max = 0;
1258
- for (const port of ports) {
1259
- const abbrev = TYPE_ABBREVIATIONS[port.dataType] ?? port.dataType;
1260
- const badgeTextWidth = measureText(abbrev) + measureText(port.label);
1261
- const badgeWidth = badgeTextWidth + 23; // 7px pad + 4px + 1px divider + 4px + 7px pad
1262
- // PORT_RADIUS + gap(5) + badgeWidth
1263
- max = Math.max(max, PORT_RADIUS + 5 + badgeWidth);
1264
- }
1265
- return max;
1266
- }
1267
- //# sourceMappingURL=geometry.js.map