@synergenius/flow-weaver 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/LICENSE +122 -0
  2. package/README.md +315 -0
  3. package/dist/annotation-generator.d.ts +45 -0
  4. package/dist/annotation-generator.js +557 -0
  5. package/dist/api/builder.d.ts +223 -0
  6. package/dist/api/builder.js +345 -0
  7. package/dist/api/compile.d.ts +92 -0
  8. package/dist/api/compile.js +149 -0
  9. package/dist/api/extract-types.d.ts +29 -0
  10. package/dist/api/extract-types.js +57 -0
  11. package/dist/api/generate-in-place.d.ts +73 -0
  12. package/dist/api/generate-in-place.js +1353 -0
  13. package/dist/api/generate.d.ts +83 -0
  14. package/dist/api/generate.js +510 -0
  15. package/dist/api/helpers.d.ts +248 -0
  16. package/dist/api/helpers.js +285 -0
  17. package/dist/api/index.d.ts +46 -0
  18. package/dist/api/index.js +45 -0
  19. package/dist/api/inline-runtime.d.ts +27 -0
  20. package/dist/api/inline-runtime.js +551 -0
  21. package/dist/api/manipulation/connections.d.ts +79 -0
  22. package/dist/api/manipulation/connections.js +151 -0
  23. package/dist/api/manipulation/index.d.ts +34 -0
  24. package/dist/api/manipulation/index.js +41 -0
  25. package/dist/api/manipulation/node-types.d.ts +123 -0
  26. package/dist/api/manipulation/node-types.js +200 -0
  27. package/dist/api/manipulation/nodes.d.ts +144 -0
  28. package/dist/api/manipulation/nodes.js +333 -0
  29. package/dist/api/manipulation/ports.d.ts +59 -0
  30. package/dist/api/manipulation/ports.js +228 -0
  31. package/dist/api/manipulation/scopes.d.ts +52 -0
  32. package/dist/api/manipulation/scopes.js +156 -0
  33. package/dist/api/manipulation/validation.d.ts +6 -0
  34. package/dist/api/manipulation/validation.js +6 -0
  35. package/dist/api/manipulation/workflow.d.ts +81 -0
  36. package/dist/api/manipulation/workflow.js +116 -0
  37. package/dist/api/manipulation.d.ts +8 -0
  38. package/dist/api/manipulation.js +8 -0
  39. package/dist/api/parse.d.ts +48 -0
  40. package/dist/api/parse.js +110 -0
  41. package/dist/api/patterns.d.ts +112 -0
  42. package/dist/api/patterns.js +306 -0
  43. package/dist/api/query.d.ts +429 -0
  44. package/dist/api/query.js +816 -0
  45. package/dist/api/templates.d.ts +98 -0
  46. package/dist/api/templates.js +117 -0
  47. package/dist/api/transform.d.ts +31 -0
  48. package/dist/api/transform.js +40 -0
  49. package/dist/api/validate.d.ts +25 -0
  50. package/dist/api/validate.js +39 -0
  51. package/dist/api/workflow-file-operations.d.ts +29 -0
  52. package/dist/api/workflow-file-operations.js +180 -0
  53. package/dist/ast/builder.d.ts +210 -0
  54. package/dist/ast/builder.js +395 -0
  55. package/dist/ast/index.d.ts +5 -0
  56. package/dist/ast/index.js +5 -0
  57. package/dist/ast/serialization-node.d.ts +6 -0
  58. package/dist/ast/serialization-node.js +30 -0
  59. package/dist/ast/serialization.d.ts +43 -0
  60. package/dist/ast/serialization.js +134 -0
  61. package/dist/ast/types.d.ts +852 -0
  62. package/dist/ast/types.js +2 -0
  63. package/dist/ast/workflow-utils.d.ts +54 -0
  64. package/dist/ast/workflow-utils.js +114 -0
  65. package/dist/body-generator.d.ts +31 -0
  66. package/dist/body-generator.js +35 -0
  67. package/dist/built-in-nodes/delay.d.ts +11 -0
  68. package/dist/built-in-nodes/delay.js +29 -0
  69. package/dist/built-in-nodes/index.d.ts +5 -0
  70. package/dist/built-in-nodes/index.js +4 -0
  71. package/dist/built-in-nodes/invoke-workflow.d.ts +13 -0
  72. package/dist/built-in-nodes/invoke-workflow.js +25 -0
  73. package/dist/built-in-nodes/mock-types.d.ts +18 -0
  74. package/dist/built-in-nodes/mock-types.js +12 -0
  75. package/dist/built-in-nodes/wait-for-event.d.ts +13 -0
  76. package/dist/built-in-nodes/wait-for-event.js +25 -0
  77. package/dist/chevrotain-parser/connect-parser.d.ts +24 -0
  78. package/dist/chevrotain-parser/connect-parser.js +98 -0
  79. package/dist/chevrotain-parser/grammar-diagrams.d.ts +29 -0
  80. package/dist/chevrotain-parser/grammar-diagrams.js +264 -0
  81. package/dist/chevrotain-parser/index.d.ts +25 -0
  82. package/dist/chevrotain-parser/index.js +27 -0
  83. package/dist/chevrotain-parser/map-parser.d.ts +33 -0
  84. package/dist/chevrotain-parser/map-parser.js +130 -0
  85. package/dist/chevrotain-parser/node-parser.d.ts +36 -0
  86. package/dist/chevrotain-parser/node-parser.js +466 -0
  87. package/dist/chevrotain-parser/path-parser.d.ts +28 -0
  88. package/dist/chevrotain-parser/path-parser.js +118 -0
  89. package/dist/chevrotain-parser/port-parser.d.ts +36 -0
  90. package/dist/chevrotain-parser/port-parser.js +442 -0
  91. package/dist/chevrotain-parser/position-parser.d.ts +20 -0
  92. package/dist/chevrotain-parser/position-parser.js +83 -0
  93. package/dist/chevrotain-parser/scope-parser.d.ts +19 -0
  94. package/dist/chevrotain-parser/scope-parser.js +104 -0
  95. package/dist/chevrotain-parser/tokens.d.ts +78 -0
  96. package/dist/chevrotain-parser/tokens.js +384 -0
  97. package/dist/chevrotain-parser/trigger-cancel-parser.d.ts +50 -0
  98. package/dist/chevrotain-parser/trigger-cancel-parser.js +282 -0
  99. package/dist/cli/commands/changelog.d.ts +13 -0
  100. package/dist/cli/commands/changelog.js +135 -0
  101. package/dist/cli/commands/compile.d.ts +64 -0
  102. package/dist/cli/commands/compile.js +278 -0
  103. package/dist/cli/commands/create.d.ts +33 -0
  104. package/dist/cli/commands/create.js +147 -0
  105. package/dist/cli/commands/describe.d.ts +68 -0
  106. package/dist/cli/commands/describe.js +377 -0
  107. package/dist/cli/commands/dev.d.ts +32 -0
  108. package/dist/cli/commands/dev.js +384 -0
  109. package/dist/cli/commands/diagram.d.ts +13 -0
  110. package/dist/cli/commands/diagram.js +33 -0
  111. package/dist/cli/commands/diff.d.ts +11 -0
  112. package/dist/cli/commands/diff.js +59 -0
  113. package/dist/cli/commands/doctor.d.ts +57 -0
  114. package/dist/cli/commands/doctor.js +719 -0
  115. package/dist/cli/commands/export.d.ts +57 -0
  116. package/dist/cli/commands/export.js +163 -0
  117. package/dist/cli/commands/grammar.d.ts +9 -0
  118. package/dist/cli/commands/grammar.js +39 -0
  119. package/dist/cli/commands/init.d.ts +59 -0
  120. package/dist/cli/commands/init.js +435 -0
  121. package/dist/cli/commands/listen.d.ts +16 -0
  122. package/dist/cli/commands/listen.js +39 -0
  123. package/dist/cli/commands/market.d.ts +52 -0
  124. package/dist/cli/commands/market.js +436 -0
  125. package/dist/cli/commands/migrate.d.ts +13 -0
  126. package/dist/cli/commands/migrate.js +89 -0
  127. package/dist/cli/commands/openapi.d.ts +37 -0
  128. package/dist/cli/commands/openapi.js +67 -0
  129. package/dist/cli/commands/pattern.d.ts +34 -0
  130. package/dist/cli/commands/pattern.js +185 -0
  131. package/dist/cli/commands/plugin.d.ts +16 -0
  132. package/dist/cli/commands/plugin.js +176 -0
  133. package/dist/cli/commands/run.d.ts +49 -0
  134. package/dist/cli/commands/run.js +191 -0
  135. package/dist/cli/commands/serve.d.ts +45 -0
  136. package/dist/cli/commands/serve.js +81 -0
  137. package/dist/cli/commands/templates.d.ts +8 -0
  138. package/dist/cli/commands/templates.js +54 -0
  139. package/dist/cli/commands/ui.d.ts +16 -0
  140. package/dist/cli/commands/ui.js +130 -0
  141. package/dist/cli/commands/validate.d.ts +12 -0
  142. package/dist/cli/commands/validate.js +247 -0
  143. package/dist/cli/commands/watch.d.ts +9 -0
  144. package/dist/cli/commands/watch.js +70 -0
  145. package/dist/cli/flow-weaver.mjs +92924 -0
  146. package/dist/cli/index.d.ts +9 -0
  147. package/dist/cli/index.js +742 -0
  148. package/dist/cli/templates/ai/mock-provider.d.ts +7 -0
  149. package/dist/cli/templates/ai/mock-provider.js +64 -0
  150. package/dist/cli/templates/ai/types.d.ts +47 -0
  151. package/dist/cli/templates/ai/types.js +5 -0
  152. package/dist/cli/templates/approvals/index.d.ts +15 -0
  153. package/dist/cli/templates/approvals/index.js +241 -0
  154. package/dist/cli/templates/index.d.ts +102 -0
  155. package/dist/cli/templates/index.js +101 -0
  156. package/dist/cli/templates/nodes/agent-router.d.ts +3 -0
  157. package/dist/cli/templates/nodes/agent-router.js +114 -0
  158. package/dist/cli/templates/nodes/aggregator.d.ts +7 -0
  159. package/dist/cli/templates/nodes/aggregator.js +63 -0
  160. package/dist/cli/templates/nodes/conversation-memory.d.ts +3 -0
  161. package/dist/cli/templates/nodes/conversation-memory.js +85 -0
  162. package/dist/cli/templates/nodes/http.d.ts +7 -0
  163. package/dist/cli/templates/nodes/http.js +80 -0
  164. package/dist/cli/templates/nodes/human-approval.d.ts +3 -0
  165. package/dist/cli/templates/nodes/human-approval.js +110 -0
  166. package/dist/cli/templates/nodes/json-extractor.d.ts +3 -0
  167. package/dist/cli/templates/nodes/json-extractor.js +119 -0
  168. package/dist/cli/templates/nodes/llm-call.d.ts +3 -0
  169. package/dist/cli/templates/nodes/llm-call.js +106 -0
  170. package/dist/cli/templates/nodes/prompt-template.d.ts +3 -0
  171. package/dist/cli/templates/nodes/prompt-template.js +52 -0
  172. package/dist/cli/templates/nodes/rag-retriever.d.ts +3 -0
  173. package/dist/cli/templates/nodes/rag-retriever.js +128 -0
  174. package/dist/cli/templates/nodes/tool-executor.d.ts +3 -0
  175. package/dist/cli/templates/nodes/tool-executor.js +108 -0
  176. package/dist/cli/templates/nodes/transformer.d.ts +7 -0
  177. package/dist/cli/templates/nodes/transformer.js +68 -0
  178. package/dist/cli/templates/nodes/validator.d.ts +7 -0
  179. package/dist/cli/templates/nodes/validator.js +62 -0
  180. package/dist/cli/templates/providers/index.d.ts +14 -0
  181. package/dist/cli/templates/providers/index.js +239 -0
  182. package/dist/cli/templates/shared/approval-types.d.ts +9 -0
  183. package/dist/cli/templates/shared/approval-types.js +31 -0
  184. package/dist/cli/templates/shared/llm-types.d.ts +15 -0
  185. package/dist/cli/templates/shared/llm-types.js +104 -0
  186. package/dist/cli/templates/workflows/aggregator.d.ts +7 -0
  187. package/dist/cli/templates/workflows/aggregator.js +104 -0
  188. package/dist/cli/templates/workflows/ai-agent-durable.d.ts +8 -0
  189. package/dist/cli/templates/workflows/ai-agent-durable.js +338 -0
  190. package/dist/cli/templates/workflows/ai-agent.d.ts +31 -0
  191. package/dist/cli/templates/workflows/ai-agent.js +326 -0
  192. package/dist/cli/templates/workflows/ai-chat.d.ts +7 -0
  193. package/dist/cli/templates/workflows/ai-chat.js +169 -0
  194. package/dist/cli/templates/workflows/ai-pipeline-durable.d.ts +8 -0
  195. package/dist/cli/templates/workflows/ai-pipeline-durable.js +330 -0
  196. package/dist/cli/templates/workflows/ai-rag.d.ts +7 -0
  197. package/dist/cli/templates/workflows/ai-rag.js +186 -0
  198. package/dist/cli/templates/workflows/ai-react.d.ts +7 -0
  199. package/dist/cli/templates/workflows/ai-react.js +294 -0
  200. package/dist/cli/templates/workflows/conditional.d.ts +12 -0
  201. package/dist/cli/templates/workflows/conditional.js +142 -0
  202. package/dist/cli/templates/workflows/error-handler.d.ts +7 -0
  203. package/dist/cli/templates/workflows/error-handler.js +147 -0
  204. package/dist/cli/templates/workflows/foreach.d.ts +7 -0
  205. package/dist/cli/templates/workflows/foreach.js +143 -0
  206. package/dist/cli/templates/workflows/sequential.d.ts +7 -0
  207. package/dist/cli/templates/workflows/sequential.js +198 -0
  208. package/dist/cli/templates/workflows/webhook.d.ts +7 -0
  209. package/dist/cli/templates/workflows/webhook.js +161 -0
  210. package/dist/cli/utils/logger.d.ts +15 -0
  211. package/dist/cli/utils/logger.js +46 -0
  212. package/dist/constants.d.ts +100 -0
  213. package/dist/constants.js +125 -0
  214. package/dist/defaults.d.ts +3 -0
  215. package/dist/defaults.js +3 -0
  216. package/dist/deployment/config/defaults.d.ts +29 -0
  217. package/dist/deployment/config/defaults.js +98 -0
  218. package/dist/deployment/config/loader.d.ts +24 -0
  219. package/dist/deployment/config/loader.js +236 -0
  220. package/dist/deployment/config/types.d.ts +117 -0
  221. package/dist/deployment/config/types.js +5 -0
  222. package/dist/deployment/core/adapters.d.ts +90 -0
  223. package/dist/deployment/core/adapters.js +251 -0
  224. package/dist/deployment/core/executor.d.ts +62 -0
  225. package/dist/deployment/core/executor.js +197 -0
  226. package/dist/deployment/core/formatters.d.ts +57 -0
  227. package/dist/deployment/core/formatters.js +170 -0
  228. package/dist/deployment/index.d.ts +31 -0
  229. package/dist/deployment/index.js +48 -0
  230. package/dist/deployment/openapi/generator.d.ts +146 -0
  231. package/dist/deployment/openapi/generator.js +347 -0
  232. package/dist/deployment/openapi/schema-converter.d.ts +49 -0
  233. package/dist/deployment/openapi/schema-converter.js +192 -0
  234. package/dist/deployment/targets/base.d.ts +316 -0
  235. package/dist/deployment/targets/base.js +823 -0
  236. package/dist/deployment/targets/cloudflare.d.ts +23 -0
  237. package/dist/deployment/targets/cloudflare.js +1125 -0
  238. package/dist/deployment/targets/inngest.d.ts +38 -0
  239. package/dist/deployment/targets/inngest.js +926 -0
  240. package/dist/deployment/targets/lambda.d.ts +23 -0
  241. package/dist/deployment/targets/lambda.js +1289 -0
  242. package/dist/deployment/targets/vercel.d.ts +23 -0
  243. package/dist/deployment/targets/vercel.js +886 -0
  244. package/dist/deployment/types.d.ts +183 -0
  245. package/dist/deployment/types.js +8 -0
  246. package/dist/diagram/geometry.d.ts +26 -0
  247. package/dist/diagram/geometry.js +850 -0
  248. package/dist/diagram/index.d.ts +16 -0
  249. package/dist/diagram/index.js +42 -0
  250. package/dist/diagram/layout.d.ts +11 -0
  251. package/dist/diagram/layout.js +143 -0
  252. package/dist/diagram/orthogonal-router.d.ts +79 -0
  253. package/dist/diagram/orthogonal-router.js +568 -0
  254. package/dist/diagram/renderer.d.ts +3 -0
  255. package/dist/diagram/renderer.js +207 -0
  256. package/dist/diagram/theme.d.ts +20 -0
  257. package/dist/diagram/theme.js +189 -0
  258. package/dist/diagram/types.d.ts +70 -0
  259. package/dist/diagram/types.js +2 -0
  260. package/dist/diff/WorkflowDiffer.d.ts +13 -0
  261. package/dist/diff/WorkflowDiffer.js +429 -0
  262. package/dist/diff/formatDiff.d.ts +10 -0
  263. package/dist/diff/formatDiff.js +220 -0
  264. package/dist/diff/impact.d.ts +29 -0
  265. package/dist/diff/impact.js +119 -0
  266. package/dist/diff/index.d.ts +10 -0
  267. package/dist/diff/index.js +9 -0
  268. package/dist/diff/types.d.ts +138 -0
  269. package/dist/diff/types.js +35 -0
  270. package/dist/doc-metadata/extractors/annotations.d.ts +56 -0
  271. package/dist/doc-metadata/extractors/annotations.js +337 -0
  272. package/dist/doc-metadata/extractors/cli-commands.d.ts +17 -0
  273. package/dist/doc-metadata/extractors/cli-commands.js +355 -0
  274. package/dist/doc-metadata/extractors/mcp-tools.d.ts +16 -0
  275. package/dist/doc-metadata/extractors/mcp-tools.js +689 -0
  276. package/dist/doc-metadata/extractors/plugin-api.d.ts +19 -0
  277. package/dist/doc-metadata/extractors/plugin-api.js +279 -0
  278. package/dist/doc-metadata/index.d.ts +5 -0
  279. package/dist/doc-metadata/index.js +4 -0
  280. package/dist/doc-metadata/types.d.ts +120 -0
  281. package/dist/doc-metadata/types.js +5 -0
  282. package/dist/editor-completions/annotationValues.d.ts +12 -0
  283. package/dist/editor-completions/annotationValues.js +138 -0
  284. package/dist/editor-completions/contextParser.d.ts +40 -0
  285. package/dist/editor-completions/contextParser.js +410 -0
  286. package/dist/editor-completions/dataTypes.d.ts +16 -0
  287. package/dist/editor-completions/dataTypes.js +95 -0
  288. package/dist/editor-completions/goToDefinition.d.ts +27 -0
  289. package/dist/editor-completions/goToDefinition.js +112 -0
  290. package/dist/editor-completions/index.d.ts +39 -0
  291. package/dist/editor-completions/index.js +181 -0
  292. package/dist/editor-completions/jsDocAnnotations.d.ts +29 -0
  293. package/dist/editor-completions/jsDocAnnotations.js +357 -0
  294. package/dist/editor-completions/modifierCompletions.d.ts +17 -0
  295. package/dist/editor-completions/modifierCompletions.js +197 -0
  296. package/dist/editor-completions/types.d.ts +119 -0
  297. package/dist/editor-completions/types.js +8 -0
  298. package/dist/export/index.d.ts +68 -0
  299. package/dist/export/index.js +1074 -0
  300. package/dist/export/templates.d.ts +24 -0
  301. package/dist/export/templates.js +186 -0
  302. package/dist/friendly-errors.d.ts +35 -0
  303. package/dist/friendly-errors.js +375 -0
  304. package/dist/function-like.d.ts +38 -0
  305. package/dist/function-like.js +83 -0
  306. package/dist/generated-branding.d.ts +16 -0
  307. package/dist/generated-branding.js +22 -0
  308. package/dist/generator/async-detection.d.ts +27 -0
  309. package/dist/generator/async-detection.js +56 -0
  310. package/dist/generator/code-utils.d.ts +76 -0
  311. package/dist/generator/code-utils.js +410 -0
  312. package/dist/generator/control-flow.d.ts +54 -0
  313. package/dist/generator/control-flow.js +284 -0
  314. package/dist/generator/inngest.d.ts +53 -0
  315. package/dist/generator/inngest.js +1126 -0
  316. package/dist/generator/scope-function-generator.d.ts +78 -0
  317. package/dist/generator/scope-function-generator.js +360 -0
  318. package/dist/generator/unified.d.ts +42 -0
  319. package/dist/generator/unified.js +1504 -0
  320. package/dist/generator.d.ts +54 -0
  321. package/dist/generator.js +100 -0
  322. package/dist/index.d.ts +85 -0
  323. package/dist/index.js +89 -0
  324. package/dist/jsdoc-parser.d.ts +308 -0
  325. package/dist/jsdoc-parser.js +923 -0
  326. package/dist/jsdoc-port-sync/constants.d.ts +41 -0
  327. package/dist/jsdoc-port-sync/constants.js +103 -0
  328. package/dist/jsdoc-port-sync/diff.d.ts +76 -0
  329. package/dist/jsdoc-port-sync/diff.js +319 -0
  330. package/dist/jsdoc-port-sync/index.d.ts +42 -0
  331. package/dist/jsdoc-port-sync/index.js +45 -0
  332. package/dist/jsdoc-port-sync/port-parser.d.ts +68 -0
  333. package/dist/jsdoc-port-sync/port-parser.js +579 -0
  334. package/dist/jsdoc-port-sync/rename.d.ts +21 -0
  335. package/dist/jsdoc-port-sync/rename.js +256 -0
  336. package/dist/jsdoc-port-sync/signature-parser.d.ts +104 -0
  337. package/dist/jsdoc-port-sync/signature-parser.js +559 -0
  338. package/dist/jsdoc-port-sync/sync.d.ts +36 -0
  339. package/dist/jsdoc-port-sync/sync.js +644 -0
  340. package/dist/jsdoc-port-sync.d.ts +10 -0
  341. package/dist/jsdoc-port-sync.js +10 -0
  342. package/dist/marketplace/index.d.ts +11 -0
  343. package/dist/marketplace/index.js +10 -0
  344. package/dist/marketplace/manifest.d.ts +32 -0
  345. package/dist/marketplace/manifest.js +176 -0
  346. package/dist/marketplace/registry.d.ts +30 -0
  347. package/dist/marketplace/registry.js +100 -0
  348. package/dist/marketplace/types.d.ts +154 -0
  349. package/dist/marketplace/types.js +9 -0
  350. package/dist/marketplace/validator.d.ts +13 -0
  351. package/dist/marketplace/validator.js +131 -0
  352. package/dist/mcp/auto-registration.d.ts +3 -0
  353. package/dist/mcp/auto-registration.js +62 -0
  354. package/dist/mcp/editor-connection.d.ts +50 -0
  355. package/dist/mcp/editor-connection.js +125 -0
  356. package/dist/mcp/event-buffer.d.ts +62 -0
  357. package/dist/mcp/event-buffer.js +150 -0
  358. package/dist/mcp/index.d.ts +12 -0
  359. package/dist/mcp/index.js +11 -0
  360. package/dist/mcp/resources.d.ts +14 -0
  361. package/dist/mcp/resources.js +55 -0
  362. package/dist/mcp/response-utils.d.ts +63 -0
  363. package/dist/mcp/response-utils.js +89 -0
  364. package/dist/mcp/server.d.ts +4 -0
  365. package/dist/mcp/server.js +99 -0
  366. package/dist/mcp/tools-diagram.d.ts +8 -0
  367. package/dist/mcp/tools-diagram.js +53 -0
  368. package/dist/mcp/tools-editor.d.ts +5 -0
  369. package/dist/mcp/tools-editor.js +190 -0
  370. package/dist/mcp/tools-export.d.ts +9 -0
  371. package/dist/mcp/tools-export.js +180 -0
  372. package/dist/mcp/tools-marketplace.d.ts +9 -0
  373. package/dist/mcp/tools-marketplace.js +132 -0
  374. package/dist/mcp/tools-pattern.d.ts +3 -0
  375. package/dist/mcp/tools-pattern.js +783 -0
  376. package/dist/mcp/tools-query.d.ts +3 -0
  377. package/dist/mcp/tools-query.js +364 -0
  378. package/dist/mcp/tools-template.d.ts +10 -0
  379. package/dist/mcp/tools-template.js +119 -0
  380. package/dist/mcp/types.d.ts +70 -0
  381. package/dist/mcp/types.js +8 -0
  382. package/dist/mcp/workflow-executor.d.ts +47 -0
  383. package/dist/mcp/workflow-executor.js +133 -0
  384. package/dist/migration/registry.d.ts +30 -0
  385. package/dist/migration/registry.js +29 -0
  386. package/dist/node-types-generator.d.ts +49 -0
  387. package/dist/node-types-generator.js +139 -0
  388. package/dist/npm-packages.d.ts +56 -0
  389. package/dist/npm-packages.js +255 -0
  390. package/dist/parser.d.ts +204 -0
  391. package/dist/parser.js +2100 -0
  392. package/dist/plugin/PluginPanel.d.ts +12 -0
  393. package/dist/plugin/PluginPanel.js +5 -0
  394. package/dist/plugin/index.d.ts +13 -0
  395. package/dist/plugin/index.js +14 -0
  396. package/dist/plugin/types.d.ts +75 -0
  397. package/dist/plugin/types.js +8 -0
  398. package/dist/resolve-package-types.d.ts +17 -0
  399. package/dist/resolve-package-types.js +123 -0
  400. package/dist/runtime/CancellationError.d.ts +11 -0
  401. package/dist/runtime/CancellationError.js +20 -0
  402. package/dist/runtime/ExecutionContext.d.ts +146 -0
  403. package/dist/runtime/ExecutionContext.js +235 -0
  404. package/dist/runtime/builtin-functions.d.ts +8 -0
  405. package/dist/runtime/builtin-functions.js +549 -0
  406. package/dist/runtime/events.d.ts +50 -0
  407. package/dist/runtime/events.js +2 -0
  408. package/dist/runtime/function-registry.d.ts +59 -0
  409. package/dist/runtime/function-registry.js +66 -0
  410. package/dist/runtime/index.d.ts +7 -0
  411. package/dist/runtime/index.js +7 -0
  412. package/dist/runtime/parameter-resolver.d.ts +62 -0
  413. package/dist/runtime/parameter-resolver.js +113 -0
  414. package/dist/server/index.d.ts +7 -0
  415. package/dist/server/index.js +6 -0
  416. package/dist/server/types.d.ts +93 -0
  417. package/dist/server/types.js +5 -0
  418. package/dist/server/webhook-server.d.ts +50 -0
  419. package/dist/server/webhook-server.js +269 -0
  420. package/dist/server/workflow-registry.d.ts +61 -0
  421. package/dist/server/workflow-registry.js +202 -0
  422. package/dist/shared-project.d.ts +9 -0
  423. package/dist/shared-project.js +28 -0
  424. package/dist/sugar-optimizer.d.ts +40 -0
  425. package/dist/sugar-optimizer.js +387 -0
  426. package/dist/testing/assertions.d.ts +51 -0
  427. package/dist/testing/assertions.js +127 -0
  428. package/dist/testing/index.d.ts +30 -0
  429. package/dist/testing/index.js +24 -0
  430. package/dist/testing/mock-approval.d.ts +81 -0
  431. package/dist/testing/mock-approval.js +98 -0
  432. package/dist/testing/mock-llm.d.ts +124 -0
  433. package/dist/testing/mock-llm.js +119 -0
  434. package/dist/testing/recorder.d.ts +72 -0
  435. package/dist/testing/recorder.js +70 -0
  436. package/dist/testing/replayer.d.ts +56 -0
  437. package/dist/testing/replayer.js +143 -0
  438. package/dist/testing/token-tracker.d.ts +71 -0
  439. package/dist/testing/token-tracker.js +94 -0
  440. package/dist/type-checker.d.ts +42 -0
  441. package/dist/type-checker.js +190 -0
  442. package/dist/type-mappings.d.ts +29 -0
  443. package/dist/type-mappings.js +125 -0
  444. package/dist/types/branded-ports.d.ts +151 -0
  445. package/dist/types/branded-ports.js +121 -0
  446. package/dist/types/index.d.ts +5 -0
  447. package/dist/types/index.js +5 -0
  448. package/dist/types.d.ts +139 -0
  449. package/dist/types.js +15 -0
  450. package/dist/utils/error-utils.d.ts +15 -0
  451. package/dist/utils/error-utils.js +27 -0
  452. package/dist/utils/lru-cache.d.ts +15 -0
  453. package/dist/utils/lru-cache.js +40 -0
  454. package/dist/utils/port-ordering.d.ts +26 -0
  455. package/dist/utils/port-ordering.js +88 -0
  456. package/dist/utils/port-tag-utils.d.ts +23 -0
  457. package/dist/utils/port-tag-utils.js +41 -0
  458. package/dist/utils/string-distance.d.ts +14 -0
  459. package/dist/utils/string-distance.js +56 -0
  460. package/dist/validation/agent-detection.d.ts +33 -0
  461. package/dist/validation/agent-detection.js +115 -0
  462. package/dist/validation/agent-rules.d.ts +48 -0
  463. package/dist/validation/agent-rules.js +262 -0
  464. package/dist/validator.d.ts +92 -0
  465. package/dist/validator.js +970 -0
  466. package/package.json +109 -0
@@ -0,0 +1,557 @@
1
+ import { mapToTypeScript } from "./type-mappings.js";
2
+ import { isExecutePort, isSuccessPort, isFailurePort, isControlFlowPort } from "./constants.js";
3
+ import { shouldUseStepTag } from "./utils/port-tag-utils.js";
4
+ import { detectSugarPatterns, filterStaleMacros } from "./sugar-optimizer.js";
5
+ export class AnnotationGenerator {
6
+ generate(workflow, options = {}) {
7
+ const { includeComments = true, includeMetadata = true, indentSize = 2, skipParamReturns = false, } = options;
8
+ const indent = " ".repeat(indentSize);
9
+ const lines = [];
10
+ if (includeComments) {
11
+ lines.push("");
12
+ lines.push("");
13
+ }
14
+ workflow.nodeTypes.forEach((nodeType) => {
15
+ // Skip the workflow's own IMPORTED_WORKFLOW entry (would create duplicate)
16
+ if (nodeType.variant === 'IMPORTED_WORKFLOW' && nodeType.functionName === workflow.functionName) {
17
+ return;
18
+ }
19
+ // Skip synthetic MAP_ITERATOR node types — they're generated from @map macros
20
+ if (nodeType.variant === 'MAP_ITERATOR') {
21
+ return;
22
+ }
23
+ lines.push(...this.generateNodeTypeAnnotation(nodeType, indent, includeComments, includeMetadata));
24
+ lines.push("");
25
+ });
26
+ lines.push(...this.generateWorkflowAnnotation(workflow, indent, includeComments, skipParamReturns));
27
+ lines.push("");
28
+ return lines.join("\n");
29
+ }
30
+ generateNodeTypeAnnotation(nodeType, indent, includeComments, includeMetadata) {
31
+ const lines = [];
32
+ // If functionText exists, it already includes the JSDoc - use it directly
33
+ if (nodeType.functionText) {
34
+ lines.push(nodeType.functionText);
35
+ return lines;
36
+ }
37
+ // Generate JSDoc comment block (only when no functionText)
38
+ lines.push("/**");
39
+ // Add description if present
40
+ if (includeComments && nodeType.description) {
41
+ lines.push(` * ${nodeType.description}`);
42
+ lines.push(` *`);
43
+ }
44
+ // @flowWeaver nodeType marker
45
+ lines.push(" * @flowWeaver nodeType");
46
+ // Add label if present
47
+ if (includeMetadata && nodeType.label) {
48
+ lines.push(` * @label ${nodeType.label}`);
49
+ }
50
+ // Add name if different from function name (preserves display name across save/reload)
51
+ if (includeMetadata && nodeType.name && nodeType.name !== nodeType.functionName) {
52
+ lines.push(` * @name ${nodeType.name}`);
53
+ }
54
+ // Add scope if present
55
+ if (nodeType.scope) {
56
+ lines.push(` * @scope ${nodeType.scope}`);
57
+ }
58
+ // Add pullExecution if present
59
+ if (nodeType.defaultConfig?.pullExecution) {
60
+ lines.push(` * @pullExecution ${nodeType.defaultConfig.pullExecution.triggerPort}`);
61
+ }
62
+ // Add input ports (with automatic ordering)
63
+ const inputEntries = this.assignPortOrders(Object.entries(nodeType.inputs), 'input');
64
+ inputEntries.forEach(([name, port]) => {
65
+ const portTag = this.generateJSDocPortTag(name, port, 'input');
66
+ lines.push(` * ${portTag}`);
67
+ });
68
+ // Add output ports (with automatic ordering)
69
+ const outputEntries = this.assignPortOrders(Object.entries(nodeType.outputs), 'output');
70
+ outputEntries.forEach(([name, port]) => {
71
+ const portTag = this.generateJSDocPortTag(name, port, 'output');
72
+ lines.push(` * ${portTag}`);
73
+ });
74
+ lines.push(" */");
75
+ // Generate function signature
76
+ lines.push(...this.generateFunctionSignature(nodeType));
77
+ return lines;
78
+ }
79
+ generateJSDocPortTag(name, port, direction, implicitOrder) {
80
+ return generateJSDocPortTag(name, port, direction, implicitOrder);
81
+ }
82
+ generateTPortDefinition(port, _indent) {
83
+ if (!port.optional &&
84
+ port.default === undefined &&
85
+ !port.expression &&
86
+ !port.label &&
87
+ !port.hidden &&
88
+ !port.failure) {
89
+ return `'${port.dataType}'`;
90
+ }
91
+ const props = [];
92
+ props.push(`type: '${port.dataType}'`);
93
+ if (port.optional) {
94
+ props.push(`optional: true`);
95
+ }
96
+ if (port.default !== undefined) {
97
+ props.push(`defaultValue: ${JSON.stringify(port.default)}`);
98
+ }
99
+ if (port.expression) {
100
+ props.push(`expression: \`${port.expression}\``);
101
+ }
102
+ if (port.label) {
103
+ props.push(`label: '${port.label}'`);
104
+ }
105
+ if (port.hidden) {
106
+ props.push(`hidden: true`);
107
+ }
108
+ if (port.failure) {
109
+ props.push(`failure: true`);
110
+ }
111
+ return `{ ${props.join(", ")} }`;
112
+ }
113
+ generateFunctionSignature(nodeType) {
114
+ const lines = [];
115
+ // Build parameters (excluding execute which will be first)
116
+ const params = ["execute: boolean"];
117
+ Object.entries(nodeType.inputs).forEach(([name, port]) => {
118
+ if (isExecutePort(name))
119
+ return;
120
+ const optional = port.optional ? "?" : "";
121
+ const defaultVal = port.default !== undefined ? ` = ${JSON.stringify(port.default)}` : "";
122
+ params.push(`${name}${optional}: ${this.mapDataTypeToTS(port.dataType)}${defaultVal}`);
123
+ });
124
+ // Build return type (including onSuccess/onFailure)
125
+ const returns = ["onSuccess: boolean", "onFailure: boolean"];
126
+ Object.entries(nodeType.outputs).forEach(([name, port]) => {
127
+ if (isSuccessPort(name) || isFailurePort(name))
128
+ return;
129
+ returns.push(`${name}: ${this.mapDataTypeToTS(port.dataType)}`);
130
+ });
131
+ lines.push(`function ${nodeType.functionName}(${params.join(", ")}) {`);
132
+ lines.push(` if (!execute) return { onSuccess: false, onFailure: false };`);
133
+ lines.push(` return { onSuccess: true, onFailure: false };`);
134
+ lines.push(`}`);
135
+ return lines;
136
+ }
137
+ generateWorkflowAnnotation(workflow, indent, includeComments, skipParamReturns = false) {
138
+ const lines = [];
139
+ // Build macro coverage sets for filtering (@map-specific)
140
+ const macroInstanceIds = new Set();
141
+ const macroChildIds = new Set();
142
+ const macroScopeNames = new Set();
143
+ if (workflow.macros && workflow.macros.length > 0) {
144
+ for (const macro of workflow.macros) {
145
+ if (macro.type === 'map') {
146
+ macroInstanceIds.add(macro.instanceId);
147
+ macroChildIds.add(macro.childId);
148
+ macroScopeNames.add(`${macro.instanceId}.iterate`);
149
+ }
150
+ }
151
+ }
152
+ // Generate JSDoc comment block
153
+ lines.push("/**");
154
+ // Add description if present
155
+ if (includeComments && workflow.description) {
156
+ lines.push(` * ${workflow.description}`);
157
+ lines.push(` *`);
158
+ }
159
+ // @flowWeaver workflow marker
160
+ lines.push(" * @flowWeaver workflow");
161
+ // Add strictTypes option if enabled
162
+ if (workflow.options?.strictTypes) {
163
+ lines.push(" * @strictTypes");
164
+ }
165
+ // Add autoConnect option if enabled
166
+ if (workflow.options?.autoConnect) {
167
+ lines.push(" * @autoConnect");
168
+ }
169
+ // @trigger round-trip
170
+ if (workflow.options?.trigger) {
171
+ const t = workflow.options.trigger;
172
+ const parts = [];
173
+ if (t.event)
174
+ parts.push(`event="${t.event}"`);
175
+ if (t.cron)
176
+ parts.push(`cron="${t.cron}"`);
177
+ if (parts.length > 0)
178
+ lines.push(` * @trigger ${parts.join(' ')}`);
179
+ }
180
+ // @cancelOn round-trip
181
+ if (workflow.options?.cancelOn) {
182
+ const c = workflow.options.cancelOn;
183
+ let line = ` * @cancelOn event="${c.event}"`;
184
+ if (c.match)
185
+ line += ` match="${c.match}"`;
186
+ if (c.timeout)
187
+ line += ` timeout="${c.timeout}"`;
188
+ lines.push(line);
189
+ }
190
+ // @retries round-trip
191
+ if (workflow.options?.retries !== undefined) {
192
+ lines.push(` * @retries ${workflow.options.retries}`);
193
+ }
194
+ // @timeout round-trip
195
+ if (workflow.options?.timeout) {
196
+ lines.push(` * @timeout "${workflow.options.timeout}"`);
197
+ }
198
+ // @throttle round-trip
199
+ if (workflow.options?.throttle) {
200
+ const t = workflow.options.throttle;
201
+ let line = ` * @throttle limit=${t.limit}`;
202
+ if (t.period)
203
+ line += ` period="${t.period}"`;
204
+ lines.push(line);
205
+ }
206
+ // Add name if different from export name
207
+ if (workflow.name && workflow.name !== workflow.functionName) {
208
+ lines.push(` * @name ${workflow.name}`);
209
+ }
210
+ // Add description tag
211
+ if (workflow.description && includeComments) {
212
+ lines.push(` * @description ${workflow.description}`);
213
+ }
214
+ // Add node instances — skip synthetic MAP_ITERATOR instances, strip parent from macro children
215
+ workflow.instances.forEach((instance) => {
216
+ if (macroInstanceIds.has(instance.id))
217
+ return;
218
+ if (macroChildIds.has(instance.id) && instance.parent) {
219
+ const stripped = { ...instance, parent: undefined };
220
+ lines.push(generateNodeInstanceTag(stripped));
221
+ }
222
+ else {
223
+ lines.push(generateNodeInstanceTag(instance));
224
+ }
225
+ });
226
+ // Filter stale macros (e.g. paths whose connections were deleted)
227
+ const existingMacros = filterStaleMacros(workflow.macros || [], workflow.connections, workflow.instances);
228
+ // Auto-detect @path sugar patterns from connections
229
+ const detected = detectSugarPatterns(workflow.connections, workflow.instances, existingMacros, workflow.nodeTypes, workflow.startPorts, workflow.exitPorts);
230
+ // Merge detected macros with existing ones
231
+ const allMacros = [
232
+ ...existingMacros,
233
+ ...detected.paths,
234
+ ];
235
+ // Add @map and @path macros
236
+ if (allMacros.length > 0) {
237
+ for (const macro of allMacros) {
238
+ if (macro.type === 'map') {
239
+ let mapLine = ` * @map ${macro.instanceId} ${macro.childId}`;
240
+ if (macro.inputPort || macro.outputPort) {
241
+ mapLine += `(${macro.inputPort} -> ${macro.outputPort})`;
242
+ }
243
+ mapLine += ` over ${macro.sourcePort}`;
244
+ lines.push(mapLine);
245
+ }
246
+ else if (macro.type === 'path') {
247
+ const stepsStr = macro.steps.map(s => s.route ? `${s.node}:${s.route}` : s.node).join(' -> ');
248
+ lines.push(` * @path ${stepsStr}`);
249
+ }
250
+ }
251
+ }
252
+ // Add node positions (if they exist)
253
+ // Start with Start node position if present
254
+ if (workflow.ui?.startNode?.x !== undefined && workflow.ui?.startNode?.y !== undefined) {
255
+ lines.push(` * @position Start ${Math.round(workflow.ui.startNode.x)} ${Math.round(workflow.ui.startNode.y)}`);
256
+ }
257
+ // Add instance positions
258
+ workflow.instances.forEach((instance) => {
259
+ if (instance.config?.x !== undefined && instance.config?.y !== undefined) {
260
+ lines.push(` * @position ${instance.id} ${Math.round(instance.config.x)} ${Math.round(instance.config.y)}`);
261
+ }
262
+ });
263
+ // Add Exit node position if present
264
+ if (workflow.ui?.exitNode?.x !== undefined && workflow.ui?.exitNode?.y !== undefined) {
265
+ lines.push(` * @position Exit ${Math.round(workflow.ui.exitNode.x)} ${Math.round(workflow.ui.exitNode.y)}`);
266
+ }
267
+ // Add connections — skip connections covered by macros
268
+ if (!workflow.options?.autoConnect) {
269
+ workflow.connections.forEach((conn) => {
270
+ if (allMacros.length > 0 && isConnectionCoveredByMacroStatic(conn, allMacros))
271
+ return;
272
+ const fromScope = conn.from.scope ? `:${conn.from.scope}` : '';
273
+ const toScope = conn.to.scope ? `:${conn.to.scope}` : '';
274
+ lines.push(` * @connect ${conn.from.node}.${conn.from.port}${fromScope} -> ${conn.to.node}.${conn.to.port}${toScope}`);
275
+ });
276
+ }
277
+ // Add @param annotations for start ports (workflow inputs)
278
+ if (!skipParamReturns && workflow.startPorts && Object.keys(workflow.startPorts).length > 0) {
279
+ const startPortEntries = this.assignPortOrders(Object.entries(workflow.startPorts), 'input');
280
+ startPortEntries.forEach(([name, port], index) => {
281
+ const paramTag = this.generateJSDocPortTag(name, port, 'input', index);
282
+ // Replace @input with @param for workflow-level JSDoc
283
+ lines.push(` * ${paramTag.replace('@input', '@param')}`);
284
+ });
285
+ }
286
+ // Add @returns annotations for exit ports (workflow outputs)
287
+ if (!skipParamReturns && workflow.exitPorts && Object.keys(workflow.exitPorts).length > 0) {
288
+ const exitPortEntries = this.assignPortOrders(Object.entries(workflow.exitPorts), 'output');
289
+ exitPortEntries.forEach(([name, port], index) => {
290
+ const returnTag = this.generateJSDocPortTag(name, port, 'output', index);
291
+ // Replace @output with @returns for workflow-level JSDoc
292
+ lines.push(` * ${returnTag.replace('@output', '@returns')}`);
293
+ });
294
+ }
295
+ // Add scopes — skip scopes covered by @map macros
296
+ if (workflow.scopes) {
297
+ Object.entries(workflow.scopes).forEach(([scopeName, children]) => {
298
+ if (macroScopeNames.has(scopeName))
299
+ return;
300
+ lines.push(` * @scope ${scopeName} [${children.join(', ')}]`);
301
+ });
302
+ }
303
+ lines.push(" */");
304
+ // Add workflow function signature
305
+ lines.push(...this.generateWorkflowFunctionSignature(workflow));
306
+ return lines;
307
+ }
308
+ generateWorkflowFunctionSignature(workflow) {
309
+ const lines = [];
310
+ const startPorts = workflow.startPorts || {};
311
+ const exitPorts = workflow.exitPorts || {};
312
+ // Build parameter types (excluding execute)
313
+ const params = [];
314
+ Object.entries(startPorts).forEach(([name, port]) => {
315
+ if (isExecutePort(name))
316
+ return;
317
+ const optional = port.optional ? "?" : "";
318
+ params.push(`${name}${optional}: ${this.mapDataTypeToTS(port.dataType)}`);
319
+ });
320
+ // Build return types (including onSuccess/onFailure)
321
+ const returns = [];
322
+ Object.entries(exitPorts).forEach(([name, port]) => {
323
+ const optional = port.optional ? "?" : "";
324
+ returns.push(`${name}${optional}: ${this.mapDataTypeToTS(port.dataType)}`);
325
+ });
326
+ // Generate async function signature with execute parameter
327
+ lines.push(`export async function ${workflow.functionName}(`);
328
+ lines.push(` execute: boolean,`);
329
+ lines.push(` params: { ${params.join("; ")} }`);
330
+ lines.push(`): Promise<{ ${returns.join("; ")} }> {`);
331
+ lines.push(` throw new Error('Not implemented');`);
332
+ lines.push("}");
333
+ return lines;
334
+ }
335
+ assignPortOrders(ports, direction) {
336
+ return assignPortOrders(ports, direction);
337
+ }
338
+ mapDataTypeToTS(dataType) {
339
+ return mapToTypeScript(dataType);
340
+ }
341
+ }
342
+ /**
343
+ * Generate JSDoc port tag (e.g., @input name - Description)
344
+ * Exported for reuse in generate-in-place.ts to maintain DRY principle
345
+ *
346
+ * New format (types derived from signature):
347
+ * - @input name - Description
348
+ * - @output name - Description
349
+ * - @step name - Description (for explicit STEP/control-flow ports)
350
+ *
351
+ * Reserved STEP ports (execute, onSuccess, onFailure) use @input/@output.
352
+ * Custom STEP ports use @step.
353
+ */
354
+ export function generateJSDocPortTag(name, port, direction, _implicitOrder) {
355
+ // Determine tag: @step for explicit control flow, @input/@output for data
356
+ // Reserved STEP ports (execute, onSuccess, onFailure) stay as @input/@output
357
+ // Scoped mandatory ports (start, success, failure) with scope attribute also stay as @input/@output
358
+ const tag = shouldUseStepTag(name, port) ? 'step' : direction;
359
+ // Format: @input [name=default] - Description
360
+ // or: @input name - Expression: (ctx) => ...
361
+ let portStr = `@${tag} `;
362
+ // Handle optional with default value: [name=value]
363
+ if (port.optional && port.default !== undefined) {
364
+ portStr += `[${name}=${JSON.stringify(port.default)}]`;
365
+ }
366
+ // Handle optional without default: [name]
367
+ else if (port.optional) {
368
+ portStr += `[${name}]`;
369
+ }
370
+ // Handle required with default: name=value (though rare)
371
+ else if (port.default !== undefined) {
372
+ portStr += `${name}=${JSON.stringify(port.default)}`;
373
+ }
374
+ // Regular required port
375
+ else {
376
+ portStr += name;
377
+ }
378
+ // Add scope attribute if present (for per-port scoped architecture)
379
+ if (port.scope) {
380
+ portStr += ` scope:${port.scope}`;
381
+ }
382
+ // Add order metadata whenever it's explicitly set to preserve round-trip fidelity
383
+ // Even if order matches position, we must write it to avoid losing metadata on re-parse
384
+ if (port.metadata?.order !== undefined) {
385
+ portStr += ` [order:${port.metadata.order}]`;
386
+ }
387
+ // Add placement metadata when explicitly set
388
+ if (port.metadata?.placement !== undefined) {
389
+ portStr += ` [placement:${port.metadata.placement}]`;
390
+ }
391
+ if (port.expression) {
392
+ portStr += ` - Expression: ${port.expression}`;
393
+ }
394
+ else if (port.label && port.label !== name) {
395
+ // Only add label if it differs from the port name
396
+ portStr += ` - ${port.label}`;
397
+ }
398
+ return portStr;
399
+ }
400
+ /**
401
+ * Check if a connection is covered by a macro (and should not be written as @connect).
402
+ * Handles both @map and @path macros.
403
+ */
404
+ function isConnectionCoveredByMacroStatic(conn, macros) {
405
+ for (const macro of macros) {
406
+ if (macro.type === 'map') {
407
+ const [sourceNode, sourcePort] = macro.sourcePort.split('.');
408
+ // Scoped connections between the map instance and its child
409
+ if ((conn.from.node === macro.instanceId || conn.from.node === macro.childId) &&
410
+ (conn.to.node === macro.instanceId || conn.to.node === macro.childId) &&
411
+ (conn.from.scope === 'iterate' || conn.to.scope === 'iterate')) {
412
+ return true;
413
+ }
414
+ // Upstream connection: source.port -> mapInstance.items
415
+ if (conn.from.node === sourceNode &&
416
+ conn.from.port === sourcePort &&
417
+ !conn.from.scope &&
418
+ conn.to.node === macro.instanceId &&
419
+ conn.to.port === 'items' &&
420
+ !conn.to.scope) {
421
+ return true;
422
+ }
423
+ }
424
+ else if (macro.type === 'path') {
425
+ if (conn.from.scope || conn.to.scope)
426
+ continue;
427
+ const steps = macro.steps;
428
+ const fromIdx = steps.findIndex(s => s.node === conn.from.node);
429
+ const toIdx = steps.findIndex(s => s.node === conn.to.node);
430
+ if (fromIdx === -1 || toIdx === -1 || fromIdx >= toIdx)
431
+ continue;
432
+ // Control flow: check consecutive pairs
433
+ if (toIdx === fromIdx + 1) {
434
+ const route = steps[fromIdx].route || 'ok';
435
+ // Start.execute -> next.execute
436
+ if (conn.from.node === 'Start' && conn.from.port === 'execute' && conn.to.port === 'execute')
437
+ return true;
438
+ // To Exit: route determines which Exit port
439
+ if (conn.to.node === 'Exit') {
440
+ if (route === 'fail' && conn.from.port === 'onFailure' && conn.to.port === 'onFailure')
441
+ return true;
442
+ if (route === 'ok' && conn.from.port === 'onSuccess' && conn.to.port === 'onSuccess')
443
+ return true;
444
+ }
445
+ // Normal: onSuccess/onFailure -> execute
446
+ if (route === 'fail' && conn.from.port === 'onFailure' && conn.to.port === 'execute')
447
+ return true;
448
+ if (route === 'ok' && conn.from.port === 'onSuccess' && conn.to.port === 'execute')
449
+ return true;
450
+ }
451
+ // Data: same-name non-control-flow, from before to, to is not Exit
452
+ if (conn.to.node !== 'Exit' &&
453
+ !isControlFlowPort(conn.from.port) &&
454
+ !isControlFlowPort(conn.to.port) &&
455
+ conn.from.port === conn.to.port) {
456
+ return true;
457
+ }
458
+ }
459
+ }
460
+ return false;
461
+ }
462
+ /**
463
+ * Simply return ports as-is to preserve exact order from the AST
464
+ * Don't compute or add any new metadata - only preserve what's already there
465
+ * This ensures perfect round-trip fidelity
466
+ * Exported for reuse in generate-in-place.ts to maintain DRY principle
467
+ */
468
+ export function assignPortOrders(ports, _direction) {
469
+ return ports;
470
+ }
471
+ /**
472
+ * Generate @node tag for a single instance
473
+ * Exported for reuse in generate-in-place.ts to maintain DRY principle
474
+ */
475
+ export function generateNodeInstanceTag(instance) {
476
+ const parent = instance.parent ? ` ${instance.parent.id}.${instance.parent.scope}` : '';
477
+ // Generate [label: ...] attribute if present and different from id
478
+ let labelAttr = '';
479
+ if (instance.config?.label && instance.config.label !== instance.id) {
480
+ // Escape quotes in the label
481
+ const escapedLabel = instance.config.label.replace(/"/g, '\\"');
482
+ labelAttr = ` [label: "${escapedLabel}"]`;
483
+ }
484
+ // Generate [portOrder: ...] attribute if present
485
+ let portOrderAttr = '';
486
+ if (instance.config?.portConfigs && instance.config.portConfigs.length > 0) {
487
+ const orderConfigs = instance.config.portConfigs
488
+ .filter(pc => pc.order !== undefined)
489
+ .map(pc => `${pc.portName}=${pc.order}`)
490
+ .join(',');
491
+ if (orderConfigs) {
492
+ portOrderAttr = ` [portOrder: ${orderConfigs}]`;
493
+ }
494
+ }
495
+ // Generate [portLabel: ...] attribute if present
496
+ let portLabelAttr = '';
497
+ if (instance.config?.portConfigs && instance.config.portConfigs.length > 0) {
498
+ const labelConfigs = instance.config.portConfigs
499
+ .filter(pc => pc.label !== undefined && pc.label !== '')
500
+ .map(pc => {
501
+ const escapedLabel = String(pc.label).replace(/"/g, '\\"');
502
+ return `${pc.portName}="${escapedLabel}"`;
503
+ })
504
+ .join(', ');
505
+ if (labelConfigs) {
506
+ portLabelAttr = ` [portLabel: ${labelConfigs}]`;
507
+ }
508
+ }
509
+ // Generate [expr: ...] attribute if any port has an expression
510
+ let exprAttr = '';
511
+ if (instance.config?.portConfigs && instance.config.portConfigs.length > 0) {
512
+ const exprConfigs = instance.config.portConfigs
513
+ .filter(pc => pc.expression !== undefined)
514
+ .map(pc => {
515
+ // Escape quotes and */ (which would close the JSDoc comment)
516
+ const escapedExpr = String(pc.expression)
517
+ .replace(/"/g, '\\"')
518
+ .replace(/\*\//g, '*\\/');
519
+ return `${pc.portName}="${escapedExpr}"`;
520
+ })
521
+ .join(', ');
522
+ if (exprConfigs) {
523
+ exprAttr = ` [expr: ${exprConfigs}]`;
524
+ }
525
+ }
526
+ // Generate [pullExecution: ...] attribute if present
527
+ let pullExecutionAttr = '';
528
+ if (instance.config?.pullExecution) {
529
+ pullExecutionAttr = ` [pullExecution: ${instance.config.pullExecution.triggerPort}]`;
530
+ }
531
+ // Generate [minimized] attribute if present
532
+ const minimizedAttr = instance.config?.minimized ? ' [minimized]' : '';
533
+ // Generate [color: "value"] attribute if present
534
+ let colorAttr = '';
535
+ if (instance.config?.color) {
536
+ colorAttr = ` [color: "${instance.config.color}"]`;
537
+ }
538
+ // Generate [icon: "value"] attribute if present
539
+ let iconAttr = '';
540
+ if (instance.config?.icon) {
541
+ iconAttr = ` [icon: "${instance.config.icon}"]`;
542
+ }
543
+ // Generate [tags: "label" "tooltip", "label2"] attribute if present
544
+ let tagsAttr = '';
545
+ if (instance.config?.tags?.length) {
546
+ const tagEntries = instance.config.tags.map(t => t.tooltip ? `"${t.label}" "${t.tooltip}"` : `"${t.label}"`).join(', ');
547
+ tagsAttr = ` [tags: ${tagEntries}]`;
548
+ }
549
+ // Generate [size: width height] attribute if present
550
+ let sizeAttr = '';
551
+ if (instance.config?.width !== undefined && instance.config?.height !== undefined) {
552
+ sizeAttr = ` [size: ${Math.round(instance.config.width)} ${Math.round(instance.config.height)}]`;
553
+ }
554
+ return ` * @node ${instance.id} ${instance.nodeType}${parent}${labelAttr}${portOrderAttr}${portLabelAttr}${exprAttr}${pullExecutionAttr}${minimizedAttr}${colorAttr}${iconAttr}${tagsAttr}${sizeAttr}`;
555
+ }
556
+ export const annotationGenerator = new AnnotationGenerator();
557
+ //# sourceMappingURL=annotation-generator.js.map