@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,24 @@
1
+ /**
2
+ * Serverless handler templates for different platforms
3
+ */
4
+ /**
5
+ * AWS Lambda handler template
6
+ */
7
+ export declare const LAMBDA_TEMPLATE = "{{GENERATED_HEADER}}\nimport type { APIGatewayProxyEventV2, APIGatewayProxyResultV2, Context } from 'aws-lambda';\n{{WORKFLOW_IMPORT}}\n\nexport const handler = async (\n event: APIGatewayProxyEventV2,\n context: Context\n): Promise<APIGatewayProxyResultV2> => {\n context.callbackWaitsForEmptyEventLoop = false;\n\n try {\n const body = typeof event.body === 'string'\n ? JSON.parse(event.body || '{}')\n : event.body || {};\n\n const startTime = Date.now();\n const result = await {{FUNCTION_NAME}}(true, body);\n\n return {\n statusCode: 200,\n headers: {\n 'Content-Type': 'application/json',\n 'X-Execution-Time': `${Date.now() - startTime}ms`,\n },\n body: JSON.stringify({ success: true, result }),\n };\n } catch (error) {\n return {\n statusCode: 500,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n requestId: context.awsRequestId,\n }),\n };\n }\n};\n";
8
+ /**
9
+ * Vercel serverless function template
10
+ */
11
+ export declare const VERCEL_TEMPLATE = "{{GENERATED_HEADER}}\nimport type { VercelRequest, VercelResponse } from '@vercel/node';\n{{WORKFLOW_IMPORT}}\n\nexport const config = {\n runtime: 'nodejs20.x',\n maxDuration: {{MAX_DURATION}},\n};\n\nexport default async function handler(req: VercelRequest, res: VercelResponse) {\n if (req.method !== 'POST') {\n return res.status(405).json({ error: 'Method Not Allowed' });\n }\n\n try {\n const params = req.body || {};\n const startTime = Date.now();\n\n const result = await {{FUNCTION_NAME}}(true, params);\n\n return res.status(200).json({\n success: true,\n result,\n executionTime: Date.now() - startTime,\n });\n } catch (error) {\n return res.status(500).json({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n";
12
+ /**
13
+ * Cloudflare Workers template
14
+ */
15
+ export declare const CLOUDFLARE_TEMPLATE = "{{GENERATED_HEADER}}\n{{WORKFLOW_IMPORT}}\n\ninterface Env {\n // Add your bindings here (D1, KV, R2, etc.)\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n if (request.method !== 'POST') {\n return new Response(JSON.stringify({ error: 'Method Not Allowed' }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n try {\n const body = await request.json() as Record<string, unknown>;\n const startTime = performance.now();\n\n const result = await {{FUNCTION_NAME}}(true, body);\n\n return new Response(JSON.stringify({\n success: true,\n result,\n executionTime: Math.round(performance.now() - startTime),\n }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n return new Response(JSON.stringify({\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n },\n} satisfies ExportedHandler<Env>;\n";
16
+ /**
17
+ * Inngest durable function template
18
+ */
19
+ export declare const INNGEST_TEMPLATE = "{{GENERATED_HEADER}}\nimport { Inngest } from 'inngest';\nimport { serve } from 'inngest/express';\n{{WORKFLOW_IMPORT}}\n\nconst inngest = new Inngest({ id: 'fw-{{FUNCTION_NAME}}' });\n\nconst workflowFn = inngest.createFunction(\n { id: '{{FUNCTION_NAME}}', name: '{{FUNCTION_NAME}}' },\n { event: 'fw/{{FUNCTION_NAME}}.execute' },\n async ({ event, step }) => {\n const params = event.data ?? {};\n\n const result = await step.run('execute-workflow', async () => {\n return {{FUNCTION_NAME}}(true, params);\n });\n\n return { success: true, result };\n }\n);\n\nexport const handler = serve({ client: inngest, functions: [workflowFn] });\nexport default handler;\n";
20
+ /**
21
+ * SAM (Serverless Application Model) template for AWS Lambda
22
+ */
23
+ export declare const SAM_TEMPLATE = "AWSTemplateFormatVersion: '2010-09-09'\nTransform: AWS::Serverless-2016-10-31\nDescription: Flow Weaver workflow - {{WORKFLOW_NAME}}\n\nGlobals:\n Function:\n Timeout: 30\n Runtime: nodejs20.x\n MemorySize: 256\n\nResources:\n WorkflowFunction:\n Type: AWS::Serverless::Function\n Properties:\n Handler: handler.handler\n CodeUri: .\n Description: {{WORKFLOW_DESCRIPTION}}\n Events:\n ApiEvent:\n Type: HttpApi\n Properties:\n Path: /{{WORKFLOW_PATH}}\n Method: POST\n\nOutputs:\n ApiEndpoint:\n Description: API endpoint URL\n Value: !Sub \"https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/{{WORKFLOW_PATH}}\"\n";
24
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Serverless handler templates for different platforms
3
+ */
4
+ /**
5
+ * AWS Lambda handler template
6
+ */
7
+ export const LAMBDA_TEMPLATE = `{{GENERATED_HEADER}}
8
+ import type { APIGatewayProxyEventV2, APIGatewayProxyResultV2, Context } from 'aws-lambda';
9
+ {{WORKFLOW_IMPORT}}
10
+
11
+ export const handler = async (
12
+ event: APIGatewayProxyEventV2,
13
+ context: Context
14
+ ): Promise<APIGatewayProxyResultV2> => {
15
+ context.callbackWaitsForEmptyEventLoop = false;
16
+
17
+ try {
18
+ const body = typeof event.body === 'string'
19
+ ? JSON.parse(event.body || '{}')
20
+ : event.body || {};
21
+
22
+ const startTime = Date.now();
23
+ const result = await {{FUNCTION_NAME}}(true, body);
24
+
25
+ return {
26
+ statusCode: 200,
27
+ headers: {
28
+ 'Content-Type': 'application/json',
29
+ 'X-Execution-Time': \`\${Date.now() - startTime}ms\`,
30
+ },
31
+ body: JSON.stringify({ success: true, result }),
32
+ };
33
+ } catch (error) {
34
+ return {
35
+ statusCode: 500,
36
+ headers: { 'Content-Type': 'application/json' },
37
+ body: JSON.stringify({
38
+ success: false,
39
+ error: error instanceof Error ? error.message : String(error),
40
+ requestId: context.awsRequestId,
41
+ }),
42
+ };
43
+ }
44
+ };
45
+ `;
46
+ /**
47
+ * Vercel serverless function template
48
+ */
49
+ export const VERCEL_TEMPLATE = `{{GENERATED_HEADER}}
50
+ import type { VercelRequest, VercelResponse } from '@vercel/node';
51
+ {{WORKFLOW_IMPORT}}
52
+
53
+ export const config = {
54
+ runtime: 'nodejs20.x',
55
+ maxDuration: {{MAX_DURATION}},
56
+ };
57
+
58
+ export default async function handler(req: VercelRequest, res: VercelResponse) {
59
+ if (req.method !== 'POST') {
60
+ return res.status(405).json({ error: 'Method Not Allowed' });
61
+ }
62
+
63
+ try {
64
+ const params = req.body || {};
65
+ const startTime = Date.now();
66
+
67
+ const result = await {{FUNCTION_NAME}}(true, params);
68
+
69
+ return res.status(200).json({
70
+ success: true,
71
+ result,
72
+ executionTime: Date.now() - startTime,
73
+ });
74
+ } catch (error) {
75
+ return res.status(500).json({
76
+ success: false,
77
+ error: error instanceof Error ? error.message : String(error),
78
+ });
79
+ }
80
+ }
81
+ `;
82
+ /**
83
+ * Cloudflare Workers template
84
+ */
85
+ export const CLOUDFLARE_TEMPLATE = `{{GENERATED_HEADER}}
86
+ {{WORKFLOW_IMPORT}}
87
+
88
+ interface Env {
89
+ // Add your bindings here (D1, KV, R2, etc.)
90
+ }
91
+
92
+ export default {
93
+ async fetch(request: Request, env: Env): Promise<Response> {
94
+ if (request.method !== 'POST') {
95
+ return new Response(JSON.stringify({ error: 'Method Not Allowed' }), {
96
+ status: 405,
97
+ headers: { 'Content-Type': 'application/json' },
98
+ });
99
+ }
100
+
101
+ try {
102
+ const body = await request.json() as Record<string, unknown>;
103
+ const startTime = performance.now();
104
+
105
+ const result = await {{FUNCTION_NAME}}(true, body);
106
+
107
+ return new Response(JSON.stringify({
108
+ success: true,
109
+ result,
110
+ executionTime: Math.round(performance.now() - startTime),
111
+ }), {
112
+ status: 200,
113
+ headers: { 'Content-Type': 'application/json' },
114
+ });
115
+ } catch (error) {
116
+ return new Response(JSON.stringify({
117
+ success: false,
118
+ error: error instanceof Error ? error.message : String(error),
119
+ }), {
120
+ status: 500,
121
+ headers: { 'Content-Type': 'application/json' },
122
+ });
123
+ }
124
+ },
125
+ } satisfies ExportedHandler<Env>;
126
+ `;
127
+ /**
128
+ * Inngest durable function template
129
+ */
130
+ export const INNGEST_TEMPLATE = `{{GENERATED_HEADER}}
131
+ import { Inngest } from 'inngest';
132
+ import { serve } from 'inngest/express';
133
+ {{WORKFLOW_IMPORT}}
134
+
135
+ const inngest = new Inngest({ id: 'fw-{{FUNCTION_NAME}}' });
136
+
137
+ const workflowFn = inngest.createFunction(
138
+ { id: '{{FUNCTION_NAME}}', name: '{{FUNCTION_NAME}}' },
139
+ { event: 'fw/{{FUNCTION_NAME}}.execute' },
140
+ async ({ event, step }) => {
141
+ const params = event.data ?? {};
142
+
143
+ const result = await step.run('execute-workflow', async () => {
144
+ return {{FUNCTION_NAME}}(true, params);
145
+ });
146
+
147
+ return { success: true, result };
148
+ }
149
+ );
150
+
151
+ export const handler = serve({ client: inngest, functions: [workflowFn] });
152
+ export default handler;
153
+ `;
154
+ /**
155
+ * SAM (Serverless Application Model) template for AWS Lambda
156
+ */
157
+ export const SAM_TEMPLATE = `AWSTemplateFormatVersion: '2010-09-09'
158
+ Transform: AWS::Serverless-2016-10-31
159
+ Description: Flow Weaver workflow - {{WORKFLOW_NAME}}
160
+
161
+ Globals:
162
+ Function:
163
+ Timeout: 30
164
+ Runtime: nodejs20.x
165
+ MemorySize: 256
166
+
167
+ Resources:
168
+ WorkflowFunction:
169
+ Type: AWS::Serverless::Function
170
+ Properties:
171
+ Handler: handler.handler
172
+ CodeUri: .
173
+ Description: {{WORKFLOW_DESCRIPTION}}
174
+ Events:
175
+ ApiEvent:
176
+ Type: HttpApi
177
+ Properties:
178
+ Path: /{{WORKFLOW_PATH}}
179
+ Method: POST
180
+
181
+ Outputs:
182
+ ApiEndpoint:
183
+ Description: API endpoint URL
184
+ Value: !Sub "https://\${ServerlessHttpApi}.execute-api.\${AWS::Region}.amazonaws.com/{{WORKFLOW_PATH}}"
185
+ `;
186
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Friendly error messages for the Flow Weaver validator.
3
+ *
4
+ * Maps validator error codes to beginner-friendly explanations with
5
+ * contextual details extracted from the original error message.
6
+ */
7
+ export interface TFriendlyError {
8
+ /** Short title (3-5 words) */
9
+ title: string;
10
+ /** Contextual explanation with node/port names from the error */
11
+ explanation: string;
12
+ /** Actionable suggestion for fixing the issue */
13
+ fix: string;
14
+ /** Original validator error code */
15
+ code: string;
16
+ }
17
+ /**
18
+ * Get a friendly error object for a validator error, or null if the code is unmapped.
19
+ */
20
+ export declare function getFriendlyError(error: {
21
+ code: string;
22
+ message: string;
23
+ node?: string;
24
+ }): TFriendlyError | null;
25
+ /**
26
+ * Format all validation errors/warnings with friendly messages.
27
+ * Falls back to the original message for unmapped error codes.
28
+ */
29
+ export declare function formatFriendlyDiagnostics(errors: Array<{
30
+ code: string;
31
+ message: string;
32
+ node?: string;
33
+ type: 'error' | 'warning';
34
+ }>): string;
35
+ //# sourceMappingURL=friendly-errors.d.ts.map
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Friendly error messages for the Flow Weaver validator.
3
+ *
4
+ * Maps validator error codes to beginner-friendly explanations with
5
+ * contextual details extracted from the original error message.
6
+ */
7
+ // ── Helpers to extract contextual info from error messages ──────────────
8
+ function extractQuoted(message) {
9
+ const matches = message.match(/"([^"]+)"/g);
10
+ return matches ? matches.map((m) => m.replace(/"/g, '')) : [];
11
+ }
12
+ function extractTypes(message) {
13
+ // Match patterns like "from STRING to NUMBER" or "(STRING) ... (NUMBER)"
14
+ const fromToMatch = message.match(/from (\w+) to (\w+)/i);
15
+ if (fromToMatch)
16
+ return { source: fromToMatch[1], target: fromToMatch[2] };
17
+ const parenMatch = message.match(/\((\w+)\) .* \((\w+)\)/);
18
+ if (parenMatch)
19
+ return { source: parenMatch[1], target: parenMatch[2] };
20
+ return null;
21
+ }
22
+ function extractCyclePath(message) {
23
+ const match = message.match(/:\s*(.+ -> .+)/);
24
+ return match ? match[1] : null;
25
+ }
26
+ const errorMappers = {
27
+ MISSING_REQUIRED_INPUT(error) {
28
+ const quoted = extractQuoted(error.message);
29
+ const nodeName = quoted[0] || error.node || 'unknown';
30
+ const portName = quoted[1] || 'unknown';
31
+ return {
32
+ title: 'Missing Required Input',
33
+ explanation: `Node '${nodeName}' needs a value for '${portName}' but nothing is connected to it.`,
34
+ fix: `Connect an output port from another node to '${portName}' on '${nodeName}', or mark the port as optional with @input [${portName}].`,
35
+ code: error.code,
36
+ };
37
+ },
38
+ STEP_PORT_TYPE_MISMATCH(error) {
39
+ const quoted = extractQuoted(error.message);
40
+ const portName = quoted[0] || 'unknown';
41
+ return {
42
+ title: 'Wrong Port Type',
43
+ explanation: `Port '${portName}' expects a trigger signal but received data. Connect it to onSuccess or onFailure instead.`,
44
+ fix: 'STEP ports carry control flow signals (like "go next"), not data. Connect data ports to data ports and STEP ports to STEP ports.',
45
+ code: error.code,
46
+ };
47
+ },
48
+ UNKNOWN_NODE_TYPE(error) {
49
+ const quoted = extractQuoted(error.message);
50
+ // Second quoted value is the node type name (first is the instance ID)
51
+ const nodeTypeName = quoted[1] || quoted[0] || 'unknown';
52
+ return {
53
+ title: 'Unknown Node Type',
54
+ explanation: `Node type '${nodeTypeName}' doesn't exist. Did you forget to add @flowWeaver nodeType above the function?`,
55
+ fix: `Add /** @flowWeaver nodeType */ as a JSDoc comment above the function '${nodeTypeName}', or check that the function name is spelled correctly.`,
56
+ code: error.code,
57
+ };
58
+ },
59
+ UNKNOWN_SOURCE_NODE(error) {
60
+ const quoted = extractQuoted(error.message);
61
+ const nodeName = quoted[0] || error.node || 'unknown';
62
+ return {
63
+ title: 'Missing Source Node',
64
+ explanation: `Connection references node '${nodeName}' which doesn't exist in this workflow.`,
65
+ fix: `Add a @node annotation for '${nodeName}' in the workflow JSDoc, or fix the spelling in the @connect annotation.`,
66
+ code: error.code,
67
+ };
68
+ },
69
+ UNKNOWN_TARGET_NODE(error) {
70
+ const quoted = extractQuoted(error.message);
71
+ const nodeName = quoted[0] || error.node || 'unknown';
72
+ return {
73
+ title: 'Missing Target Node',
74
+ explanation: `Connection references node '${nodeName}' which doesn't exist in this workflow.`,
75
+ fix: `Add a @node annotation for '${nodeName}' in the workflow JSDoc, or fix the spelling in the @connect annotation.`,
76
+ code: error.code,
77
+ };
78
+ },
79
+ UNKNOWN_SOURCE_PORT(error) {
80
+ const quoted = extractQuoted(error.message);
81
+ const nodeName = quoted[0] || error.node || 'unknown';
82
+ const portName = quoted[1] || quoted[0] || 'unknown';
83
+ // If the message says 'does not have output port', first quoted is node, second is port
84
+ const hasNodeAndPort = error.message.includes('does not have output port');
85
+ const displayNode = hasNodeAndPort ? quoted[0] : nodeName;
86
+ const displayPort = hasNodeAndPort ? quoted[1] : portName;
87
+ return {
88
+ title: 'Unknown Output Port',
89
+ explanation: `Port '${displayPort}' doesn't exist on node '${displayNode}'. Check the spelling or add the port to the node type.`,
90
+ fix: `Add @output ${displayPort} to the node type's JSDoc, or check the port name in the @connect annotation.`,
91
+ code: error.code,
92
+ };
93
+ },
94
+ UNKNOWN_TARGET_PORT(error) {
95
+ const quoted = extractQuoted(error.message);
96
+ const hasNodeAndPort = error.message.includes('does not have input port');
97
+ const displayNode = hasNodeAndPort ? quoted[0] : (error.node || 'unknown');
98
+ const displayPort = hasNodeAndPort ? quoted[1] : (quoted[0] || 'unknown');
99
+ return {
100
+ title: 'Unknown Input Port',
101
+ explanation: `Port '${displayPort}' doesn't exist on node '${displayNode}'. Check the spelling or add the port to the node type.`,
102
+ fix: `Add @input ${displayPort} to the node type's JSDoc, or check the port name in the @connect annotation.`,
103
+ code: error.code,
104
+ };
105
+ },
106
+ TYPE_MISMATCH(error) {
107
+ const types = extractTypes(error.message);
108
+ const source = types?.source || 'unknown';
109
+ const target = types?.target || 'unknown';
110
+ return {
111
+ title: 'Type Mismatch',
112
+ explanation: `Type mismatch: you're connecting a ${source} to a ${target}. The value will be automatically converted, but this might cause unexpected behavior.`,
113
+ fix: `Add a conversion node between the two ports, or change one of the port types to match. You can also use @strictTypes to turn this into an error.`,
114
+ code: error.code,
115
+ };
116
+ },
117
+ CYCLE_DETECTED(error) {
118
+ const cyclePath = extractCyclePath(error.message);
119
+ const nodeName = error.node || 'unknown';
120
+ return {
121
+ title: 'Circular Dependency Found',
122
+ explanation: `Circular dependency found. Node '${nodeName}' eventually connects back to itself, creating an infinite loop.${cyclePath ? ` Path: ${cyclePath}` : ''}`,
123
+ fix: 'Break the cycle by removing one of the connections in the loop, or use a scoped node (like forEach) for intentional iteration.',
124
+ code: error.code,
125
+ };
126
+ },
127
+ UNUSED_NODE(error) {
128
+ const quoted = extractQuoted(error.message);
129
+ const nodeName = quoted[0] || error.node || 'unknown';
130
+ return {
131
+ title: 'Unused Node',
132
+ explanation: `Node '${nodeName}' is defined but never used in the workflow. Consider removing it or connecting it.`,
133
+ fix: `Connect '${nodeName}' to other nodes with @connect, or remove the @node annotation if it's no longer needed.`,
134
+ code: error.code,
135
+ };
136
+ },
137
+ NO_START_CONNECTIONS(error) {
138
+ return {
139
+ title: 'No Start Connections',
140
+ explanation: 'Your workflow has no connections from the Start node. Nothing will execute.',
141
+ fix: 'Add a @connect Start.execute -> yourNode.execute annotation to kick off the workflow.',
142
+ code: error.code,
143
+ };
144
+ },
145
+ NO_EXIT_CONNECTIONS(error) {
146
+ return {
147
+ title: 'No Exit Connections',
148
+ explanation: "Your workflow has no connections to the Exit node. The workflow won't return any results.",
149
+ fix: 'Add a @connect yourNode.onSuccess -> Exit.onSuccess annotation so the workflow produces output.',
150
+ code: error.code,
151
+ };
152
+ },
153
+ DUPLICATE_NODE_NAME(error) {
154
+ const quoted = extractQuoted(error.message);
155
+ const nodeName = quoted[0] || error.node || 'unknown';
156
+ return {
157
+ title: 'Duplicate Node Name',
158
+ explanation: `Two node types have the same name '${nodeName}'. Each node type needs a unique function name.`,
159
+ fix: `Rename one of the '${nodeName}' functions to give it a unique name.`,
160
+ code: error.code,
161
+ };
162
+ },
163
+ RESERVED_NODE_NAME(error) {
164
+ const quoted = extractQuoted(error.message);
165
+ const nodeName = quoted[0] || error.node || 'unknown';
166
+ return {
167
+ title: 'Reserved Name Used',
168
+ explanation: `'Start' and 'Exit' are reserved names. Choose a different name for your node type.`,
169
+ fix: `Rename '${nodeName}' to something other than 'Start' or 'Exit'. These names are used internally by the workflow engine.`,
170
+ code: error.code,
171
+ };
172
+ },
173
+ MULTIPLE_CONNECTIONS_TO_INPUT(error) {
174
+ const quoted = extractQuoted(error.message);
175
+ const portName = quoted[0] || 'unknown';
176
+ const nodeName = quoted[1] || error.node || 'unknown';
177
+ return {
178
+ title: 'Multiple Input Connections',
179
+ explanation: `Input port '${portName}' on node '${nodeName}' has multiple connections. Only one value can be received — use a merge node instead.`,
180
+ fix: `Remove extra connections to '${nodeName}.${portName}', or add a merge/combine node to join multiple values before connecting.`,
181
+ code: error.code,
182
+ };
183
+ },
184
+ SCOPE_CONSISTENCY_ERROR(error) {
185
+ const quoted = extractQuoted(error.message);
186
+ const scopeName = quoted[0] || error.node || 'unknown';
187
+ return {
188
+ title: 'Scope Mismatch',
189
+ explanation: `The forEach loop '${scopeName}' has mismatched inner connections. Each loop body needs matching start/end connections.`,
190
+ fix: `Check that all scoped nodes inside '${scopeName}' have proper connections from the scope's output ports to input ports.`,
191
+ code: error.code,
192
+ };
193
+ },
194
+ OBJECT_TYPE_MISMATCH(error) {
195
+ const quoted = extractQuoted(error.message);
196
+ const sourceType = quoted[0] || 'unknown';
197
+ const targetType = quoted[1] || 'unknown';
198
+ return {
199
+ title: 'Object Shape Mismatch',
200
+ explanation: `The object shapes don't match. The source provides '${sourceType}' but the target expects '${targetType}'.`,
201
+ fix: 'Verify the object structures are compatible. Add a transformation node if you need to reshape the data.',
202
+ code: error.code,
203
+ };
204
+ },
205
+ MUTABLE_NODE_TYPE_BINDING(error) {
206
+ const quoted = extractQuoted(error.message);
207
+ const nodeName = quoted[0] || error.node || 'unknown';
208
+ const bindingKind = quoted[1] || 'let';
209
+ return {
210
+ title: 'Mutable Node Binding',
211
+ explanation: `Node type '${nodeName}' is declared with '${bindingKind}' which allows accidental reassignment at runtime.`,
212
+ fix: `Use 'function ${nodeName}(...)' or 'const ${nodeName} = ...' instead. Node types must be immutable.`,
213
+ code: error.code,
214
+ };
215
+ },
216
+ UNUSED_OUTPUT_PORT(error) {
217
+ const quoted = extractQuoted(error.message);
218
+ const portName = quoted[0] || 'unknown';
219
+ const nodeName = quoted[1] || error.node || 'unknown';
220
+ return {
221
+ title: 'Unused Output Port',
222
+ explanation: `Output port '${portName}' on node '${nodeName}' is not connected to anything. Its data will be discarded.`,
223
+ fix: `Connect '${nodeName}.${portName}' to another node's input, or remove the @output annotation if it's not needed.`,
224
+ code: error.code,
225
+ };
226
+ },
227
+ UNREACHABLE_EXIT_PORT(error) {
228
+ const quoted = extractQuoted(error.message);
229
+ const portName = quoted[0] || 'unknown';
230
+ return {
231
+ title: 'Unreachable Exit Port',
232
+ explanation: `Exit port '${portName}' has no incoming data. The workflow will return undefined for this output.`,
233
+ fix: `Add a @connect annotation to send data to Exit.${portName}, or remove the @returns ${portName} annotation.`,
234
+ code: error.code,
235
+ };
236
+ },
237
+ MULTIPLE_EXIT_CONNECTIONS(error) {
238
+ const quoted = extractQuoted(error.message);
239
+ const portName = quoted[0] || 'unknown';
240
+ return {
241
+ title: 'Multiple Exit Connections',
242
+ explanation: `Exit port '${portName}' receives data from multiple nodes. Only one value will be used, which may lead to unpredictable results.`,
243
+ fix: `Use separate Exit ports for each source, or add a merge node to combine the values before connecting to Exit.${portName}.`,
244
+ code: error.code,
245
+ };
246
+ },
247
+ ANNOTATION_SIGNATURE_MISMATCH(error) {
248
+ const quoted = extractQuoted(error.message);
249
+ const portName = quoted[0] || 'unknown';
250
+ const nodeName = quoted[1] || error.node || 'unknown';
251
+ return {
252
+ title: 'Optional Port Mismatch',
253
+ explanation: `Port '${portName}' on '${nodeName}' is optional in the TypeScript signature but required in the annotation.`,
254
+ fix: `Use @input [${portName}] (with brackets) to mark the port as optional in the annotation, matching the TypeScript signature.`,
255
+ code: error.code,
256
+ };
257
+ },
258
+ ANNOTATION_SIGNATURE_TYPE_MISMATCH(error) {
259
+ const quoted = extractQuoted(error.message);
260
+ const portName = quoted[0] || 'unknown';
261
+ const nodeName = quoted[1] || error.node || 'unknown';
262
+ const annotationType = quoted[2] || 'unknown';
263
+ const sigType = quoted[3] || 'unknown';
264
+ return {
265
+ title: 'Annotation Type Mismatch',
266
+ explanation: `Port '${portName}' on '${nodeName}' has type '${annotationType}' in the annotation but '${sigType}' in the TypeScript signature.`,
267
+ fix: `Update the @input/@output annotation type to match the function signature, or change the signature type. The annotation and TypeScript types should agree.`,
268
+ code: error.code,
269
+ };
270
+ },
271
+ // ── Agent-specific rules ──────────────────────────────────────────────
272
+ AGENT_LLM_MISSING_ERROR_HANDLER(error) {
273
+ const nodeName = error.node || 'unknown';
274
+ return {
275
+ title: 'LLM Missing Error Handler',
276
+ explanation: `LLM node '${nodeName}' has no error handler. LLM calls can fail due to rate limits, timeouts, or model errors, and failures will be silently swallowed.`,
277
+ fix: `Connect ${nodeName}.onFailure to a retry node, fallback handler, or Exit.onFailure to handle LLM errors gracefully.`,
278
+ code: error.code,
279
+ };
280
+ },
281
+ AGENT_UNGUARDED_TOOL_EXECUTOR(error) {
282
+ const nodeName = error.node || 'unknown';
283
+ return {
284
+ title: 'Unguarded Tool Executor',
285
+ explanation: `Tool executor '${nodeName}' has no human approval gate upstream. If it performs destructive actions (writes, deletes, sends), this could be unsafe.`,
286
+ fix: `Add a human-approval node before '${nodeName}' to gate destructive tool calls. If this tool is read-only, you can safely ignore this warning.`,
287
+ code: error.code,
288
+ };
289
+ },
290
+ AGENT_MISSING_MEMORY_IN_LOOP(error) {
291
+ const quoted = extractQuoted(error.message);
292
+ const scopeName = quoted[0] || 'the loop';
293
+ return {
294
+ title: 'No Memory in Agent Loop',
295
+ explanation: `Loop scope '${scopeName}' contains an LLM node but no conversation memory. The LLM will lose context between loop iterations.`,
296
+ fix: `Add a conversation-memory node inside the loop to persist messages between iterations, so the LLM retains context across loop cycles.`,
297
+ code: error.code,
298
+ };
299
+ },
300
+ AGENT_LLM_NO_FALLBACK(error) {
301
+ const nodeName = error.node || 'unknown';
302
+ return {
303
+ title: 'LLM Failure Goes to Exit',
304
+ explanation: `LLM node '${nodeName}' routes failures directly to Exit, meaning any LLM error immediately aborts the entire workflow.`,
305
+ fix: `Add a retry node or fallback LLM provider between ${nodeName}.onFailure and Exit to improve resilience against transient LLM failures.`,
306
+ code: error.code,
307
+ };
308
+ },
309
+ AGENT_TOOL_NO_OUTPUT_HANDLING(error) {
310
+ const nodeName = error.node || 'unknown';
311
+ return {
312
+ title: 'Tool Results Discarded',
313
+ explanation: `Tool executor '${nodeName}' computes results but none of its data output ports are connected. Tool results are being thrown away.`,
314
+ fix: `Connect the data output ports of '${nodeName}' (e.g., result, resultMessage) to downstream nodes, or remove this tool executor if its results aren't needed.`,
315
+ code: error.code,
316
+ };
317
+ },
318
+ LOSSY_TYPE_COERCION(error) {
319
+ const types = extractTypes(error.message);
320
+ const source = types?.source || 'unknown';
321
+ const target = types?.target || 'unknown';
322
+ return {
323
+ title: 'Lossy Type Conversion',
324
+ explanation: `Converting ${source} to ${target} may lose data or produce unexpected results (e.g., NaN, truncation).`,
325
+ fix: `Add an explicit conversion node, or use @strictTypes on the workflow to enforce type safety and catch these at validation time.`,
326
+ code: error.code,
327
+ };
328
+ },
329
+ INVALID_EXIT_PORT_TYPE(error) {
330
+ const quoted = extractQuoted(error.message);
331
+ const portName = quoted[0] || 'onSuccess';
332
+ return {
333
+ title: 'Invalid Exit Port Type',
334
+ explanation: `Exit port '${portName}' must be STEP type (control flow signal), but a different type was found. onSuccess and onFailure are control flow ports, not data ports.`,
335
+ fix: `Connect a STEP-type output (like onSuccess or onFailure) to Exit.${portName}. Don't connect data ports to control flow ports.`,
336
+ code: error.code,
337
+ };
338
+ },
339
+ };
340
+ // ── Public API ─────────────────────────────────────────────────────────
341
+ /**
342
+ * Get a friendly error object for a validator error, or null if the code is unmapped.
343
+ */
344
+ export function getFriendlyError(error) {
345
+ const mapper = errorMappers[error.code];
346
+ if (!mapper)
347
+ return null;
348
+ return mapper(error);
349
+ }
350
+ /**
351
+ * Format all validation errors/warnings with friendly messages.
352
+ * Falls back to the original message for unmapped error codes.
353
+ */
354
+ export function formatFriendlyDiagnostics(errors) {
355
+ if (errors.length === 0)
356
+ return '';
357
+ const lines = [];
358
+ for (const error of errors) {
359
+ const friendly = getFriendlyError(error);
360
+ const severity = error.type === 'error' ? 'ERROR' : 'WARNING';
361
+ if (friendly) {
362
+ lines.push(`[${severity}] ${friendly.title}`);
363
+ lines.push(` ${friendly.explanation}`);
364
+ lines.push(` How to fix: ${friendly.fix}`);
365
+ lines.push(` Code: ${friendly.code}`);
366
+ }
367
+ else {
368
+ lines.push(`[${severity}] ${error.code}`);
369
+ lines.push(` ${error.message}`);
370
+ }
371
+ lines.push('');
372
+ }
373
+ return lines.join('\n');
374
+ }
375
+ //# sourceMappingURL=friendly-errors.js.map
@@ -0,0 +1,38 @@
1
+ /**
2
+ * FunctionLike interface
3
+ *
4
+ * Abstracts over FunctionDeclaration and arrow/function-expression variable
5
+ * declarations so the JSDoc parser and annotation parser can handle both
6
+ * syntactic forms uniformly.
7
+ */
8
+ import { type SourceFile, type JSDoc, type ParameterDeclaration, type Type, Node } from 'ts-morph';
9
+ /**
10
+ * Minimal interface that both FunctionDeclaration and our arrow-function
11
+ * adapter satisfy. Every method used by jsdoc-parser and parser is listed here.
12
+ */
13
+ export interface FunctionLike {
14
+ getJsDocs(): JSDoc[];
15
+ getName(): string | undefined;
16
+ isAsync(): boolean;
17
+ getParameters(): ParameterDeclaration[];
18
+ getReturnType(): Type;
19
+ getStartLineNumber(includeJsDocComments?: boolean): number;
20
+ getText(includeJsDocComments?: boolean): string;
21
+ getSourceFile(): SourceFile;
22
+ /** For arrow/function-expression declarations, returns 'const', 'let', or 'var'. Undefined for FunctionDeclaration. */
23
+ getDeclarationKind?(): 'const' | 'let' | 'var' | undefined;
24
+ /** Returns the underlying ts-morph Node for type resolution (e.g., Symbol.getTypeAtLocation). */
25
+ getTypeResolutionNode(): Node;
26
+ }
27
+ /**
28
+ * Scan a source file and return every function-like declaration that could
29
+ * carry @flowWeaver annotations:
30
+ *
31
+ * 1. Classic `function foo() {}` — FunctionDeclaration (existing)
32
+ * 2. `const foo = () => {}` — ArrowFunction assigned to variable
33
+ * 3. `const foo = function() {}` — FunctionExpression assigned to variable
34
+ *
35
+ * The returned list preserves source order.
36
+ */
37
+ export declare function extractFunctionLikes(sourceFile: SourceFile): FunctionLike[];
38
+ //# sourceMappingURL=function-like.d.ts.map