@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
@@ -0,0 +1,2003 @@
1
+ import { createRequire as __createRequire } from "module";
2
+ const require = __createRequire(import.meta.url);
3
+ import {
4
+ NODE_DEFAULT_COLOR,
5
+ NODE_VARIANT_COLORS,
6
+ TYPE_ABBREVIATIONS,
7
+ getPortColor
8
+ } from "./flow-weaver-chunk-55QMUZIA.mjs";
9
+ import {
10
+ assignImplicitPortOrders
11
+ } from "./flow-weaver-chunk-APX6MQ5A.mjs";
12
+ import {
13
+ SCOPED_PORT_NAMES,
14
+ isExecutePort,
15
+ isExitNode,
16
+ isFailurePort,
17
+ isScopedFailurePort,
18
+ isScopedStartPort,
19
+ isScopedSuccessPort,
20
+ isSuccessPort
21
+ } from "./flow-weaver-chunk-DRN7KPWY.mjs";
22
+
23
+ // src/diagram/layout.ts
24
+ function layoutWorkflow(ast) {
25
+ const nodeIds = /* @__PURE__ */ new Set();
26
+ nodeIds.add("Start");
27
+ nodeIds.add("Exit");
28
+ const scopedChildren = /* @__PURE__ */ new Set();
29
+ if (ast.scopes) {
30
+ for (const children of Object.values(ast.scopes)) {
31
+ for (const child of children) {
32
+ scopedChildren.add(child);
33
+ }
34
+ }
35
+ }
36
+ for (const inst of ast.instances) {
37
+ if (!scopedChildren.has(inst.id)) {
38
+ nodeIds.add(inst.id);
39
+ }
40
+ }
41
+ const forward = /* @__PURE__ */ new Map();
42
+ const backward = /* @__PURE__ */ new Map();
43
+ for (const id of nodeIds) {
44
+ forward.set(id, /* @__PURE__ */ new Set());
45
+ backward.set(id, /* @__PURE__ */ new Set());
46
+ }
47
+ for (const conn of ast.connections) {
48
+ if (conn.from.scope || conn.to.scope) continue;
49
+ const from = conn.from.node;
50
+ const to = conn.to.node;
51
+ if (!nodeIds.has(from) || !nodeIds.has(to)) continue;
52
+ forward.get(from).add(to);
53
+ backward.get(to).add(from);
54
+ }
55
+ const nodeLayer = /* @__PURE__ */ new Map();
56
+ const inDegree = /* @__PURE__ */ new Map();
57
+ for (const id of nodeIds) {
58
+ inDegree.set(id, backward.get(id).size);
59
+ }
60
+ const queue = [];
61
+ for (const id of nodeIds) {
62
+ if (inDegree.get(id) === 0) {
63
+ queue.push(id);
64
+ nodeLayer.set(id, 0);
65
+ }
66
+ }
67
+ if (!nodeLayer.has("Start")) {
68
+ nodeLayer.set("Start", 0);
69
+ queue.push("Start");
70
+ }
71
+ let head = 0;
72
+ while (head < queue.length) {
73
+ const node = queue[head++];
74
+ const layer = nodeLayer.get(node);
75
+ for (const next of forward.get(node)) {
76
+ const candidate = layer + 1;
77
+ if (!nodeLayer.has(next) || nodeLayer.get(next) < candidate) {
78
+ nodeLayer.set(next, candidate);
79
+ }
80
+ inDegree.set(next, inDegree.get(next) - 1);
81
+ if (inDegree.get(next) === 0) {
82
+ queue.push(next);
83
+ }
84
+ }
85
+ }
86
+ for (const id of nodeIds) {
87
+ if (!nodeLayer.has(id)) {
88
+ nodeLayer.set(id, 1);
89
+ }
90
+ }
91
+ let maxLayer = 0;
92
+ for (const [id, layer] of nodeLayer) {
93
+ if (!isExitNode(id) && layer > maxLayer) {
94
+ maxLayer = layer;
95
+ }
96
+ }
97
+ nodeLayer.set("Exit", maxLayer + 1);
98
+ const layerCount = nodeLayer.get("Exit") + 1;
99
+ const layers = Array.from({ length: layerCount }, () => []);
100
+ for (const [id, layer] of nodeLayer) {
101
+ layers[layer].push(id);
102
+ }
103
+ for (let sweep = 0; sweep < 4; sweep++) {
104
+ if (sweep % 2 === 0) {
105
+ for (let l = 1; l < layerCount; l++) {
106
+ sortLayerByBarycenter(layers[l], layers[l - 1], backward, forward);
107
+ }
108
+ } else {
109
+ for (let l = layerCount - 2; l >= 0; l--) {
110
+ sortLayerByBarycenter(layers[l], layers[l + 1], forward, backward);
111
+ }
112
+ }
113
+ }
114
+ return { layers, nodeLayer };
115
+ }
116
+ function sortLayerByBarycenter(layer, referenceLayer, _adjacencyToRef, _adjacencyFromRef) {
117
+ const refPositions = /* @__PURE__ */ new Map();
118
+ referenceLayer.forEach((id, i) => refPositions.set(id, i));
119
+ const barycenters = /* @__PURE__ */ new Map();
120
+ for (const nodeId of layer) {
121
+ const neighbors = [];
122
+ const fwd = _adjacencyToRef.get(nodeId);
123
+ const bwd = _adjacencyFromRef.get(nodeId);
124
+ if (fwd) {
125
+ for (const n of fwd) {
126
+ if (refPositions.has(n)) neighbors.push(refPositions.get(n));
127
+ }
128
+ }
129
+ if (bwd) {
130
+ for (const n of bwd) {
131
+ if (refPositions.has(n)) neighbors.push(refPositions.get(n));
132
+ }
133
+ }
134
+ if (neighbors.length > 0) {
135
+ barycenters.set(nodeId, neighbors.reduce((a, b) => a + b, 0) / neighbors.length);
136
+ } else {
137
+ barycenters.set(nodeId, Infinity);
138
+ }
139
+ }
140
+ layer.sort((a, b) => barycenters.get(a) - barycenters.get(b));
141
+ }
142
+
143
+ // src/diagram/graph/metrics.ts
144
+ var PORT_RADIUS = 7;
145
+ var PORT_SIZE = PORT_RADIUS * 2;
146
+ var PORT_GAP = 8;
147
+ var PORT_PADDING_Y = 18;
148
+ var NODE_MIN_WIDTH = 90;
149
+ var NODE_MIN_HEIGHT = 90;
150
+ var LABEL_CLEARANCE = 42;
151
+ var LABEL_HEIGHT = 24;
152
+ var LABEL_GAP = 12;
153
+ var CHAR_WIDTHS = {
154
+ " ": 2.78,
155
+ "!": 3.34,
156
+ '"': 4.74,
157
+ "#": 5.56,
158
+ "$": 5.56,
159
+ "%": 8.9,
160
+ "&": 7.23,
161
+ "'": 2.38,
162
+ "(": 3.34,
163
+ ")": 3.34,
164
+ "*": 3.9,
165
+ "+": 5.84,
166
+ ",": 2.78,
167
+ "-": 3.34,
168
+ ".": 2.78,
169
+ "/": 3.95,
170
+ "0": 5.56,
171
+ "1": 5.56,
172
+ "2": 5.56,
173
+ "3": 5.56,
174
+ "4": 5.56,
175
+ "5": 5.56,
176
+ "6": 5.56,
177
+ "7": 5.56,
178
+ "8": 5.56,
179
+ "9": 5.56,
180
+ ":": 3.34,
181
+ ";": 3.34,
182
+ "<": 5.86,
183
+ "=": 5.84,
184
+ ">": 5.86,
185
+ "?": 6.11,
186
+ "@": 9.76,
187
+ A: 7.23,
188
+ B: 7.23,
189
+ C: 7.23,
190
+ D: 7.23,
191
+ E: 6.67,
192
+ F: 6.11,
193
+ G: 7.78,
194
+ H: 7.23,
195
+ I: 2.78,
196
+ J: 5.56,
197
+ K: 7.23,
198
+ L: 6.11,
199
+ M: 8.34,
200
+ N: 7.23,
201
+ O: 7.78,
202
+ P: 6.67,
203
+ Q: 7.78,
204
+ R: 7.23,
205
+ S: 6.67,
206
+ T: 6.11,
207
+ U: 7.23,
208
+ V: 6.67,
209
+ W: 9.45,
210
+ X: 6.67,
211
+ Y: 6.67,
212
+ Z: 6.11,
213
+ "[": 3.34,
214
+ "\\": 3.95,
215
+ "]": 3.34,
216
+ "^": 5.84,
217
+ "_": 5.56,
218
+ "`": 3.58,
219
+ a: 5.56,
220
+ b: 6.11,
221
+ c: 5.56,
222
+ d: 6.11,
223
+ e: 5.56,
224
+ f: 3.34,
225
+ g: 6.11,
226
+ h: 6.11,
227
+ i: 2.78,
228
+ j: 2.78,
229
+ k: 5.56,
230
+ l: 2.78,
231
+ m: 8.9,
232
+ n: 6.11,
233
+ o: 6.11,
234
+ p: 6.11,
235
+ q: 6.11,
236
+ r: 3.9,
237
+ s: 5.56,
238
+ t: 3.34,
239
+ u: 6.11,
240
+ v: 5.56,
241
+ w: 7.78,
242
+ x: 5.56,
243
+ y: 5.56,
244
+ z: 5,
245
+ "{": 3.9,
246
+ "|": 2.8,
247
+ "}": 3.9,
248
+ "~": 5.96
249
+ };
250
+ var DEFAULT_CHAR_WIDTH = 5.56;
251
+ function measureText(text) {
252
+ let width = 0;
253
+ for (let i = 0; i < text.length; i++) {
254
+ width += CHAR_WIDTHS[text[i]] ?? DEFAULT_CHAR_WIDTH;
255
+ }
256
+ return width;
257
+ }
258
+ function portBadgeWidth(port) {
259
+ const abbrev = TYPE_ABBREVIATIONS[port.dataType] ?? port.dataType;
260
+ const typeWidth = measureText(abbrev);
261
+ const labelWidth = measureText(port.label);
262
+ const pad = 7;
263
+ const divGap = 4;
264
+ return pad + typeWidth + divGap + 1 + divGap + labelWidth + pad;
265
+ }
266
+ function portLabelExtent(port) {
267
+ const badgeGap = 5;
268
+ return PORT_RADIUS + badgeGap + portBadgeWidth(port);
269
+ }
270
+ function maxPortLabelExtent(ports) {
271
+ if (ports.length === 0) return 0;
272
+ let max = 0;
273
+ for (const port of ports) {
274
+ const abbrev = TYPE_ABBREVIATIONS[port.dataType] ?? port.dataType;
275
+ const badgeTextWidth = measureText(abbrev) + measureText(port.label);
276
+ const badgeWidth = badgeTextWidth + 23;
277
+ max = Math.max(max, PORT_RADIUS + 5 + badgeWidth);
278
+ }
279
+ return max;
280
+ }
281
+ function portsColumnHeight(count) {
282
+ if (count === 0) return 0;
283
+ return PORT_PADDING_Y + count * PORT_SIZE + (count - 1) * PORT_GAP + PORT_PADDING_Y;
284
+ }
285
+
286
+ // src/diagram/graph/bounds.ts
287
+ var PADDING = 40;
288
+ function normalizeNodes(nodes) {
289
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
290
+ for (const node of nodes) {
291
+ const labelTop = node.y - LABEL_HEIGHT - LABEL_GAP;
292
+ const inputLabelExtent = maxPortLabelExtent(node.inputs);
293
+ const outputLabelExtent = maxPortLabelExtent(node.outputs);
294
+ minX = Math.min(minX, node.x - inputLabelExtent);
295
+ minY = Math.min(minY, labelTop);
296
+ maxX = Math.max(maxX, node.x + node.width + outputLabelExtent);
297
+ maxY = Math.max(maxY, node.y + node.height);
298
+ }
299
+ const offsetX = -minX + PADDING;
300
+ const offsetY = -minY + PADDING;
301
+ const shiftPorts = (ports) => {
302
+ for (const p of ports) {
303
+ p.cx += offsetX;
304
+ p.cy += offsetY;
305
+ }
306
+ };
307
+ for (const node of nodes) {
308
+ node.x += offsetX;
309
+ node.y += offsetY;
310
+ shiftPorts(node.inputs);
311
+ shiftPorts(node.outputs);
312
+ if (node.scopeChildren) {
313
+ for (const child of node.scopeChildren) {
314
+ child.x += offsetX;
315
+ child.y += offsetY;
316
+ shiftPorts(child.inputs);
317
+ shiftPorts(child.outputs);
318
+ }
319
+ }
320
+ if (node.scopePorts) {
321
+ shiftPorts(node.scopePorts.inputs);
322
+ shiftPorts(node.scopePorts.outputs);
323
+ }
324
+ }
325
+ return { minX, minY, maxX, maxY };
326
+ }
327
+ function graphBounds(extent, connections, nodes) {
328
+ const { minX, minY, maxX, maxY } = extent;
329
+ let originX = 0;
330
+ let originY = 0;
331
+ let normalizedMaxY = maxY - minY + PADDING * 2;
332
+ let normalizedMaxX = maxX - minX + PADDING * 2;
333
+ const allConns = [...connections];
334
+ for (const node of nodes) {
335
+ if (node.scopeConnections) allConns.push(...node.scopeConnections);
336
+ }
337
+ for (const conn of allConns) {
338
+ const pe = pathExtent(conn.path);
339
+ if (pe.maxY + PADDING > normalizedMaxY) normalizedMaxY = pe.maxY + PADDING;
340
+ if (pe.maxX + PADDING > normalizedMaxX) normalizedMaxX = pe.maxX + PADDING;
341
+ if (pe.minY - PADDING < originY) originY = pe.minY - PADDING;
342
+ if (pe.minX - PADDING < originX) originX = pe.minX - PADDING;
343
+ }
344
+ normalizedMaxX -= originX;
345
+ normalizedMaxY -= originY;
346
+ return { width: normalizedMaxX, height: normalizedMaxY, originX, originY };
347
+ }
348
+ function pathExtent(path) {
349
+ let minX = Infinity, minY = Infinity;
350
+ let maxX = -Infinity, maxY = -Infinity;
351
+ const pattern = /(-?[\d.]+),(-?[\d.]+)/g;
352
+ let m;
353
+ while ((m = pattern.exec(path)) !== null) {
354
+ const x = parseFloat(m[1]);
355
+ const y = parseFloat(m[2]);
356
+ minX = Math.min(minX, x);
357
+ minY = Math.min(minY, y);
358
+ maxX = Math.max(maxX, x);
359
+ maxY = Math.max(maxY, y);
360
+ }
361
+ return { minX, minY, maxX, maxY };
362
+ }
363
+
364
+ // src/diagram/graph/ports.ts
365
+ function orderedPorts(ports, direction) {
366
+ const cloned = {};
367
+ for (const [name, def] of Object.entries(ports)) {
368
+ cloned[name] = { ...def, metadata: def.metadata ? { ...def.metadata } : void 0 };
369
+ }
370
+ assignImplicitPortOrders(cloned);
371
+ return Object.entries(cloned).sort(([, a], [, b]) => {
372
+ const orderA = a.metadata?.order ?? Infinity;
373
+ const orderB = b.metadata?.order ?? Infinity;
374
+ return orderA - orderB;
375
+ }).map(([name, def]) => ({
376
+ name,
377
+ label: def.label ?? name,
378
+ dataType: def.dataType,
379
+ direction,
380
+ isControlFlow: def.dataType === "STEP",
381
+ isFailure: !!def.failure,
382
+ cx: 0,
383
+ cy: 0
384
+ }));
385
+ }
386
+ function filterHiddenPorts(ports) {
387
+ const result = {};
388
+ for (const [name, def] of Object.entries(ports)) {
389
+ if (!def.hidden) result[name] = def;
390
+ }
391
+ return result;
392
+ }
393
+ function filterNonScopedPorts(ports) {
394
+ const result = {};
395
+ for (const [name, def] of Object.entries(ports)) {
396
+ if (!def.scope) result[name] = def;
397
+ }
398
+ return result;
399
+ }
400
+ function computePortPositions(node) {
401
+ positionPortList(node.inputs, node.x, node.y);
402
+ positionPortList(node.outputs, node.x + node.width, node.y);
403
+ }
404
+ function positionPortList(ports, cx, nodeY) {
405
+ if (ports.length === 0) return;
406
+ for (let i = 0; i < ports.length; i++) {
407
+ ports[i].cx = cx;
408
+ ports[i].cy = nodeY + PORT_PADDING_Y + i * (PORT_SIZE + PORT_GAP) + PORT_SIZE / 2;
409
+ }
410
+ }
411
+
412
+ // src/diagram/graph/nodes.ts
413
+ function buildNodeTypeMap(ast) {
414
+ const nodeTypeMap = /* @__PURE__ */ new Map();
415
+ for (const nt of ast.nodeTypes) {
416
+ nodeTypeMap.set(nt.name, nt);
417
+ if (nt.functionName && nt.functionName !== nt.name) {
418
+ nodeTypeMap.set(nt.functionName, nt);
419
+ }
420
+ }
421
+ return nodeTypeMap;
422
+ }
423
+ function computeNodeDimensions(node) {
424
+ const maxPorts = Math.max(node.inputs.length, node.outputs.length);
425
+ const portsHeight = maxPorts > 0 ? PORT_PADDING_Y + maxPorts * PORT_SIZE + (maxPorts - 1) * PORT_GAP + PORT_PADDING_Y : 0;
426
+ node.width = NODE_MIN_WIDTH;
427
+ node.height = Math.max(NODE_MIN_HEIGHT, portsHeight);
428
+ }
429
+ function buildStartNode(ast) {
430
+ const allStartPorts = filterHiddenPorts({ ...ast.startPorts });
431
+ if (!allStartPorts.execute && !ast.startPorts.execute?.hidden) {
432
+ allStartPorts.execute = { dataType: "STEP" };
433
+ }
434
+ const startOutputs = orderedPorts(allStartPorts, "OUTPUT");
435
+ return {
436
+ id: "Start",
437
+ label: "Start",
438
+ color: NODE_DEFAULT_COLOR,
439
+ icon: "startNode",
440
+ isVirtual: true,
441
+ inputs: [],
442
+ outputs: startOutputs,
443
+ x: 0,
444
+ y: 0,
445
+ width: NODE_MIN_WIDTH,
446
+ height: NODE_MIN_HEIGHT
447
+ };
448
+ }
449
+ function buildExitNode(ast) {
450
+ const allExitPorts = filterHiddenPorts({ ...ast.exitPorts });
451
+ if (!allExitPorts.onSuccess && !ast.exitPorts.onSuccess?.hidden) {
452
+ allExitPorts.onSuccess = { dataType: "STEP", isControlFlow: true };
453
+ }
454
+ if (!allExitPorts.onFailure && !ast.exitPorts.onFailure?.hidden) {
455
+ allExitPorts.onFailure = { dataType: "STEP", isControlFlow: true, failure: true };
456
+ } else if (allExitPorts.onFailure) {
457
+ allExitPorts.onFailure = { ...allExitPorts.onFailure, failure: true };
458
+ }
459
+ const exitInputs = orderedPorts(allExitPorts, "INPUT");
460
+ return {
461
+ id: "Exit",
462
+ label: "Exit",
463
+ color: NODE_DEFAULT_COLOR,
464
+ icon: "exitNode",
465
+ isVirtual: true,
466
+ inputs: exitInputs,
467
+ outputs: [],
468
+ x: 0,
469
+ y: 0,
470
+ width: NODE_MIN_WIDTH,
471
+ height: NODE_MIN_HEIGHT
472
+ };
473
+ }
474
+ function collectWiredStepPorts(ast) {
475
+ const stepPortsUsed = /* @__PURE__ */ new Map();
476
+ const noteStep = (nodeId, port) => {
477
+ if (!isExecutePort(port) && !isSuccessPort(port) && !isFailurePort(port)) return;
478
+ let s = stepPortsUsed.get(nodeId);
479
+ if (!s) stepPortsUsed.set(nodeId, s = /* @__PURE__ */ new Set());
480
+ s.add(port);
481
+ };
482
+ for (const conn of ast.connections) {
483
+ noteStep(conn.from.node, conn.from.port);
484
+ noteStep(conn.to.node, conn.to.port);
485
+ }
486
+ return stepPortsUsed;
487
+ }
488
+ function buildInstanceNode(instId, instNodeType, instConfig, nodeTypeMap, theme = "dark", connectedStepPorts) {
489
+ const nt = nodeTypeMap.get(instNodeType);
490
+ const allInputs = nt ? filterHiddenPorts(filterNonScopedPorts(nt.inputs)) : {};
491
+ const allOutputs = nt ? filterHiddenPorts(filterNonScopedPorts(nt.outputs)) : {};
492
+ const pullStyle = !!nt?.expression && connectedStepPorts !== void 0 && connectedStepPorts.size === 0;
493
+ if (pullStyle) {
494
+ delete allInputs.execute;
495
+ delete allOutputs.onSuccess;
496
+ delete allOutputs.onFailure;
497
+ }
498
+ if (nt && !nt.expression) {
499
+ if (!allInputs.execute && !nt.inputs.execute?.hidden) allInputs.execute = { dataType: "STEP" };
500
+ }
501
+ if (!pullStyle && nt && nt.hasSuccessPort && !allOutputs.onSuccess && !nt.outputs.onSuccess?.hidden) {
502
+ allOutputs.onSuccess = { dataType: "STEP", isControlFlow: true };
503
+ }
504
+ if (!pullStyle && nt && nt.hasFailurePort && !allOutputs.onFailure && !nt.outputs.onFailure?.hidden) {
505
+ allOutputs.onFailure = { dataType: "STEP", isControlFlow: true, failure: true };
506
+ }
507
+ const resolvedIcon = instConfig?.icon ?? nt?.visuals?.icon ?? resolveDefaultIcon(nt);
508
+ return {
509
+ id: instId,
510
+ label: instConfig?.label ?? nt?.label ?? instId,
511
+ color: resolveNodeColor(instConfig?.color ?? nt?.visuals?.color, theme),
512
+ icon: resolvedIcon,
513
+ isVirtual: false,
514
+ inputs: orderedPorts(allInputs, "INPUT"),
515
+ outputs: orderedPorts(allOutputs, "OUTPUT"),
516
+ x: 0,
517
+ y: 0,
518
+ width: NODE_MIN_WIDTH,
519
+ height: NODE_MIN_HEIGHT
520
+ };
521
+ }
522
+ function applySizeOverrides(ast, diagramNodes, scopedChildren) {
523
+ for (const inst of ast.instances) {
524
+ if (scopedChildren.has(inst.id)) continue;
525
+ const node = diagramNodes.get(inst.id);
526
+ if (!node) continue;
527
+ if (inst.config?.width != null) node.width = inst.config.width;
528
+ if (inst.config?.height != null) node.height = inst.config.height;
529
+ }
530
+ }
531
+ function resolveNodeColor(color, theme = "dark") {
532
+ if (!color) return NODE_DEFAULT_COLOR;
533
+ const variant = NODE_VARIANT_COLORS[color];
534
+ if (variant) return theme === "dark" ? variant.darkBorder : variant.border;
535
+ return color;
536
+ }
537
+ function resolveDefaultIcon(nt) {
538
+ if (!nt) return "code";
539
+ if (nt.variant === "WORKFLOW" || nt.variant === "IMPORTED_WORKFLOW") return "flow";
540
+ return "code";
541
+ }
542
+
543
+ // src/diagram/graph/placement.ts
544
+ var LAYER_GAP_X = 300;
545
+ var MIN_EDGE_GAP = 112;
546
+ var NODE_GAP_Y = 60;
547
+ function layerOutputExtent(layerNodes, diagramNodes) {
548
+ let max = 0;
549
+ for (const id of layerNodes) {
550
+ const node = diagramNodes.get(id);
551
+ max = Math.max(max, maxPortLabelExtent(node.outputs));
552
+ }
553
+ return max;
554
+ }
555
+ function layerInputExtent(layerNodes, diagramNodes) {
556
+ let max = 0;
557
+ for (const id of layerNodes) {
558
+ const node = diagramNodes.get(id);
559
+ max = Math.max(max, maxPortLabelExtent(node.inputs));
560
+ }
561
+ return max;
562
+ }
563
+ function adaptiveGapY(layerSize) {
564
+ if (layerSize <= 2) return NODE_GAP_Y;
565
+ return Math.max(24, Math.round(NODE_GAP_Y * 2 / layerSize));
566
+ }
567
+ function assignLayerCoordinates(layers, diagramNodes) {
568
+ const filtered = layers.map((l) => l.filter((id) => diagramNodes.has(id)));
569
+ let currentX = 0;
570
+ for (let i = 0; i < filtered.length; i++) {
571
+ const layerNodes = filtered[i];
572
+ if (layerNodes.length === 0) {
573
+ currentX += LAYER_GAP_X;
574
+ continue;
575
+ }
576
+ const maxWidth = Math.max(...layerNodes.map((id) => diagramNodes.get(id).width));
577
+ const gapY = adaptiveGapY(layerNodes.length);
578
+ const totalHeight = layerNodes.reduce((sum, id) => {
579
+ const n = diagramNodes.get(id);
580
+ return sum + n.height + LABEL_HEIGHT + LABEL_GAP;
581
+ }, 0) + (layerNodes.length - 1) * gapY;
582
+ let currentY = -totalHeight / 2;
583
+ for (const id of layerNodes) {
584
+ const node = diagramNodes.get(id);
585
+ currentY += LABEL_HEIGHT + LABEL_GAP;
586
+ node.x = currentX + (maxWidth - node.width) / 2;
587
+ node.y = currentY;
588
+ currentY += node.height + gapY;
589
+ }
590
+ const nextLayerNodes = filtered[i + 1];
591
+ if (nextLayerNodes && nextLayerNodes.length > 0) {
592
+ const outputOverhang = layerOutputExtent(layerNodes, diagramNodes);
593
+ const inputOverhang = layerInputExtent(nextLayerNodes, diagramNodes);
594
+ const labelMinGap = outputOverhang + LABEL_CLEARANCE + inputOverhang;
595
+ const edgeGap = Math.max(labelMinGap, LAYER_GAP_X - maxWidth, MIN_EDGE_GAP);
596
+ currentX += maxWidth + edgeGap;
597
+ } else {
598
+ currentX += maxWidth + LAYER_GAP_X;
599
+ }
600
+ }
601
+ }
602
+ function resolvePostLayoutOverlaps(diagramNodes) {
603
+ const hasScopeParent = [...diagramNodes.values()].some((n) => n.scopeChildren && n.scopeChildren.length > 0);
604
+ if (!hasScopeParent) return;
605
+ const nodes = [...diagramNodes.values()].sort((a, b) => a.x - b.x);
606
+ for (let i = 1; i < nodes.length; i++) {
607
+ const prev = nodes[i - 1];
608
+ const curr = nodes[i];
609
+ if (!prev.scopeChildren || prev.scopeChildren.length === 0) continue;
610
+ const actualGap = curr.x - (prev.x + prev.width);
611
+ if (actualGap < MIN_EDGE_GAP) {
612
+ const shift = MIN_EDGE_GAP - actualGap;
613
+ for (let j = i; j < nodes.length; j++) {
614
+ nodes[j].x += shift;
615
+ }
616
+ }
617
+ }
618
+ }
619
+
620
+ // src/diagram/orthogonal-router.ts
621
+ var TRACK_SPACING = 15;
622
+ var EDGE_OFFSET = 5;
623
+ var BELOW_BIAS = 40;
624
+ var TrackAllocator = class {
625
+ claims = /* @__PURE__ */ new Map();
626
+ claim(xMin, xMax, candidateY) {
627
+ const snap = (y) => Math.round(y / TRACK_SPACING) * TRACK_SPACING;
628
+ const overlaps = (slot) => {
629
+ const intervals = this.claims.get(slot);
630
+ if (!intervals) return false;
631
+ return intervals.some(([a, b]) => xMin < b && xMax > a);
632
+ };
633
+ const take = (slot) => {
634
+ if (!this.claims.has(slot)) this.claims.set(slot, []);
635
+ const slotClaims = this.claims.get(slot);
636
+ if (slotClaims) slotClaims.push([xMin, xMax]);
637
+ return slot;
638
+ };
639
+ const base = snap(candidateY);
640
+ for (let i = 0; i < 60; i++) {
641
+ const below = base + i * TRACK_SPACING;
642
+ if (!overlaps(below)) return take(below);
643
+ if (i > 0) {
644
+ const above = base - i * TRACK_SPACING;
645
+ if (!overlaps(above)) return take(above);
646
+ }
647
+ }
648
+ return candidateY;
649
+ }
650
+ };
651
+ function inflateBox(box, padding) {
652
+ return {
653
+ left: box.x - padding,
654
+ right: box.x + box.width + padding,
655
+ top: box.y - padding,
656
+ bottom: box.y + box.height + padding
657
+ };
658
+ }
659
+ function segmentOverlapsBox(xMin, xMax, y, box) {
660
+ return xMin < box.right && xMax > box.left && y >= box.top && y <= box.bottom;
661
+ }
662
+ function verticalSegmentClear(x, yMin, yMax, boxes) {
663
+ return !boxes.some(
664
+ (box) => x >= box.left && x <= box.right && yMin < box.bottom && yMax > box.top
665
+ );
666
+ }
667
+ function findClearY(xMin, xMax, candidateY, boxes) {
668
+ const isBlocked = (y) => boxes.some((box) => segmentOverlapsBox(xMin, xMax, y, box));
669
+ if (!isBlocked(candidateY)) return candidateY;
670
+ const edges = [];
671
+ for (const box of boxes) {
672
+ if (xMin < box.right && xMax > box.left) {
673
+ edges.push(box.top);
674
+ edges.push(box.bottom);
675
+ }
676
+ }
677
+ if (edges.length === 0) return candidateY;
678
+ edges.sort((a, b) => a - b);
679
+ let bestY = candidateY;
680
+ let bestDist = Infinity;
681
+ for (const edge of edges) {
682
+ for (const y of [edge - EDGE_OFFSET, edge + EDGE_OFFSET]) {
683
+ if (!isBlocked(y)) {
684
+ const dist = Math.abs(y - candidateY);
685
+ if (dist < bestDist) {
686
+ bestDist = dist;
687
+ bestY = y;
688
+ }
689
+ }
690
+ }
691
+ }
692
+ if (bestDist === Infinity) {
693
+ const allMin = Math.min(...edges) - EDGE_OFFSET * 2;
694
+ const allMax = Math.max(...edges) + EDGE_OFFSET * 2;
695
+ bestY = Math.abs(allMin - candidateY) < Math.abs(allMax - candidateY) ? allMin : allMax;
696
+ if (isBlocked(bestY)) {
697
+ for (let offset = TRACK_SPACING; offset < 800; offset += TRACK_SPACING) {
698
+ if (!isBlocked(bestY - offset)) {
699
+ bestY -= offset;
700
+ break;
701
+ }
702
+ if (!isBlocked(bestY + offset)) {
703
+ bestY += offset;
704
+ break;
705
+ }
706
+ }
707
+ }
708
+ }
709
+ return bestY;
710
+ }
711
+ function findClearX(yMin, yMax, candidateX, boxes) {
712
+ const isBlocked = (x) => boxes.some((box) => x >= box.left && x <= box.right && yMin < box.bottom && yMax > box.top);
713
+ if (!isBlocked(candidateX)) return candidateX;
714
+ const edges = [];
715
+ for (const box of boxes) {
716
+ if (yMin < box.bottom && yMax > box.top) {
717
+ edges.push(box.left);
718
+ edges.push(box.right);
719
+ }
720
+ }
721
+ if (edges.length === 0) return candidateX;
722
+ edges.sort((a, b) => a - b);
723
+ let bestX = candidateX;
724
+ let bestDist = Infinity;
725
+ for (const edge of edges) {
726
+ for (const x of [edge - EDGE_OFFSET, edge + EDGE_OFFSET]) {
727
+ if (!isBlocked(x)) {
728
+ const dist = Math.abs(x - candidateX);
729
+ if (dist < bestDist) {
730
+ bestDist = dist;
731
+ bestX = x;
732
+ }
733
+ }
734
+ }
735
+ }
736
+ if (bestDist === Infinity) {
737
+ const allMin = Math.min(...edges) - EDGE_OFFSET * 2;
738
+ const allMax = Math.max(...edges) + EDGE_OFFSET * 2;
739
+ bestX = Math.abs(allMin - candidateX) <= Math.abs(allMax - candidateX) ? allMin : allMax;
740
+ if (isBlocked(bestX)) {
741
+ for (let offset = TRACK_SPACING; offset < 800; offset += TRACK_SPACING) {
742
+ if (!isBlocked(bestX - offset)) {
743
+ bestX -= offset;
744
+ break;
745
+ }
746
+ if (!isBlocked(bestX + offset)) {
747
+ bestX += offset;
748
+ break;
749
+ }
750
+ }
751
+ }
752
+ }
753
+ return bestX;
754
+ }
755
+ var MIN_SEGMENT_LENGTH = 3;
756
+ var JOG_THRESHOLD = 10;
757
+ function simplifyWaypoints(waypoints) {
758
+ if (waypoints.length <= 2) return waypoints;
759
+ let pts = waypoints;
760
+ let jogFound = true;
761
+ while (jogFound) {
762
+ jogFound = false;
763
+ for (let i = 0; i < pts.length - 3; i++) {
764
+ const a = pts[i], b = pts[i + 1], c = pts[i + 2], d = pts[i + 3];
765
+ const jogH = Math.abs(b[1] - c[1]);
766
+ if (Math.abs(a[1] - b[1]) < 0.5 && Math.abs(b[0] - c[0]) < 0.5 && Math.abs(c[1] - d[1]) < 0.5 && jogH > 0.5 && jogH < JOG_THRESHOLD) {
767
+ if (Math.abs(a[1] - d[1]) < 0.5) {
768
+ const snapY = a[1];
769
+ const newPts = pts.slice();
770
+ newPts[i + 1] = [b[0], snapY];
771
+ newPts[i + 2] = [c[0], snapY];
772
+ pts = newPts;
773
+ jogFound = true;
774
+ break;
775
+ }
776
+ }
777
+ const jogW = Math.abs(b[0] - c[0]);
778
+ if (Math.abs(a[0] - b[0]) < 0.5 && Math.abs(b[1] - c[1]) < 0.5 && Math.abs(c[0] - d[0]) < 0.5 && jogW > 0.5 && jogW < JOG_THRESHOLD) {
779
+ if (Math.abs(a[0] - d[0]) < 0.5) {
780
+ const snapX = a[0];
781
+ const newPts = pts.slice();
782
+ newPts[i + 1] = [snapX, b[1]];
783
+ newPts[i + 2] = [snapX, c[1]];
784
+ pts = newPts;
785
+ jogFound = true;
786
+ break;
787
+ }
788
+ }
789
+ }
790
+ }
791
+ const result = [pts[0]];
792
+ for (let i = 1; i < pts.length - 1; i++) {
793
+ const prev = result[result.length - 1];
794
+ const curr = pts[i];
795
+ const next = pts[i + 1];
796
+ const distToPrev = Math.abs(prev[0] - curr[0]) + Math.abs(prev[1] - curr[1]);
797
+ if (distToPrev < MIN_SEGMENT_LENGTH) {
798
+ const wouldDiag = Math.abs(prev[0] - next[0]) > 0.5 && Math.abs(prev[1] - next[1]) > 0.5;
799
+ if (!wouldDiag) continue;
800
+ }
801
+ const sameX = Math.abs(prev[0] - curr[0]) < 0.01 && Math.abs(curr[0] - next[0]) < 0.01;
802
+ const sameY = Math.abs(prev[1] - curr[1]) < 0.01 && Math.abs(curr[1] - next[1]) < 0.01;
803
+ if (!sameX && !sameY) {
804
+ result.push(curr);
805
+ }
806
+ }
807
+ result.push(pts[pts.length - 1]);
808
+ return result;
809
+ }
810
+ function waypointsToSvgPath(waypoints, cornerRadius) {
811
+ if (waypoints.length < 2) return "";
812
+ if (waypoints.length === 2) {
813
+ return `M ${waypoints[0][0]},${waypoints[0][1]} L ${waypoints[1][0]},${waypoints[1][1]}`;
814
+ }
815
+ const radii = new Array(waypoints.length).fill(0);
816
+ for (let i = 1; i < waypoints.length - 1; i++) {
817
+ const prev = waypoints[i - 1];
818
+ const curr = waypoints[i];
819
+ const next = waypoints[i + 1];
820
+ const lenPrev = Math.sqrt((prev[0] - curr[0]) ** 2 + (prev[1] - curr[1]) ** 2);
821
+ const lenNext = Math.sqrt((next[0] - curr[0]) ** 2 + (next[1] - curr[1]) ** 2);
822
+ radii[i] = lenPrev < 0.01 || lenNext < 0.01 ? 0 : Math.min(cornerRadius, lenPrev / 2, lenNext / 2);
823
+ }
824
+ for (let i = 1; i < waypoints.length - 2; i++) {
825
+ const curr = waypoints[i];
826
+ const next = waypoints[i + 1];
827
+ const segLen = Math.sqrt((next[0] - curr[0]) ** 2 + (next[1] - curr[1]) ** 2);
828
+ const total = radii[i] + radii[i + 1];
829
+ if (total > segLen && total > 0) {
830
+ const scale = segLen / total;
831
+ radii[i] *= scale;
832
+ radii[i + 1] *= scale;
833
+ }
834
+ }
835
+ let path = `M ${waypoints[0][0]},${waypoints[0][1]}`;
836
+ for (let i = 1; i < waypoints.length - 1; i++) {
837
+ const prev = waypoints[i - 1];
838
+ const curr = waypoints[i];
839
+ const next = waypoints[i + 1];
840
+ const r = radii[i];
841
+ if (r < 0.01) {
842
+ path += ` L ${curr[0]},${curr[1]}`;
843
+ continue;
844
+ }
845
+ const dPrev = [prev[0] - curr[0], prev[1] - curr[1]];
846
+ const dNext = [next[0] - curr[0], next[1] - curr[1]];
847
+ const lenPrev = Math.sqrt(dPrev[0] * dPrev[0] + dPrev[1] * dPrev[1]);
848
+ const lenNext = Math.sqrt(dNext[0] * dNext[0] + dNext[1] * dNext[1]);
849
+ const uPrev = [dPrev[0] / lenPrev, dPrev[1] / lenPrev];
850
+ const uNext = [dNext[0] / lenNext, dNext[1] / lenNext];
851
+ const cross = uPrev[0] * uNext[1] - uPrev[1] * uNext[0];
852
+ const deflection = Math.abs(cross);
853
+ const scaledR = r * deflection;
854
+ if (scaledR < 0.5) {
855
+ path += ` L ${curr[0]},${curr[1]}`;
856
+ continue;
857
+ }
858
+ const arcStart = [curr[0] + uPrev[0] * scaledR, curr[1] + uPrev[1] * scaledR];
859
+ const arcEnd = [curr[0] + uNext[0] * scaledR, curr[1] + uNext[1] * scaledR];
860
+ const sweep = cross > 0 ? 0 : 1;
861
+ path += ` L ${arcStart[0]},${arcStart[1]}`;
862
+ path += ` A ${scaledR} ${scaledR} 0 0 ${sweep} ${arcEnd[0]},${arcEnd[1]}`;
863
+ }
864
+ const last = waypoints[waypoints.length - 1];
865
+ path += ` L ${last[0]},${last[1]}`;
866
+ return path;
867
+ }
868
+ function computeWaypoints(from, to, nodeBoxes, sourceNodeId, targetNodeId, padding, exitStub, entryStub, scopedInternal, allocator) {
869
+ const isSelfConnection = sourceNodeId === targetNodeId && !scopedInternal;
870
+ const inflatedBoxes = nodeBoxes.map((box) => inflateBox(box, padding));
871
+ const stubExit = [from[0] + exitStub, from[1]];
872
+ const stubEntry = [to[0] - entryStub, to[1]];
873
+ const xMin = Math.min(stubExit[0], stubEntry[0]);
874
+ const xMax = Math.max(stubExit[0], stubEntry[0]);
875
+ if (!isSelfConnection && to[0] >= from[0] - exitStub) {
876
+ let candidateY = (from[1] + to[1]) / 2 + BELOW_BIAS;
877
+ const intermediateBoxes = inflatedBoxes.filter((box) => box.left < xMax && box.right > xMin);
878
+ if (intermediateBoxes.length >= 2) {
879
+ const clusterTop = Math.min(...intermediateBoxes.map((b) => b.top));
880
+ const clusterBottom = Math.max(...intermediateBoxes.map((b) => b.bottom));
881
+ if (candidateY > clusterTop && candidateY < clusterBottom) {
882
+ const distToTop = candidateY - clusterTop;
883
+ const distToBottom = clusterBottom - candidateY;
884
+ candidateY = distToTop < distToBottom ? clusterTop - padding : clusterBottom + padding;
885
+ }
886
+ }
887
+ const clearY = allocator ? allocator.claim(xMin, xMax, findClearY(xMin, xMax, candidateY, inflatedBoxes)) : findClearY(xMin, xMax, candidateY, inflatedBoxes);
888
+ const yMin = Math.min(from[1], to[1]);
889
+ const yMax = Math.max(from[1], to[1]);
890
+ const stubsCross = stubExit[0] >= stubEntry[0];
891
+ const midX = stubsCross ? (from[0] + to[0]) / 2 : stubExit[0] + (stubEntry[0] - stubExit[0]) * 0.75;
892
+ const freeMidX = findClearX(yMin, yMax || yMin + 1, midX, inflatedBoxes);
893
+ const lShapeXValid = stubsCross ? freeMidX >= Math.min(from[0], to[0]) && freeMidX <= Math.max(from[0], to[0]) : freeMidX > stubExit[0] && freeMidX < stubEntry[0];
894
+ if (lShapeXValid && verticalSegmentClear(freeMidX, yMin, yMax, inflatedBoxes) && !inflatedBoxes.some((box) => segmentOverlapsBox(stubExit[0], freeMidX, from[1], box)) && !inflatedBoxes.some((box) => segmentOverlapsBox(freeMidX, stubEntry[0], to[1], box))) {
895
+ return simplifyWaypoints([from, [freeMidX, from[1]], [freeMidX, to[1]], to]);
896
+ }
897
+ if (Math.abs(clearY - from[1]) < JOG_THRESHOLD && !inflatedBoxes.some((box) => segmentOverlapsBox(xMin, xMax, from[1], box))) {
898
+ candidateY = from[1];
899
+ } else if (Math.abs(clearY - to[1]) < JOG_THRESHOLD && !inflatedBoxes.some((box) => segmentOverlapsBox(xMin, xMax, to[1], box))) {
900
+ candidateY = to[1];
901
+ } else {
902
+ candidateY = clearY;
903
+ }
904
+ const exitYMin = Math.min(from[1], candidateY);
905
+ const exitYMax = Math.max(from[1], candidateY);
906
+ let exitX = findClearX(exitYMin, exitYMax, stubExit[0], inflatedBoxes);
907
+ if (exitX < from[0]) {
908
+ exitX = stubExit[0];
909
+ if (!verticalSegmentClear(exitX, exitYMin, exitYMax, inflatedBoxes)) {
910
+ exitX = findClearX(exitYMin, exitYMax, stubExit[0] + TRACK_SPACING, inflatedBoxes);
911
+ }
912
+ }
913
+ const entryYMin = Math.min(to[1], candidateY);
914
+ const entryYMax = Math.max(to[1], candidateY);
915
+ let entryX = findClearX(entryYMin, entryYMax, stubEntry[0], inflatedBoxes);
916
+ if (entryX > to[0]) {
917
+ entryX = stubEntry[0];
918
+ if (!verticalSegmentClear(entryX, entryYMin, entryYMax, inflatedBoxes)) {
919
+ entryX = findClearX(entryYMin, entryYMax, stubEntry[0] - TRACK_SPACING, inflatedBoxes);
920
+ }
921
+ }
922
+ return simplifyWaypoints([
923
+ from,
924
+ [exitX, from[1]],
925
+ [exitX, candidateY],
926
+ [entryX, candidateY],
927
+ [entryX, to[1]],
928
+ to
929
+ ]);
930
+ } else {
931
+ const sourceBox = nodeBoxes.find((b) => b.id === sourceNodeId);
932
+ const targetBox = nodeBoxes.find((b) => b.id === targetNodeId);
933
+ const corridorBoxes = inflatedBoxes.filter((box) => box.left < xMax && box.right > xMin);
934
+ const bottoms = corridorBoxes.map((b) => b.bottom);
935
+ const tops = corridorBoxes.map((b) => b.top);
936
+ if (sourceBox) {
937
+ bottoms.push(sourceBox.y + sourceBox.height + padding);
938
+ tops.push(sourceBox.y - padding);
939
+ }
940
+ if (targetBox) {
941
+ bottoms.push(targetBox.y + targetBox.height + padding);
942
+ tops.push(targetBox.y - padding);
943
+ }
944
+ const maxBottom = Math.max(...bottoms, from[1] + 50, to[1] + 50);
945
+ const minTop = Math.min(...tops, from[1] - 50, to[1] - 50);
946
+ const avgY = (from[1] + to[1]) / 2 + BELOW_BIAS;
947
+ const escapeBelow = maxBottom + padding;
948
+ const escapeAbove = minTop - padding;
949
+ let escapeY = Math.abs(escapeAbove - avgY) < Math.abs(escapeBelow - avgY) ? escapeAbove : escapeBelow;
950
+ escapeY = allocator ? allocator.claim(xMin, xMax, findClearY(xMin, xMax, escapeY, inflatedBoxes)) : findClearY(xMin, xMax, escapeY, inflatedBoxes);
951
+ const bwExitYMin = Math.min(from[1], escapeY);
952
+ const bwExitYMax = Math.max(from[1], escapeY);
953
+ const bwExitX = findClearX(bwExitYMin, bwExitYMax, stubExit[0], inflatedBoxes);
954
+ const bwEntryYMin = Math.min(to[1], escapeY);
955
+ const bwEntryYMax = Math.max(to[1], escapeY);
956
+ const bwEntryX = findClearX(bwEntryYMin, bwEntryYMax, stubEntry[0], inflatedBoxes);
957
+ return simplifyWaypoints([
958
+ from,
959
+ [bwExitX, from[1]],
960
+ [bwExitX, escapeY],
961
+ [bwEntryX, escapeY],
962
+ [bwEntryX, to[1]],
963
+ to
964
+ ]);
965
+ }
966
+ }
967
+ function calculateOrthogonalPath(from, to, nodeBoxes, sourceNodeId, targetNodeId, options) {
968
+ const cornerRadius = options?.cornerRadius ?? 10;
969
+ const padding = options?.padding ?? 15;
970
+ const stubLength = options?.stubLength ?? 20;
971
+ const stubSpacing = options?.stubSpacing ?? 12;
972
+ const maxStubLength = options?.maxStubLength ?? 80;
973
+ const fromPortIndex = options?.fromPortIndex ?? 0;
974
+ const toPortIndex = options?.toPortIndex ?? 0;
975
+ const exitStub = Math.min(stubLength + fromPortIndex * stubSpacing, maxStubLength);
976
+ const entryStub = Math.min(stubLength + toPortIndex * stubSpacing, maxStubLength);
977
+ const waypoints = computeWaypoints(
978
+ from,
979
+ to,
980
+ nodeBoxes,
981
+ sourceNodeId,
982
+ targetNodeId,
983
+ padding,
984
+ exitStub,
985
+ entryStub,
986
+ options?.scopedInternal,
987
+ options?.allocator
988
+ );
989
+ if (!waypoints) return null;
990
+ return waypointsToSvgPath(waypoints, cornerRadius);
991
+ }
992
+ function calculateOrthogonalPathSafe(from, to, nodeBoxes, sourceNodeId, targetNodeId, options) {
993
+ try {
994
+ const path = calculateOrthogonalPath(from, to, nodeBoxes, sourceNodeId, targetNodeId, options);
995
+ if (!path || path.length < 5) return null;
996
+ return path;
997
+ } catch {
998
+ return null;
999
+ }
1000
+ }
1001
+
1002
+ // src/diagram/graph/routing.ts
1003
+ var STUB_DISTANCE_THRESHOLD = 500;
1004
+ var STUB_LENGTH = 30;
1005
+ function computeConnectionPath(sx, sy, tx, ty) {
1006
+ return `M ${sx},${sy} L ${tx},${ty}`;
1007
+ }
1008
+ function collectExternalConnections(ast, diagramNodes, scopedChildren) {
1009
+ const pendingConnections = [];
1010
+ for (const conn of ast.connections) {
1011
+ if (conn.from.scope || conn.to.scope) continue;
1012
+ let fromNode = diagramNodes.get(conn.from.node);
1013
+ let toNode = diagramNodes.get(conn.to.node);
1014
+ if (!fromNode) {
1015
+ for (const node of diagramNodes.values()) {
1016
+ const child = node.scopeChildren?.find((c) => c.id === conn.from.node);
1017
+ if (child) {
1018
+ fromNode = child;
1019
+ break;
1020
+ }
1021
+ }
1022
+ }
1023
+ if (!toNode) {
1024
+ for (const node of diagramNodes.values()) {
1025
+ const child = node.scopeChildren?.find((c) => c.id === conn.to.node);
1026
+ if (child) {
1027
+ toNode = child;
1028
+ break;
1029
+ }
1030
+ }
1031
+ }
1032
+ if (!fromNode || !toNode) continue;
1033
+ const fromIsScoped = scopedChildren.has(conn.from.node);
1034
+ const toIsScoped = scopedChildren.has(conn.to.node);
1035
+ if (fromIsScoped && toIsScoped) continue;
1036
+ if (fromIsScoped && diagramNodes.has(conn.to.node) && findScopeParent(conn.from.node, diagramNodes) === conn.to.node) continue;
1037
+ if (toIsScoped && diagramNodes.has(conn.from.node) && findScopeParent(conn.to.node, diagramNodes) === conn.from.node) continue;
1038
+ const sourcePort = fromNode.outputs.find((p) => p.name === conn.from.port);
1039
+ const targetPort = toNode.inputs.find((p) => p.name === conn.to.port);
1040
+ if (!sourcePort || !targetPort) continue;
1041
+ const fromPortIndex = fromNode.outputs.indexOf(sourcePort);
1042
+ const toPortIndex = toNode.inputs.indexOf(targetPort);
1043
+ pendingConnections.push({
1044
+ fromNodeId: conn.from.node,
1045
+ fromPortName: conn.from.port,
1046
+ toNodeId: conn.to.node,
1047
+ toPortName: conn.to.port,
1048
+ sourcePort,
1049
+ targetPort,
1050
+ fromPortIndex,
1051
+ toPortIndex
1052
+ });
1053
+ }
1054
+ return pendingConnections;
1055
+ }
1056
+ function routeConnections(pendingConnections, nodes, theme) {
1057
+ const nodeBoxes = buildNodeBoxes(nodes);
1058
+ const allocator = new TrackAllocator();
1059
+ const connections = routeExternalConnections(pendingConnections, nodeBoxes, allocator, theme);
1060
+ routeScopeConnections(nodes, nodeBoxes, allocator);
1061
+ return connections;
1062
+ }
1063
+ function buildNodeBoxes(nodes) {
1064
+ const nodeBoxes = nodes.map((node) => ({
1065
+ id: node.id,
1066
+ x: node.x,
1067
+ y: node.y,
1068
+ width: node.width,
1069
+ height: node.height
1070
+ }));
1071
+ for (const node of nodes) {
1072
+ if (node.scopeChildren) {
1073
+ for (const child of node.scopeChildren) {
1074
+ nodeBoxes.push({ id: child.id, x: child.x, y: child.y, width: child.width, height: child.height });
1075
+ }
1076
+ }
1077
+ }
1078
+ return nodeBoxes;
1079
+ }
1080
+ function compareRoutingOrder(a, b) {
1081
+ const aSpan = Math.abs(a.targetPort.cx - a.sourcePort.cx);
1082
+ const bSpan = Math.abs(b.targetPort.cx - b.sourcePort.cx);
1083
+ if (Math.abs(aSpan - bSpan) > 1) return aSpan - bSpan;
1084
+ if (Math.abs(a.sourcePort.cx - b.sourcePort.cx) > 1) return a.sourcePort.cx - b.sourcePort.cx;
1085
+ return a.sourcePort.cy - b.sourcePort.cy;
1086
+ }
1087
+ function routeExternalConnections(pendingConnections, nodeBoxes, allocator, theme) {
1088
+ pendingConnections.sort(compareRoutingOrder);
1089
+ const connections = [];
1090
+ for (const pc of pendingConnections) {
1091
+ const sx = pc.sourcePort.cx;
1092
+ const sy = pc.sourcePort.cy;
1093
+ const tx = pc.targetPort.cx;
1094
+ const ty = pc.targetPort.cy;
1095
+ const sourceColor = getPortColor(pc.sourcePort.dataType, pc.sourcePort.isFailure, theme);
1096
+ const targetColor = getPortColor(pc.targetPort.dataType, pc.targetPort.isFailure, theme);
1097
+ const xDistance = Math.abs(tx - sx);
1098
+ const dashed = pc.sourcePort.dataType !== "STEP";
1099
+ const srcLabelEnd = portLabelExtent(pc.sourcePort);
1100
+ const tgtLabelEnd = portLabelExtent(pc.targetPort);
1101
+ const sourceStub = {
1102
+ x: sx + srcLabelEnd,
1103
+ y: sy,
1104
+ endX: sx + srcLabelEnd + STUB_LENGTH,
1105
+ labelOffset: srcLabelEnd,
1106
+ color: sourceColor,
1107
+ dashed
1108
+ };
1109
+ const targetStub = {
1110
+ x: tx - tgtLabelEnd,
1111
+ y: ty,
1112
+ endX: tx - tgtLabelEnd - STUB_LENGTH,
1113
+ labelOffset: tgtLabelEnd,
1114
+ color: targetColor,
1115
+ dashed
1116
+ };
1117
+ const pathSx = sx + srcLabelEnd;
1118
+ const pathTx = tx - tgtLabelEnd;
1119
+ let path;
1120
+ if (xDistance > STUB_DISTANCE_THRESHOLD) {
1121
+ path = "";
1122
+ } else {
1123
+ const orthoPath = calculateOrthogonalPathSafe(
1124
+ [pathSx, sy],
1125
+ [pathTx, ty],
1126
+ nodeBoxes,
1127
+ pc.fromNodeId,
1128
+ pc.toNodeId,
1129
+ { fromPortIndex: pc.fromPortIndex, toPortIndex: pc.toPortIndex, allocator }
1130
+ );
1131
+ path = orthoPath ?? computeConnectionPath(pathSx, sy, pathTx, ty);
1132
+ }
1133
+ connections.push({
1134
+ fromNode: pc.fromNodeId,
1135
+ fromPort: pc.fromPortName,
1136
+ toNode: pc.toNodeId,
1137
+ toPort: pc.toPortName,
1138
+ sourceColor,
1139
+ targetColor,
1140
+ isStepConnection: pc.sourcePort.dataType === "STEP",
1141
+ path,
1142
+ sourceStub,
1143
+ targetStub
1144
+ });
1145
+ }
1146
+ return connections;
1147
+ }
1148
+ function routeScopeConnections(nodes, nodeBoxes, allocator) {
1149
+ for (const node of nodes) {
1150
+ if (!node.scopeConnections || !node.scopePorts || !node.scopeChildren) continue;
1151
+ const childMap = /* @__PURE__ */ new Map();
1152
+ for (const c of node.scopeChildren) childMap.set(c.id, c);
1153
+ const scopePending = [];
1154
+ for (const conn of node.scopeConnections) {
1155
+ const sPort = findScopePort(conn.fromNode, conn.fromPort, node, childMap, "output");
1156
+ const tPort = findScopePort(conn.toNode, conn.toPort, node, childMap, "input");
1157
+ if (!sPort || !tPort) continue;
1158
+ let fromPortIndex = 0;
1159
+ let toPortIndex = 0;
1160
+ if (conn.fromNode === node.id) {
1161
+ fromPortIndex = node.scopePorts.outputs.indexOf(sPort);
1162
+ } else {
1163
+ const fromChild = childMap.get(conn.fromNode);
1164
+ if (fromChild) fromPortIndex = fromChild.outputs.indexOf(sPort);
1165
+ }
1166
+ if (conn.toNode === node.id) {
1167
+ toPortIndex = node.scopePorts.inputs.indexOf(tPort);
1168
+ } else {
1169
+ const toChild = childMap.get(conn.toNode);
1170
+ if (toChild) toPortIndex = toChild.inputs.indexOf(tPort);
1171
+ }
1172
+ scopePending.push({
1173
+ conn,
1174
+ sourcePort: sPort,
1175
+ targetPort: tPort,
1176
+ fromNodeId: conn.fromNode,
1177
+ toNodeId: conn.toNode,
1178
+ fromPortIndex: Math.max(0, fromPortIndex),
1179
+ toPortIndex: Math.max(0, toPortIndex)
1180
+ });
1181
+ }
1182
+ scopePending.sort(compareRoutingOrder);
1183
+ for (const sp of scopePending) {
1184
+ const sx = sp.sourcePort.cx;
1185
+ const sy = sp.sourcePort.cy;
1186
+ const tx = sp.targetPort.cx;
1187
+ const ty = sp.targetPort.cy;
1188
+ const orthoPath = calculateOrthogonalPathSafe(
1189
+ [sx, sy],
1190
+ [tx, ty],
1191
+ nodeBoxes,
1192
+ sp.fromNodeId,
1193
+ sp.toNodeId,
1194
+ { fromPortIndex: sp.fromPortIndex, toPortIndex: sp.toPortIndex, allocator }
1195
+ );
1196
+ sp.conn.path = orthoPath ?? computeConnectionPath(sx, sy, tx, ty);
1197
+ }
1198
+ }
1199
+ }
1200
+ function findScopePort(nodeId, portName, parentNode, childMap, side) {
1201
+ if (nodeId === parentNode.id) {
1202
+ const ports = side === "output" ? parentNode.scopePorts?.outputs : parentNode.scopePorts?.inputs;
1203
+ return ports?.find((p) => p.name === portName);
1204
+ }
1205
+ const child = childMap.get(nodeId);
1206
+ if (!child) return void 0;
1207
+ return side === "output" ? child.outputs.find((p) => p.name === portName) : child.inputs.find((p) => p.name === portName);
1208
+ }
1209
+ function findScopeParent(childId, diagramNodes) {
1210
+ for (const node of diagramNodes.values()) {
1211
+ if (node.scopeChildren?.some((c) => c.id === childId)) return node.id;
1212
+ }
1213
+ return void 0;
1214
+ }
1215
+
1216
+ // src/diagram/graph/scopes.ts
1217
+ var SCOPE_PADDING_X = 140;
1218
+ var SCOPE_PADDING_Y = 40;
1219
+ var SCOPE_PORT_COLUMN = 45;
1220
+ var SCOPE_INNER_GAP_X = 240;
1221
+ function collectScopes(ast) {
1222
+ const scopedChildren = /* @__PURE__ */ new Set();
1223
+ const allScopes = { ...ast.scopes ?? {} };
1224
+ if (ast.scopes) {
1225
+ for (const children of Object.values(ast.scopes)) {
1226
+ for (const child of children) scopedChildren.add(child);
1227
+ }
1228
+ }
1229
+ const inferredScopes = /* @__PURE__ */ new Map();
1230
+ for (const conn of ast.connections) {
1231
+ if (conn.from.scope) {
1232
+ const key = `${conn.from.node}.${conn.from.scope}`;
1233
+ if (!inferredScopes.has(key)) inferredScopes.set(key, /* @__PURE__ */ new Set());
1234
+ inferredScopes.get(key).add(conn.to.node);
1235
+ }
1236
+ if (conn.to.scope) {
1237
+ const key = `${conn.to.node}.${conn.to.scope}`;
1238
+ if (!inferredScopes.has(key)) inferredScopes.set(key, /* @__PURE__ */ new Set());
1239
+ inferredScopes.get(key).add(conn.from.node);
1240
+ }
1241
+ }
1242
+ for (const [key, childSet] of inferredScopes) {
1243
+ if (!allScopes[key]) {
1244
+ allScopes[key] = [...childSet];
1245
+ for (const child of childSet) scopedChildren.add(child);
1246
+ }
1247
+ }
1248
+ return { allScopes, scopedChildren };
1249
+ }
1250
+ function buildScopeSubGraphs(ast, diagramNodes, allScopes, nodeTypeMap, theme) {
1251
+ for (const [scopeKey, childIds] of Object.entries(allScopes)) {
1252
+ const dotIndex = scopeKey.indexOf(".");
1253
+ const parentId = scopeKey.substring(0, dotIndex);
1254
+ const scopeName = scopeKey.substring(dotIndex + 1);
1255
+ const parentNode = diagramNodes.get(parentId);
1256
+ if (!parentNode) continue;
1257
+ const parentInst = ast.instances.find((i) => i.id === parentId);
1258
+ if (!parentInst) continue;
1259
+ const parentNt = nodeTypeMap.get(parentInst.nodeType);
1260
+ if (!parentNt) continue;
1261
+ buildScopeSubGraph(parentNode, parentNt, scopeName, childIds, ast, nodeTypeMap, theme);
1262
+ }
1263
+ }
1264
+ function buildScopeSubGraph(parentNode, parentNt, scopeName, childIds, ast, nodeTypeMap, theme = "dark") {
1265
+ const childIdSet = new Set(childIds);
1266
+ const scopedOutputDefs = {};
1267
+ const scopedInputDefs = {};
1268
+ for (const [name, def] of Object.entries(parentNt.outputs)) {
1269
+ if (def.scope === scopeName) scopedOutputDefs[name] = def;
1270
+ }
1271
+ for (const [name, def] of Object.entries(parentNt.inputs)) {
1272
+ if (def.scope === scopeName) scopedInputDefs[name] = def;
1273
+ }
1274
+ for (const conn of ast.connections) {
1275
+ if (conn.from.node === parentNode.id && childIdSet.has(conn.to.node)) {
1276
+ const portName = conn.from.port;
1277
+ if (!scopedOutputDefs[portName]) {
1278
+ const parentDef = parentNt.outputs[portName];
1279
+ if (parentDef) {
1280
+ scopedOutputDefs[portName] = { ...parentDef, scope: scopeName };
1281
+ } else {
1282
+ const childInst = ast.instances.find((i) => i.id === conn.to.node);
1283
+ const childNt = childInst ? nodeTypeMap.get(childInst.nodeType) : void 0;
1284
+ const childInputDef = childNt?.inputs[conn.to.port];
1285
+ scopedOutputDefs[portName] = {
1286
+ dataType: childInputDef?.dataType ?? "ANY",
1287
+ scope: scopeName,
1288
+ label: childInputDef?.label ?? portName
1289
+ };
1290
+ }
1291
+ }
1292
+ }
1293
+ if (conn.to.node === parentNode.id && childIdSet.has(conn.from.node)) {
1294
+ const portName = conn.to.port;
1295
+ if (!scopedInputDefs[portName]) {
1296
+ const parentDef = parentNt.inputs[portName];
1297
+ if (parentDef) {
1298
+ scopedInputDefs[portName] = { ...parentDef, scope: scopeName };
1299
+ } else {
1300
+ const childInst = ast.instances.find((i) => i.id === conn.from.node);
1301
+ const childNt = childInst ? nodeTypeMap.get(childInst.nodeType) : void 0;
1302
+ const childOutputDef = childNt?.outputs[conn.from.port];
1303
+ scopedInputDefs[portName] = {
1304
+ dataType: childOutputDef?.dataType ?? "ANY",
1305
+ scope: scopeName,
1306
+ label: childOutputDef?.label ?? portName
1307
+ };
1308
+ }
1309
+ }
1310
+ }
1311
+ }
1312
+ if (!parentNt.expression) {
1313
+ if (!scopedOutputDefs[SCOPED_PORT_NAMES.START]) {
1314
+ scopedOutputDefs[SCOPED_PORT_NAMES.START] = { dataType: "STEP", scope: scopeName, label: "Execute" };
1315
+ }
1316
+ if (!scopedInputDefs[SCOPED_PORT_NAMES.SUCCESS]) {
1317
+ scopedInputDefs[SCOPED_PORT_NAMES.SUCCESS] = { dataType: "STEP", isControlFlow: true, scope: scopeName, label: "On Success" };
1318
+ }
1319
+ if (!scopedInputDefs[SCOPED_PORT_NAMES.FAILURE]) {
1320
+ scopedInputDefs[SCOPED_PORT_NAMES.FAILURE] = { dataType: "STEP", isControlFlow: true, scope: scopeName, failure: true, label: "On Failure" };
1321
+ }
1322
+ }
1323
+ parentNode.outputs = parentNode.outputs.filter((p) => !scopedOutputDefs[p.name]);
1324
+ parentNode.inputs = parentNode.inputs.filter((p) => !scopedInputDefs[p.name]);
1325
+ const scopeOutputPorts = orderedPorts(scopedOutputDefs, "OUTPUT");
1326
+ const scopeInputPorts = orderedPorts(scopedInputDefs, "INPUT");
1327
+ const children = [];
1328
+ for (const childId of childIds) {
1329
+ const childInst = ast.instances.find((i) => i.id === childId);
1330
+ if (!childInst) continue;
1331
+ const childNode = buildInstanceNode(childId, childInst.nodeType, childInst.config, nodeTypeMap, theme);
1332
+ computeNodeDimensions(childNode);
1333
+ if (childInst.config?.width != null) childNode.width = childInst.config.width;
1334
+ if (childInst.config?.height != null) childNode.height = childInst.config.height;
1335
+ children.push(childNode);
1336
+ }
1337
+ if (children.length === 0) return;
1338
+ let childX = 0;
1339
+ const maxChildHeight = Math.max(...children.map((c) => c.height + LABEL_HEIGHT + LABEL_GAP));
1340
+ for (const child of children) {
1341
+ child.x = childX;
1342
+ child.y = LABEL_HEIGHT + LABEL_GAP + (maxChildHeight - LABEL_HEIGHT - LABEL_GAP - child.height) / 2;
1343
+ childX += child.width + SCOPE_INNER_GAP_X;
1344
+ }
1345
+ const childrenWidth = childX > 0 ? childX - SCOPE_INNER_GAP_X : 0;
1346
+ const childrenHeight = maxChildHeight;
1347
+ const scopeOutPortsHeight = portsColumnHeight(scopeOutputPorts.length);
1348
+ const scopeInPortsHeight = portsColumnHeight(scopeInputPorts.length);
1349
+ const parentUI = ast.ui?.instances?.find((u) => u.name === parentNode.id);
1350
+ const uiWidth = parentUI?.expandedWidth ?? parentUI?.width;
1351
+ const uiHeight = parentUI?.expandedHeight ?? parentUI?.height;
1352
+ const maxLeftLabelExtent = scopeOutputPorts.length > 0 ? Math.max(...scopeOutputPorts.map(portLabelExtent)) : 0;
1353
+ const maxRightLabelExtent = scopeInputPorts.length > 0 ? Math.max(...scopeInputPorts.map(portLabelExtent)) : 0;
1354
+ const minInnerWidth = maxLeftLabelExtent + LABEL_CLEARANCE + maxRightLabelExtent;
1355
+ const contentWidth = Math.max(childrenWidth, minInnerWidth);
1356
+ const computedWidth = SCOPE_PORT_COLUMN + SCOPE_PADDING_X + contentWidth + SCOPE_PADDING_X + SCOPE_PORT_COLUMN;
1357
+ const computedHeight = SCOPE_PADDING_Y * 2 + Math.max(childrenHeight, scopeOutPortsHeight, scopeInPortsHeight);
1358
+ parentNode.width = Math.max(parentNode.width, uiWidth ?? computedWidth);
1359
+ parentNode.height = Math.max(parentNode.height, uiHeight ?? computedHeight);
1360
+ parentNode.scopeChildren = children;
1361
+ parentNode.scopePorts = { inputs: scopeInputPorts, outputs: scopeOutputPorts };
1362
+ parentNode.scopeConnections = [];
1363
+ }
1364
+ function finalizeScopePositions(parentNode, ast, theme = "dark") {
1365
+ const children = parentNode.scopeChildren;
1366
+ const scopePorts = parentNode.scopePorts;
1367
+ if (!children || children.length === 0 || !scopePorts) return;
1368
+ const innerLeft = parentNode.x + SCOPE_PORT_COLUMN + SCOPE_PADDING_X;
1369
+ const innerRight = parentNode.x + parentNode.width - SCOPE_PORT_COLUMN - SCOPE_PADDING_X;
1370
+ const innerWidth = innerRight - innerLeft;
1371
+ const lastChild = children[children.length - 1];
1372
+ const childrenBlockWidth = lastChild.x + lastChild.width;
1373
+ const centerOffsetX = innerLeft + (innerWidth - childrenBlockWidth) / 2;
1374
+ const scopeOriginY = parentNode.y + SCOPE_PADDING_Y;
1375
+ for (const child of children) {
1376
+ child.x += centerOffsetX;
1377
+ child.y += scopeOriginY;
1378
+ computePortPositions(child);
1379
+ }
1380
+ const leftEdgeX = parentNode.x + SCOPE_PORT_COLUMN;
1381
+ positionPortList(scopePorts.outputs, leftEdgeX, parentNode.y);
1382
+ const rightEdgeX = parentNode.x + parentNode.width - SCOPE_PORT_COLUMN;
1383
+ positionPortList(scopePorts.inputs, rightEdgeX, parentNode.y);
1384
+ const childNodeMap = /* @__PURE__ */ new Map();
1385
+ for (const child of children) childNodeMap.set(child.id, child);
1386
+ const childIdSet = new Set(children.map((c) => c.id));
1387
+ parentNode.scopeConnections = [];
1388
+ for (const conn of ast.connections) {
1389
+ const fromIsChild = childIdSet.has(conn.from.node);
1390
+ const toIsChild = childIdSet.has(conn.to.node);
1391
+ const fromIsParent = conn.from.node === parentNode.id;
1392
+ const toIsParent = conn.to.node === parentNode.id;
1393
+ if (!fromIsChild && !toIsChild) continue;
1394
+ if (fromIsParent && toIsChild) {
1395
+ const sourcePort = scopePorts.outputs.find((p) => p.name === conn.from.port);
1396
+ const targetChild = childNodeMap.get(conn.to.node);
1397
+ const targetPort = targetChild?.inputs.find((p) => p.name === conn.to.port);
1398
+ if (sourcePort && targetPort) {
1399
+ parentNode.scopeConnections.push(buildConnection(
1400
+ parentNode.id,
1401
+ conn.from.port,
1402
+ conn.to.node,
1403
+ conn.to.port,
1404
+ sourcePort,
1405
+ targetPort,
1406
+ theme
1407
+ ));
1408
+ }
1409
+ continue;
1410
+ }
1411
+ if (fromIsChild && toIsParent) {
1412
+ const sourceChild = childNodeMap.get(conn.from.node);
1413
+ const sourcePort = sourceChild?.outputs.find((p) => p.name === conn.from.port);
1414
+ const targetPort = scopePorts.inputs.find((p) => p.name === conn.to.port);
1415
+ if (sourcePort && targetPort) {
1416
+ parentNode.scopeConnections.push(buildConnection(
1417
+ conn.from.node,
1418
+ conn.from.port,
1419
+ parentNode.id,
1420
+ conn.to.port,
1421
+ sourcePort,
1422
+ targetPort,
1423
+ theme
1424
+ ));
1425
+ }
1426
+ continue;
1427
+ }
1428
+ if (fromIsChild && toIsChild) {
1429
+ const sourceChild = childNodeMap.get(conn.from.node);
1430
+ const targetChild = childNodeMap.get(conn.to.node);
1431
+ if (sourceChild && targetChild) {
1432
+ const sourcePort = sourceChild.outputs.find((p) => p.name === conn.from.port);
1433
+ const targetPort = targetChild.inputs.find((p) => p.name === conn.to.port);
1434
+ if (sourcePort && targetPort) {
1435
+ parentNode.scopeConnections.push(buildConnection(
1436
+ conn.from.node,
1437
+ conn.from.port,
1438
+ conn.to.node,
1439
+ conn.to.port,
1440
+ sourcePort,
1441
+ targetPort,
1442
+ theme
1443
+ ));
1444
+ }
1445
+ }
1446
+ continue;
1447
+ }
1448
+ }
1449
+ if (children.length > 0) {
1450
+ const connectedScopePorts = new Set(
1451
+ parentNode.scopeConnections.map(
1452
+ (c) => c.fromNode === parentNode.id ? `out:${c.fromPort}` : `in:${c.toPort}`
1453
+ ).filter((k) => k.startsWith("out:") || k.startsWith("in:"))
1454
+ );
1455
+ const firstChild = children[0];
1456
+ const lastChild2 = children[children.length - 1];
1457
+ const execScopePort = scopePorts.outputs.find((p) => isScopedStartPort(p.name));
1458
+ const execChildPort = firstChild.inputs.find((p) => isExecutePort(p.name));
1459
+ if (execScopePort && execChildPort && !connectedScopePorts.has(`out:${execScopePort.name}`)) {
1460
+ parentNode.scopeConnections.push(buildConnection(
1461
+ parentNode.id,
1462
+ execScopePort.name,
1463
+ firstChild.id,
1464
+ execChildPort.name,
1465
+ execScopePort,
1466
+ execChildPort,
1467
+ theme
1468
+ ));
1469
+ }
1470
+ const successScopePort = scopePorts.inputs.find((p) => isScopedSuccessPort(p.name));
1471
+ const successChildPort = lastChild2.outputs.find((p) => isSuccessPort(p.name));
1472
+ if (successScopePort && successChildPort && !connectedScopePorts.has(`in:${successScopePort.name}`)) {
1473
+ parentNode.scopeConnections.push(buildConnection(
1474
+ lastChild2.id,
1475
+ successChildPort.name,
1476
+ parentNode.id,
1477
+ successScopePort.name,
1478
+ successChildPort,
1479
+ successScopePort,
1480
+ theme
1481
+ ));
1482
+ }
1483
+ const failureScopePort = scopePorts.inputs.find((p) => isScopedFailurePort(p.name));
1484
+ const failureChildPort = lastChild2.outputs.find((p) => isFailurePort(p.name));
1485
+ if (failureScopePort && failureChildPort && !connectedScopePorts.has(`in:${failureScopePort.name}`)) {
1486
+ parentNode.scopeConnections.push(buildConnection(
1487
+ lastChild2.id,
1488
+ failureChildPort.name,
1489
+ parentNode.id,
1490
+ failureScopePort.name,
1491
+ failureChildPort,
1492
+ failureScopePort,
1493
+ theme
1494
+ ));
1495
+ }
1496
+ }
1497
+ }
1498
+ function buildConnection(fromNode, fromPort, toNode, toPort, sourcePort, targetPort, theme = "dark") {
1499
+ const sourceColor = getPortColor(sourcePort.dataType, sourcePort.isFailure, theme);
1500
+ const targetColor = getPortColor(targetPort.dataType, targetPort.isFailure, theme);
1501
+ const path = computeConnectionPath(sourcePort.cx, sourcePort.cy, targetPort.cx, targetPort.cy);
1502
+ return {
1503
+ fromNode,
1504
+ fromPort,
1505
+ toNode,
1506
+ toPort,
1507
+ sourceColor,
1508
+ targetColor,
1509
+ isStepConnection: sourcePort.dataType === "STEP",
1510
+ path
1511
+ };
1512
+ }
1513
+
1514
+ // src/diagram/geometry.ts
1515
+ function buildDiagramGraph(ast, options = {}) {
1516
+ const themeName = options.theme ?? "dark";
1517
+ const nodeTypeMap = buildNodeTypeMap(ast);
1518
+ const { allScopes, scopedChildren } = collectScopes(ast);
1519
+ const diagramNodes = /* @__PURE__ */ new Map();
1520
+ diagramNodes.set("Start", buildStartNode(ast));
1521
+ diagramNodes.set("Exit", buildExitNode(ast));
1522
+ const stepPortsUsed = collectWiredStepPorts(ast);
1523
+ for (const inst of ast.instances) {
1524
+ if (scopedChildren.has(inst.id)) continue;
1525
+ const node = buildInstanceNode(
1526
+ inst.id,
1527
+ inst.nodeType,
1528
+ inst.config,
1529
+ nodeTypeMap,
1530
+ themeName,
1531
+ stepPortsUsed.get(inst.id) ?? /* @__PURE__ */ new Set()
1532
+ );
1533
+ diagramNodes.set(inst.id, node);
1534
+ }
1535
+ for (const node of diagramNodes.values()) {
1536
+ computeNodeDimensions(node);
1537
+ }
1538
+ buildScopeSubGraphs(ast, diagramNodes, allScopes, nodeTypeMap, themeName);
1539
+ applySizeOverrides(ast, diagramNodes, scopedChildren);
1540
+ const { layers } = layoutWorkflow(ast);
1541
+ assignLayerCoordinates(layers, diagramNodes);
1542
+ resolvePostLayoutOverlaps(diagramNodes);
1543
+ for (const node of diagramNodes.values()) {
1544
+ computePortPositions(node);
1545
+ }
1546
+ for (const node of diagramNodes.values()) {
1547
+ if (node.scopeChildren) {
1548
+ finalizeScopePositions(node, ast, themeName);
1549
+ }
1550
+ }
1551
+ const pendingConnections = collectExternalConnections(ast, diagramNodes, scopedChildren);
1552
+ const nodes = Array.from(diagramNodes.values());
1553
+ const extent = normalizeNodes(nodes);
1554
+ const connections = routeConnections(pendingConnections, nodes, themeName);
1555
+ return {
1556
+ nodes,
1557
+ connections,
1558
+ bounds: graphBounds(extent, connections, nodes),
1559
+ workflowName: ast.name
1560
+ };
1561
+ }
1562
+
1563
+ // src/diagram/ascii-renderer.ts
1564
+ function groupByLayer(nodes) {
1565
+ if (nodes.length === 0) return [];
1566
+ const sorted = [...nodes].sort((a, b) => a.x - b.x);
1567
+ const layers = [];
1568
+ let currentX = sorted[0].x;
1569
+ let currentLayer = [];
1570
+ for (const node of sorted) {
1571
+ if (Math.abs(node.x - currentX) > 10) {
1572
+ layers.push(currentLayer);
1573
+ currentLayer = [];
1574
+ currentX = node.x;
1575
+ }
1576
+ currentLayer.push(node);
1577
+ }
1578
+ if (currentLayer.length > 0) layers.push(currentLayer);
1579
+ return layers;
1580
+ }
1581
+ function buildConnectedPorts(connections) {
1582
+ const s = /* @__PURE__ */ new Set();
1583
+ for (const c of connections) {
1584
+ s.add(`${c.fromNode}.${c.fromPort}`);
1585
+ s.add(`${c.toNode}.${c.toPort}`);
1586
+ }
1587
+ return s;
1588
+ }
1589
+ function portSymbol(nodeId, port, connected) {
1590
+ return connected.has(`${nodeId}.${port.name}`) ? "\u25CF" : "\u25CB";
1591
+ }
1592
+ function cornerChar(isStep, hDir, vDir) {
1593
+ if (hDir === "right" && vDir === "down") return isStep ? "\u2554" : "\u250C";
1594
+ if (hDir === "left" && vDir === "down") return isStep ? "\u2557" : "\u2510";
1595
+ if (hDir === "right" && vDir === "up") return isStep ? "\u255A" : "\u2514";
1596
+ if (hDir === "left" && vDir === "up") return isStep ? "\u255D" : "\u2518";
1597
+ return "\u253C";
1598
+ }
1599
+ var H_CHARS = new Set("\u2500\u2550");
1600
+ var V_CHARS = new Set("\u2502\u2551");
1601
+ var CharGrid = class {
1602
+ cells;
1603
+ width;
1604
+ height;
1605
+ constructor(w, h) {
1606
+ this.width = w;
1607
+ this.height = h;
1608
+ this.cells = new Array(w * h).fill(" ");
1609
+ }
1610
+ set(x, y, ch) {
1611
+ if (x < 0 || x >= this.width || y < 0 || y >= this.height) return;
1612
+ const existing = this.cells[y * this.width + x];
1613
+ if (existing !== " ") {
1614
+ if (H_CHARS.has(ch) && V_CHARS.has(existing) || V_CHARS.has(ch) && H_CHARS.has(existing)) {
1615
+ this.cells[y * this.width + x] = "\u253C";
1616
+ return;
1617
+ }
1618
+ if (H_CHARS.has(ch) && H_CHARS.has(existing) || V_CHARS.has(ch) && V_CHARS.has(existing)) {
1619
+ return;
1620
+ }
1621
+ }
1622
+ this.cells[y * this.width + x] = ch;
1623
+ }
1624
+ get(x, y) {
1625
+ if (x >= 0 && x < this.width && y >= 0 && y < this.height) {
1626
+ return this.cells[y * this.width + x];
1627
+ }
1628
+ return " ";
1629
+ }
1630
+ /** Force-write, ignoring collision logic (for boxes and text). */
1631
+ forceSet(x, y, ch) {
1632
+ if (x >= 0 && x < this.width && y >= 0 && y < this.height) {
1633
+ this.cells[y * this.width + x] = ch;
1634
+ }
1635
+ }
1636
+ writeStr(x, y, s) {
1637
+ for (let i = 0; i < s.length; i++) {
1638
+ this.forceSet(x + i, y, s[i]);
1639
+ }
1640
+ }
1641
+ toLines() {
1642
+ const lines = [];
1643
+ for (let y = 0; y < this.height; y++) {
1644
+ let line = "";
1645
+ for (let x = 0; x < this.width; x++) {
1646
+ line += this.cells[y * this.width + x];
1647
+ }
1648
+ lines.push(line.trimEnd());
1649
+ }
1650
+ while (lines.length > 0 && lines[lines.length - 1] === "") lines.pop();
1651
+ return lines;
1652
+ }
1653
+ };
1654
+ function mergePortRows(inputs, outputs) {
1655
+ const rows = [];
1656
+ const maxLen = Math.max(inputs.length, outputs.length);
1657
+ for (let i = 0; i < maxLen; i++) {
1658
+ rows.push({
1659
+ input: i < inputs.length ? inputs[i] : null,
1660
+ output: i < outputs.length ? outputs[i] : null
1661
+ });
1662
+ }
1663
+ return rows;
1664
+ }
1665
+ function measureBox(node) {
1666
+ const portRows = mergePortRows(node.inputs, node.outputs);
1667
+ const maxInputPortLen = node.inputs.length > 0 ? Math.max(...node.inputs.map((p) => p.name.length)) : 0;
1668
+ const maxOutputPortLen = node.outputs.length > 0 ? Math.max(...node.outputs.map((p) => p.name.length)) : 0;
1669
+ const portsContentWidth = (maxInputPortLen > 0 ? maxInputPortLen + 2 : 0) + 2 + (maxOutputPortLen > 0 ? maxOutputPortLen + 2 : 0);
1670
+ const innerWidth = Math.max(node.label.length + 2, portsContentWidth, 10);
1671
+ const boxWidth = innerWidth + 2;
1672
+ const headerRows = 3;
1673
+ const portRowCount = Math.max(portRows.length, 1);
1674
+ const boxHeight = headerRows + portRowCount + 1;
1675
+ const portRowOffsets = /* @__PURE__ */ new Map();
1676
+ for (let i = 0; i < portRows.length; i++) {
1677
+ if (portRows[i].input) portRowOffsets.set(portRows[i].input.name, headerRows + i);
1678
+ if (portRows[i].output) portRowOffsets.set(portRows[i].output.name, headerRows + i);
1679
+ }
1680
+ return { node, innerWidth, boxWidth, portRows, boxHeight, portRowOffsets };
1681
+ }
1682
+ function drawBox(grid, box, bx, by, connected) {
1683
+ const { innerWidth, portRows, node } = box;
1684
+ grid.forceSet(bx, by, "\u250C");
1685
+ for (let i = 0; i < innerWidth; i++) grid.forceSet(bx + 1 + i, by, "\u2500");
1686
+ grid.forceSet(bx + innerWidth + 1, by, "\u2510");
1687
+ const labelPad = innerWidth - node.label.length;
1688
+ const padL = Math.floor(labelPad / 2);
1689
+ grid.forceSet(bx, by + 1, "\u2502");
1690
+ grid.writeStr(bx + 1 + padL, by + 1, node.label);
1691
+ grid.forceSet(bx + innerWidth + 1, by + 1, "\u2502");
1692
+ grid.forceSet(bx, by + 2, "\u251C");
1693
+ for (let i = 0; i < innerWidth; i++) grid.forceSet(bx + 1 + i, by + 2, "\u2500");
1694
+ grid.forceSet(bx + innerWidth + 1, by + 2, "\u2524");
1695
+ for (let i = 0; i < Math.max(portRows.length, 1); i++) {
1696
+ const ry = by + 3 + i;
1697
+ grid.forceSet(bx, ry, "\u2502");
1698
+ grid.forceSet(bx + innerWidth + 1, ry, "\u2502");
1699
+ if (i < portRows.length) {
1700
+ const row = portRows[i];
1701
+ if (row.input) {
1702
+ grid.writeStr(bx + 1, ry, `${portSymbol(node.id, row.input, connected)} ${row.input.name}`);
1703
+ }
1704
+ if (row.output) {
1705
+ const txt = `${row.output.name} ${portSymbol(node.id, row.output, connected)}`;
1706
+ grid.writeStr(bx + innerWidth + 1 - txt.length, ry, txt);
1707
+ }
1708
+ }
1709
+ }
1710
+ const bottomY = by + box.boxHeight - 1;
1711
+ grid.forceSet(bx, bottomY, "\u2514");
1712
+ for (let i = 0; i < innerWidth; i++) grid.forceSet(bx + 1 + i, bottomY, "\u2500");
1713
+ grid.forceSet(bx + innerWidth + 1, bottomY, "\u2518");
1714
+ }
1715
+ function renderASCII(graph) {
1716
+ const layers = groupByLayer(graph.nodes);
1717
+ if (layers.length === 0) return `${graph.workflowName}
1718
+ (empty workflow)`;
1719
+ const layerBoxes = layers.map((layer) => layer.map(measureBox));
1720
+ const colWidths = layerBoxes.map((boxes) => Math.max(...boxes.map((b) => b.boxWidth)));
1721
+ const wireGap = 14;
1722
+ const colX = [];
1723
+ let cx = 1;
1724
+ for (let c = 0; c < layerBoxes.length; c++) {
1725
+ colX.push(cx);
1726
+ cx += colWidths[c] + wireGap;
1727
+ }
1728
+ const gridWidth = cx + 1;
1729
+ const nodeColMap = /* @__PURE__ */ new Map();
1730
+ for (let c = 0; c < layerBoxes.length; c++) {
1731
+ for (const box of layerBoxes[c]) nodeColMap.set(box.node.id, c);
1732
+ }
1733
+ let spanCount = 0;
1734
+ for (const conn of graph.connections) {
1735
+ const fc = nodeColMap.get(conn.fromNode);
1736
+ const tc = nodeColMap.get(conn.toNode);
1737
+ if (fc !== void 0 && tc !== void 0 && Math.abs(tc - fc) > 1) spanCount++;
1738
+ }
1739
+ const highwayMargin = spanCount > 0 ? spanCount + 1 : 0;
1740
+ const nodeGapY = 2;
1741
+ const boxPositions = /* @__PURE__ */ new Map();
1742
+ const boxStartY = 3 + highwayMargin;
1743
+ let maxGridHeight = 0;
1744
+ for (let c = 0; c < layerBoxes.length; c++) {
1745
+ let y = boxStartY;
1746
+ for (const box of layerBoxes[c]) {
1747
+ boxPositions.set(box.node.id, { col: c, bx: colX[c], by: y, box });
1748
+ y += box.boxHeight + nodeGapY;
1749
+ }
1750
+ if (y > maxGridHeight) maxGridHeight = y;
1751
+ }
1752
+ maxGridHeight += highwayMargin + 3;
1753
+ const connected = buildConnectedPorts(graph.connections);
1754
+ const grid = new CharGrid(gridWidth, maxGridHeight);
1755
+ const titleX = Math.max(0, Math.floor((gridWidth - graph.workflowName.length) / 2));
1756
+ grid.writeStr(titleX, 1, graph.workflowName);
1757
+ for (const pos of boxPositions.values()) {
1758
+ drawBox(grid, pos.box, pos.bx, pos.by, connected);
1759
+ }
1760
+ drawConnections(grid, graph.connections, boxPositions, boxStartY, maxGridHeight);
1761
+ const scopeLines = [];
1762
+ for (const node of graph.nodes) {
1763
+ if (node.scopeChildren && node.scopeChildren.length > 0) {
1764
+ scopeLines.push("");
1765
+ scopeLines.push(` Scope [${node.label}]:`);
1766
+ if (node.scopeConnections) {
1767
+ for (const sc of node.scopeConnections) {
1768
+ const arrow = sc.isStepConnection ? "\u2550\u2550\u25B6" : "\u2500\u2500\u25B6";
1769
+ scopeLines.push(` ${sc.fromNode}.${sc.fromPort} ${arrow} ${sc.toNode}.${sc.toPort}${sc.isStepConnection ? " STEP" : ""}`);
1770
+ }
1771
+ }
1772
+ }
1773
+ }
1774
+ const lines = grid.toLines();
1775
+ lines.push(...scopeLines);
1776
+ lines.push("");
1777
+ lines.push(" \u25CF connected \u25CB not connected \u2550\u2550\u25B6 STEP \u2500\u2500\u25B6 DATA");
1778
+ return lines.join("\n");
1779
+ }
1780
+ function drawConnections(grid, connections, positions, _boxAreaTop, _gridHeight) {
1781
+ let globalMinY = Infinity;
1782
+ let globalMaxY = 0;
1783
+ for (const pos of positions.values()) {
1784
+ globalMinY = Math.min(globalMinY, pos.by);
1785
+ globalMaxY = Math.max(globalMaxY, pos.by + pos.box.boxHeight);
1786
+ }
1787
+ const sorted = [...connections].sort((a, b) => {
1788
+ const fa = positions.get(a.fromNode);
1789
+ const ta = positions.get(a.toNode);
1790
+ const fb = positions.get(b.fromNode);
1791
+ const tb = positions.get(b.toNode);
1792
+ if (!fa || !ta || !fb || !tb) return 0;
1793
+ const spanA = Math.abs(ta.col - fa.col);
1794
+ const spanB = Math.abs(tb.col - fb.col);
1795
+ if (spanA !== spanB) return spanA - spanB;
1796
+ const ya = fa.by + (fa.box.portRowOffsets.get(a.fromPort) ?? 0);
1797
+ const yb = fb.by + (fb.box.portRowOffsets.get(b.fromPort) ?? 0);
1798
+ return ya - yb;
1799
+ });
1800
+ const usedTracks = /* @__PURE__ */ new Map();
1801
+ let nextAboveHighway = globalMinY - 2;
1802
+ let nextBelowHighway = globalMaxY + 1;
1803
+ for (const conn of sorted) {
1804
+ const fromPos = positions.get(conn.fromNode);
1805
+ const toPos = positions.get(conn.toNode);
1806
+ if (!fromPos || !toPos) continue;
1807
+ const fromRowOff = fromPos.box.portRowOffsets.get(conn.fromPort);
1808
+ const toRowOff = toPos.box.portRowOffsets.get(conn.toPort);
1809
+ if (fromRowOff === void 0 || toRowOff === void 0) continue;
1810
+ const y1 = fromPos.by + fromRowOff;
1811
+ const y2 = toPos.by + toRowOff;
1812
+ const x1 = fromPos.bx + fromPos.box.boxWidth;
1813
+ const x2 = toPos.bx - 1;
1814
+ const isStep = conn.isStepConnection;
1815
+ const hCh = isStep ? "\u2550" : "\u2500";
1816
+ const vCh = isStep ? "\u2551" : "\u2502";
1817
+ const isAdjacent = toPos.col === fromPos.col + 1;
1818
+ if (isAdjacent) {
1819
+ drawAdjacentRoute(grid, x1, y1, x2, y2, hCh, vCh, isStep, usedTracks, fromPos, toPos);
1820
+ } else {
1821
+ const avgY = (y1 + y2) / 2;
1822
+ const midBoxY = (globalMinY + globalMaxY) / 2;
1823
+ let highwayY;
1824
+ if (avgY <= midBoxY) {
1825
+ highwayY = nextAboveHighway;
1826
+ nextAboveHighway--;
1827
+ } else {
1828
+ highwayY = nextBelowHighway;
1829
+ nextBelowHighway++;
1830
+ }
1831
+ drawSpanningRoute(grid, x1, y1, x2, y2, highwayY, hCh, vCh, isStep, usedTracks, fromPos, toPos);
1832
+ }
1833
+ }
1834
+ }
1835
+ function drawAdjacentRoute(grid, x1, y1, x2, y2, hCh, vCh, isStep, usedTracks, fromPos, toPos) {
1836
+ if (y1 === y2) {
1837
+ for (let x = x1; x < x2; x++) grid.set(x, y1, hCh);
1838
+ grid.set(x2, y1, "\u25B6");
1839
+ return;
1840
+ }
1841
+ const gapStart = fromPos.bx + fromPos.box.boxWidth + 1;
1842
+ const gapEnd = toPos.bx - 2;
1843
+ const midX = findTrack(usedTracks, gapStart, gapEnd, y1, y2);
1844
+ markTrack(usedTracks, midX, y1, y2);
1845
+ for (let x = x1; x < midX; x++) grid.set(x, y1, hCh);
1846
+ grid.set(midX, y1, cornerChar(isStep, "left", y2 > y1 ? "down" : "up"));
1847
+ drawVerticalSegment(grid, midX, y1, y2, vCh);
1848
+ grid.set(midX, y2, cornerChar(isStep, "right", y2 > y1 ? "up" : "down"));
1849
+ for (let x = midX + 1; x < x2; x++) grid.set(x, y2, hCh);
1850
+ grid.set(x2, y2, "\u25B6");
1851
+ }
1852
+ function drawSpanningRoute(grid, x1, y1, x2, y2, highwayY, hCh, vCh, isStep, usedTracks, fromPos, toPos) {
1853
+ const srcGapStart = fromPos.bx + fromPos.box.boxWidth + 1;
1854
+ const srcGapEnd = srcGapStart + 10;
1855
+ const srcMidX = findTrack(usedTracks, srcGapStart, srcGapEnd, y1, highwayY);
1856
+ markTrack(usedTracks, srcMidX, y1, highwayY);
1857
+ const tgtGapEnd = toPos.bx - 2;
1858
+ const tgtGapStart = tgtGapEnd - 10;
1859
+ const tgtMidX = findTrack(usedTracks, tgtGapStart, tgtGapEnd, highwayY, y2);
1860
+ markTrack(usedTracks, tgtMidX, highwayY, y2);
1861
+ const goingDown = highwayY > y1;
1862
+ const goingUp = y2 < highwayY;
1863
+ for (let x = x1; x < srcMidX; x++) grid.set(x, y1, hCh);
1864
+ grid.set(srcMidX, y1, cornerChar(isStep, "left", goingDown ? "down" : "up"));
1865
+ drawVerticalSegment(grid, srcMidX, y1, highwayY, vCh);
1866
+ grid.set(srcMidX, highwayY, cornerChar(isStep, "right", goingDown ? "up" : "down"));
1867
+ for (let x = srcMidX + 1; x < tgtMidX; x++) grid.set(x, highwayY, hCh);
1868
+ grid.set(tgtMidX, highwayY, cornerChar(isStep, "left", goingUp ? "up" : "down"));
1869
+ drawVerticalSegment(grid, tgtMidX, highwayY, y2, vCh);
1870
+ grid.set(tgtMidX, y2, cornerChar(isStep, "right", goingUp ? "down" : "up"));
1871
+ for (let x = tgtMidX + 1; x < x2; x++) grid.set(x, y2, hCh);
1872
+ grid.set(x2, y2, "\u25B6");
1873
+ }
1874
+ function drawVerticalSegment(grid, x, y1, y2, vCh) {
1875
+ const minY = Math.min(y1, y2);
1876
+ const maxY = Math.max(y1, y2);
1877
+ for (let y = minY + 1; y < maxY; y++) {
1878
+ grid.set(x, y, vCh);
1879
+ }
1880
+ }
1881
+ function findTrack(usedTracks, gapStart, gapEnd, y1, y2) {
1882
+ const minY = Math.min(y1, y2);
1883
+ const maxY = Math.max(y1, y2);
1884
+ const actualStart = Math.min(gapStart, gapEnd);
1885
+ const actualEnd = Math.max(gapStart, gapEnd);
1886
+ const mid = Math.floor((actualStart + actualEnd) / 2);
1887
+ for (let offset = 0; offset <= actualEnd - actualStart; offset++) {
1888
+ for (const candidate of [mid + offset, mid - offset]) {
1889
+ if (candidate < actualStart || candidate > actualEnd) continue;
1890
+ const existing = usedTracks.get(candidate);
1891
+ if (!existing) return candidate;
1892
+ let conflict = false;
1893
+ for (let y = minY; y <= maxY; y++) {
1894
+ if (existing.has(y)) {
1895
+ conflict = true;
1896
+ break;
1897
+ }
1898
+ }
1899
+ if (!conflict) return candidate;
1900
+ }
1901
+ }
1902
+ return mid;
1903
+ }
1904
+ function markTrack(usedTracks, x, y1, y2) {
1905
+ if (!usedTracks.has(x)) usedTracks.set(x, /* @__PURE__ */ new Set());
1906
+ const s = usedTracks.get(x);
1907
+ const minY = Math.min(y1, y2);
1908
+ const maxY = Math.max(y1, y2);
1909
+ for (let y = minY; y <= maxY; y++) s.add(y);
1910
+ }
1911
+ function renderASCIICompact(graph) {
1912
+ const layers = groupByLayer(graph.nodes);
1913
+ if (layers.length === 0) return `${graph.workflowName}
1914
+ (empty workflow)`;
1915
+ const outputLines = [];
1916
+ outputLines.push(graph.workflowName);
1917
+ outputLines.push("");
1918
+ const mainChain = [];
1919
+ const parallelNodes = [];
1920
+ for (const layer of layers) {
1921
+ mainChain.push(layer[0]);
1922
+ for (let i = 1; i < layer.length; i++) parallelNodes.push(layer[i]);
1923
+ }
1924
+ const topParts = [];
1925
+ const midParts = [];
1926
+ const botParts = [];
1927
+ for (let i = 0; i < mainChain.length; i++) {
1928
+ const node = mainChain[i];
1929
+ const innerWidth = Math.max(node.label.length + 2, 5);
1930
+ const padLeft = Math.floor((innerWidth - node.label.length) / 2);
1931
+ const padRight = innerWidth - node.label.length - padLeft;
1932
+ topParts.push("\u250C" + "\u2500".repeat(innerWidth) + "\u2510");
1933
+ midParts.push("\u2502" + " ".repeat(padLeft) + node.label + " ".repeat(padRight) + "\u2502");
1934
+ botParts.push("\u2514" + "\u2500".repeat(innerWidth) + "\u2518");
1935
+ if (i < mainChain.length - 1) {
1936
+ topParts.push(" ");
1937
+ midParts.push("\u2501\u2501\u2501\u25B6");
1938
+ botParts.push(" ");
1939
+ }
1940
+ }
1941
+ outputLines.push(" " + topParts.join(""));
1942
+ outputLines.push(" " + midParts.join(""));
1943
+ outputLines.push(" " + botParts.join(""));
1944
+ if (parallelNodes.length > 0) {
1945
+ outputLines.push("");
1946
+ outputLines.push(" Parallel: " + parallelNodes.map((n) => n.label).join(", "));
1947
+ }
1948
+ for (const node of graph.nodes) {
1949
+ if (node.scopeChildren && node.scopeChildren.length > 0) {
1950
+ outputLines.push("");
1951
+ outputLines.push(` Scope [${node.label}]: ` + node.scopeChildren.map((c) => c.label).join(" \u2501\u25B6 "));
1952
+ }
1953
+ }
1954
+ return outputLines.join("\n");
1955
+ }
1956
+ function renderText(graph) {
1957
+ const lines = [];
1958
+ const connected = buildConnectedPorts(graph.connections);
1959
+ lines.push(graph.workflowName);
1960
+ lines.push("\u2550".repeat(graph.workflowName.length));
1961
+ lines.push("");
1962
+ lines.push("Nodes:");
1963
+ const maxLabelLen = Math.max(...graph.nodes.map((n) => n.label.length), 5);
1964
+ for (const node of graph.nodes) {
1965
+ const label = node.label.padEnd(maxLabelLen);
1966
+ const inputPorts = node.inputs.map((p) => `${p.name}${portSymbol(node.id, p, connected)}`);
1967
+ const outputPorts = node.outputs.map((p) => `${p.name}${portSymbol(node.id, p, connected)}`);
1968
+ const inputStr = inputPorts.length > 0 ? `[${inputPorts.join(", ")}]` : "";
1969
+ const outputStr = outputPorts.length > 0 ? `[${outputPorts.join(", ")}]` : "";
1970
+ if (inputStr && outputStr) {
1971
+ lines.push(` ${label} ${inputStr} \u2192 ${outputStr}`);
1972
+ } else if (outputStr) {
1973
+ lines.push(` ${label} ${outputStr}`);
1974
+ } else if (inputStr) {
1975
+ lines.push(` ${label} ${inputStr}`);
1976
+ } else {
1977
+ lines.push(` ${label}`);
1978
+ }
1979
+ if (node.scopeChildren && node.scopeChildren.length > 0) {
1980
+ lines.push(` ${" ".repeat(maxLabelLen)} scope: ${node.scopeChildren.map((c) => c.label).join(", ")}`);
1981
+ }
1982
+ }
1983
+ if (graph.connections.length > 0) {
1984
+ lines.push("");
1985
+ lines.push("Connections:");
1986
+ const maxFromLen = Math.max(...graph.connections.map((c) => `${c.fromNode}.${c.fromPort}`.length));
1987
+ for (const conn of graph.connections) {
1988
+ const from = `${conn.fromNode}.${conn.fromPort}`.padEnd(maxFromLen);
1989
+ const arrow = conn.isStepConnection ? "\u2501\u2501\u25B6" : "\u2500\u2500\u25B6";
1990
+ const to = `${conn.toNode}.${conn.toPort}`;
1991
+ const type = conn.isStepConnection ? "STEP" : "";
1992
+ lines.push(` ${from} ${arrow} ${to}${type ? " " + type : ""}`);
1993
+ }
1994
+ }
1995
+ return lines.join("\n");
1996
+ }
1997
+
1998
+ export {
1999
+ buildDiagramGraph,
2000
+ renderASCII,
2001
+ renderASCIICompact,
2002
+ renderText
2003
+ };