@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,926 @@
1
+ /**
2
+ * Inngest export target
3
+ *
4
+ * Generates durable, event-driven functions using the Inngest platform.
5
+ * Each workflow becomes an Inngest function triggered by a custom event,
6
+ * served via an HTTP endpoint compatible with any framework (Express, Next.js, etc.).
7
+ */
8
+ import { BaseExportTarget, } from './base.js';
9
+ import { getGeneratedBranding } from '../../generated-branding.js';
10
+ import { generateStandaloneRuntimeModule } from '../../api/inline-runtime.js';
11
+ import { generateInngestFunction } from '../../generator/inngest.js';
12
+ import { AnnotationParser } from '../../parser.js';
13
+ /**
14
+ * Single-workflow Inngest handler template
15
+ */
16
+ const INNGEST_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
17
+ import { Inngest } from 'inngest';
18
+ import { serve } from 'inngest/express';
19
+ {{WORKFLOW_IMPORT}}
20
+
21
+ const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
22
+
23
+ export const {{FUNCTION_VAR}} = inngest.createFunction(
24
+ { id: '{{FUNCTION_ID}}', name: '{{FUNCTION_DISPLAY_NAME}}' },
25
+ { event: '{{EVENT_NAME}}' },
26
+ async ({ event, step }) => {
27
+ const params = event.data ?? {};
28
+
29
+ const result = await step.run('execute-workflow', async () => {
30
+ return {{FUNCTION_NAME}}(true, params);
31
+ });
32
+
33
+ return { success: true, result };
34
+ }
35
+ );
36
+
37
+ // Serve endpoint — mount this on your HTTP framework
38
+ // Express: app.use('/api/inngest', serve({ client: inngest, functions: [{{FUNCTION_VAR}}] }));
39
+ // Next.js: export default serve({ client: inngest, functions: [{{FUNCTION_VAR}}] });
40
+ export const handler = serve({ client: inngest, functions: [{{FUNCTION_VAR}}] });
41
+ export default handler;
42
+ `;
43
+ /**
44
+ * Single-workflow Inngest handler template with docs routes
45
+ */
46
+ const INNGEST_HANDLER_WITH_DOCS_TEMPLATE = `{{GENERATED_HEADER}}
47
+ import { Inngest } from 'inngest';
48
+ import { serve } from 'inngest/express';
49
+ import express from 'express';
50
+ {{WORKFLOW_IMPORT}}
51
+ import { openApiSpec } from './openapi.js';
52
+
53
+ const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
54
+
55
+ export const {{FUNCTION_VAR}} = inngest.createFunction(
56
+ { id: '{{FUNCTION_ID}}', name: '{{FUNCTION_DISPLAY_NAME}}' },
57
+ { event: '{{EVENT_NAME}}' },
58
+ async ({ event, step }) => {
59
+ const params = event.data ?? {};
60
+
61
+ const result = await step.run('execute-workflow', async () => {
62
+ return {{FUNCTION_NAME}}(true, params);
63
+ });
64
+
65
+ return { success: true, result };
66
+ }
67
+ );
68
+
69
+ // Create Express app with Inngest serve + docs routes
70
+ const app = express();
71
+
72
+ // Inngest serve endpoint
73
+ app.use('/api/inngest', serve({ client: inngest, functions: [{{FUNCTION_VAR}}] }));
74
+
75
+ // OpenAPI spec
76
+ app.get('/api/openapi.json', (_req, res) => {
77
+ res.json(openApiSpec);
78
+ });
79
+
80
+ // Swagger UI
81
+ app.get('/api/docs', (_req, res) => {
82
+ res.setHeader('Content-Type', 'text/html');
83
+ res.send(\`<!DOCTYPE html>
84
+ <html lang="en">
85
+ <head>
86
+ <meta charset="UTF-8">
87
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
88
+ <title>{{FUNCTION_DISPLAY_NAME}} API Documentation</title>
89
+ <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
90
+ </head>
91
+ <body>
92
+ <div id="swagger-ui"></div>
93
+ <script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
94
+ <script>
95
+ SwaggerUIBundle({
96
+ url: '/api/openapi.json',
97
+ dom_id: '#swagger-ui',
98
+ presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
99
+ layout: 'BaseLayout'
100
+ });
101
+ </script>
102
+ </body>
103
+ </html>\`);
104
+ });
105
+
106
+ export const handler = app;
107
+ export default app;
108
+ `;
109
+ /**
110
+ * OpenAPI spec file template
111
+ */
112
+ const OPENAPI_SPEC_TEMPLATE = `// Generated OpenAPI specification
113
+ export const openApiSpec = {{OPENAPI_SPEC}};
114
+ `;
115
+ /**
116
+ * Multi-workflow Inngest handler template
117
+ */
118
+ const INNGEST_MULTI_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
119
+ import { Inngest } from 'inngest';
120
+ import { serve } from 'inngest/express';
121
+ import express from 'express';
122
+ {{WORKFLOW_IMPORTS}}
123
+ import { functionRegistry } from './runtime/function-registry.js';
124
+ import './runtime/builtin-functions.js';
125
+ import { openApiSpec } from './openapi.js';
126
+
127
+ const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
128
+
129
+ {{FUNCTION_DEFINITIONS}}
130
+
131
+ const functions = [{{FUNCTION_LIST}}];
132
+
133
+ // Create Express app with Inngest serve + API routes
134
+ const app = express();
135
+ app.use(express.json());
136
+
137
+ // Inngest serve endpoint
138
+ app.use('/api/inngest', serve({ client: inngest, functions }));
139
+
140
+ // OpenAPI spec
141
+ app.get('/api/openapi.json', (_req, res) => {
142
+ res.json(openApiSpec);
143
+ });
144
+
145
+ // Swagger UI
146
+ app.get('/api/docs', (_req, res) => {
147
+ res.setHeader('Content-Type', 'text/html');
148
+ res.send(\`<!DOCTYPE html>
149
+ <html lang="en">
150
+ <head>
151
+ <meta charset="UTF-8">
152
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
153
+ <title>{{SERVICE_NAME}} API Documentation</title>
154
+ <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
155
+ </head>
156
+ <body>
157
+ <div id="swagger-ui"></div>
158
+ <script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
159
+ <script>
160
+ SwaggerUIBundle({
161
+ url: '/api/openapi.json',
162
+ dom_id: '#swagger-ui',
163
+ presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
164
+ layout: 'BaseLayout'
165
+ });
166
+ </script>
167
+ </body>
168
+ </html>\`);
169
+ });
170
+
171
+ // List available functions
172
+ app.get('/api/functions', (req, res) => {
173
+ const category = req.query.category as string | undefined;
174
+ res.json(functionRegistry.list(category as any));
175
+ });
176
+
177
+ // Direct invocation endpoint (bypasses Inngest event system)
178
+ app.post('/api/invoke/:workflowName', async (req, res) => {
179
+ const { workflowName } = req.params;
180
+ const handler = directHandlers[workflowName];
181
+ if (!handler) {
182
+ return res.status(404).json({ error: \`Workflow '\${workflowName}' not found\`, availableWorkflows: Object.keys(directHandlers) });
183
+ }
184
+
185
+ try {
186
+ const startTime = Date.now();
187
+ const result = await handler(true, req.body || {});
188
+ res.json({ success: true, result, executionTime: Date.now() - startTime });
189
+ } catch (error) {
190
+ res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
191
+ }
192
+ });
193
+
194
+ // Direct handler map for synchronous invocation
195
+ type WorkflowHandler = (execute: boolean, params: Record<string, unknown>) => unknown;
196
+ const directHandlers: Record<string, WorkflowHandler> = {
197
+ {{WORKFLOW_ENTRIES}}
198
+ };
199
+
200
+ export const handler = app;
201
+ export default app;
202
+ `;
203
+ /**
204
+ * Node type handler template for Inngest
205
+ */
206
+ const INNGEST_NODE_TYPE_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
207
+ import { Inngest } from 'inngest';
208
+ import { serve } from 'inngest/express';
209
+ import express from 'express';
210
+ {{NODE_TYPE_IMPORTS}}
211
+ import { openApiSpec } from './openapi.js';
212
+
213
+ const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
214
+
215
+ {{FUNCTION_DEFINITIONS}}
216
+
217
+ const functions = [{{FUNCTION_LIST}}];
218
+
219
+ // Node type handler map for direct invocation
220
+ type NodeTypeHandler = (execute: boolean, params: Record<string, unknown>) => unknown;
221
+ const nodeTypes: Record<string, NodeTypeHandler> = {
222
+ {{NODE_TYPE_ENTRIES}}
223
+ };
224
+
225
+ // Create Express app with Inngest serve + API routes
226
+ const app = express();
227
+ app.use(express.json());
228
+
229
+ // Inngest serve endpoint
230
+ app.use('/api/inngest', serve({ client: inngest, functions }));
231
+
232
+ // OpenAPI spec
233
+ app.get('/api/openapi.json', (_req, res) => {
234
+ res.json(openApiSpec);
235
+ });
236
+
237
+ // Swagger UI
238
+ app.get('/api/docs', (_req, res) => {
239
+ res.setHeader('Content-Type', 'text/html');
240
+ res.send(\`<!DOCTYPE html>
241
+ <html lang="en">
242
+ <head>
243
+ <meta charset="UTF-8">
244
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
245
+ <title>{{SERVICE_NAME}} API Documentation</title>
246
+ <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
247
+ </head>
248
+ <body>
249
+ <div id="swagger-ui"></div>
250
+ <script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
251
+ <script>
252
+ SwaggerUIBundle({
253
+ url: '/api/openapi.json',
254
+ dom_id: '#swagger-ui',
255
+ presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
256
+ layout: 'BaseLayout'
257
+ });
258
+ </script>
259
+ </body>
260
+ </html>\`);
261
+ });
262
+
263
+ // Direct invocation endpoint
264
+ app.post('/api/nodes/:nodeTypeName', async (req, res) => {
265
+ const { nodeTypeName } = req.params;
266
+ const nodeType = nodeTypes[nodeTypeName];
267
+ if (!nodeType) {
268
+ return res.status(404).json({ error: \`Node type '\${nodeTypeName}' not found\`, availableNodeTypes: Object.keys(nodeTypes) });
269
+ }
270
+
271
+ try {
272
+ const startTime = Date.now();
273
+ const result = await nodeType(true, req.body || {});
274
+ res.json({ success: true, result, executionTime: Date.now() - startTime });
275
+ } catch (error) {
276
+ res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
277
+ }
278
+ });
279
+
280
+ export const handler = app;
281
+ export default app;
282
+ `;
283
+ /**
284
+ * Bundle handler template for Inngest — unified workflows and node types
285
+ */
286
+ const INNGEST_BUNDLE_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
287
+ import { Inngest } from 'inngest';
288
+ import { serve } from 'inngest/express';
289
+ import express from 'express';
290
+ {{WORKFLOW_IMPORTS}}
291
+ {{NODE_TYPE_IMPORTS}}
292
+ import { functionRegistry } from './runtime/function-registry.js';
293
+ import './runtime/builtin-functions.js';
294
+ import { openApiSpec } from './openapi.js';
295
+
296
+ const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
297
+
298
+ // --- Inngest function definitions ---
299
+ {{FUNCTION_DEFINITIONS}}
300
+
301
+ const functions = [{{FUNCTION_LIST}}];
302
+
303
+ // --- Direct handler maps for synchronous invocation ---
304
+ type FunctionHandler = (execute: boolean, params: Record<string, unknown>) => unknown;
305
+
306
+ const exposedWorkflows: Record<string, FunctionHandler> = {
307
+ {{EXPOSED_WORKFLOW_ENTRIES}}
308
+ };
309
+
310
+ const exposedNodeTypes: Record<string, FunctionHandler> = {
311
+ {{EXPOSED_NODE_TYPE_ENTRIES}}
312
+ };
313
+
314
+ // Create Express app with Inngest serve + API routes
315
+ const app = express();
316
+ app.use(express.json());
317
+
318
+ // Inngest serve endpoint
319
+ app.use('/api/inngest', serve({ client: inngest, functions }));
320
+
321
+ // OpenAPI spec
322
+ app.get('/api/openapi.json', (_req, res) => {
323
+ res.json(openApiSpec);
324
+ });
325
+
326
+ // Swagger UI
327
+ app.get('/api/docs', (_req, res) => {
328
+ res.setHeader('Content-Type', 'text/html');
329
+ res.send(\`<!DOCTYPE html>
330
+ <html lang="en">
331
+ <head>
332
+ <meta charset="UTF-8">
333
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
334
+ <title>{{SERVICE_NAME}} API Documentation</title>
335
+ <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
336
+ </head>
337
+ <body>
338
+ <div id="swagger-ui"></div>
339
+ <script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
340
+ <script>
341
+ SwaggerUIBundle({
342
+ url: '/api/openapi.json',
343
+ dom_id: '#swagger-ui',
344
+ presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
345
+ layout: 'BaseLayout'
346
+ });
347
+ </script>
348
+ </body>
349
+ </html>\`);
350
+ });
351
+
352
+ // List available functions
353
+ app.get('/api/functions', (req, res) => {
354
+ const category = req.query.category as string | undefined;
355
+ res.json(functionRegistry.list(category as any));
356
+ });
357
+
358
+ // Direct invocation: workflows
359
+ app.post('/api/workflows/:name', async (req, res) => {
360
+ const workflow = exposedWorkflows[req.params.name];
361
+ if (!workflow) {
362
+ return res.status(404).json({ error: \`Workflow '\${req.params.name}' not found\`, availableWorkflows: Object.keys(exposedWorkflows) });
363
+ }
364
+ try {
365
+ const startTime = Date.now();
366
+ const result = await workflow(true, req.body || {});
367
+ res.json({ success: true, result, executionTime: Date.now() - startTime });
368
+ } catch (error) {
369
+ res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
370
+ }
371
+ });
372
+
373
+ // Direct invocation: node types
374
+ app.post('/api/nodes/:name', async (req, res) => {
375
+ const nodeType = exposedNodeTypes[req.params.name];
376
+ if (!nodeType) {
377
+ return res.status(404).json({ error: \`Node type '\${req.params.name}' not found\`, availableNodeTypes: Object.keys(exposedNodeTypes) });
378
+ }
379
+ try {
380
+ const startTime = Date.now();
381
+ const result = await nodeType(true, req.body || {});
382
+ res.json({ success: true, result, executionTime: Date.now() - startTime });
383
+ } catch (error) {
384
+ res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
385
+ }
386
+ });
387
+
388
+ export const handler = app;
389
+ export default app;
390
+ `;
391
+ /**
392
+ * Inngest export target — durable, event-driven functions
393
+ */
394
+ export class InngestTarget extends BaseExportTarget {
395
+ name = 'inngest';
396
+ description = 'Inngest — durable, event-driven workflow functions';
397
+ /**
398
+ * Sanitize a name into a valid Inngest ID (lowercase, alphanumeric + hyphens)
399
+ */
400
+ toInngestId(name) {
401
+ return name
402
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
403
+ .replace(/[^a-zA-Z0-9-]/g, '-')
404
+ .replace(/-+/g, '-')
405
+ .toLowerCase();
406
+ }
407
+ /**
408
+ * Convert a name to a valid JS variable name
409
+ */
410
+ toVarName(name) {
411
+ return name.replace(/[^a-zA-Z0-9_$]/g, '_').replace(/^(\d)/, '_$1');
412
+ }
413
+ async generate(options) {
414
+ const files = [];
415
+ const includeDocs = options.includeDocs ?? false;
416
+ const durableSteps = options.targetOptions?.durableSteps === true;
417
+ const serviceId = this.toInngestId(options.displayName);
418
+ const functionId = this.toInngestId(options.workflowName);
419
+ const functionVar = `fn_${this.toVarName(options.workflowName)}`;
420
+ let handlerContent;
421
+ if (durableSteps && options.sourceFile) {
422
+ // Use deep generator: parse source file and generate per-node step.run() code
423
+ const parser = new AnnotationParser();
424
+ const parseResult = parser.parse(options.sourceFile);
425
+ const workflow = parseResult.workflows.find((w) => w.name === options.workflowName || w.functionName === options.workflowName) ?? parseResult.workflows[0];
426
+ if (workflow) {
427
+ const allNodeTypes = [...(workflow.nodeTypes || [])];
428
+ handlerContent = generateInngestFunction(workflow, allNodeTypes, {
429
+ serviceName: serviceId,
430
+ production: options.production ?? true,
431
+ });
432
+ }
433
+ else {
434
+ // Fallback to shallow template if workflow not found
435
+ handlerContent = this.generateShallowHandler(options, includeDocs, serviceId, functionId, functionVar);
436
+ }
437
+ }
438
+ else {
439
+ handlerContent = this.generateShallowHandler(options, includeDocs, serviceId, functionId, functionVar);
440
+ }
441
+ files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
442
+ // Generate OpenAPI spec file if docs enabled
443
+ if (includeDocs) {
444
+ const openApiSpec = this.generateOpenAPISpec(options);
445
+ const openApiContent = OPENAPI_SPEC_TEMPLATE.replace('{{OPENAPI_SPEC}}', JSON.stringify(openApiSpec, null, 2));
446
+ files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
447
+ }
448
+ // Generate package.json
449
+ const packageJson = this.generatePackageJson({
450
+ name: options.displayName,
451
+ description: options.description,
452
+ main: 'handler.js',
453
+ scripts: {
454
+ build: 'tsc',
455
+ dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
456
+ serve: 'npx tsx handler.ts',
457
+ },
458
+ dependencies: {
459
+ inngest: '^3.0.0',
460
+ ...(includeDocs ? { express: '^4.18.0' } : {}),
461
+ },
462
+ devDependencies: {
463
+ ...(includeDocs ? { '@types/express': '^4.17.0' } : {}),
464
+ },
465
+ });
466
+ files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
467
+ // Generate tsconfig.json
468
+ const tsConfig = this.generateTsConfig({
469
+ outDir: './dist',
470
+ module: 'NodeNext',
471
+ moduleResolution: 'NodeNext',
472
+ });
473
+ files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
474
+ // Generate README from deploy instructions
475
+ const artifacts = {
476
+ files,
477
+ target: this.name,
478
+ workflowName: options.displayName,
479
+ entryPoint: 'handler.ts',
480
+ };
481
+ const instructions = this.getDeployInstructions(artifacts);
482
+ const readme = this.generateReadme(instructions, options.displayName, 'Inngest');
483
+ files.push(this.createFile(options.outputDir, 'README.md', readme, 'other'));
484
+ return artifacts;
485
+ }
486
+ /**
487
+ * Generate the shallow (template-based) handler content.
488
+ * Wraps the entire workflow in a single step.run() call.
489
+ */
490
+ generateShallowHandler(options, includeDocs, serviceId, functionId, functionVar) {
491
+ const handlerTemplate = includeDocs
492
+ ? INNGEST_HANDLER_WITH_DOCS_TEMPLATE
493
+ : INNGEST_HANDLER_TEMPLATE;
494
+ return handlerTemplate
495
+ .replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest'))
496
+ .replace('{{WORKFLOW_IMPORT}}', `import { ${options.workflowName} } from './workflow.js';`)
497
+ .replace(/\{\{SERVICE_ID\}\}/g, serviceId)
498
+ .replace(/\{\{FUNCTION_ID\}\}/g, functionId)
499
+ .replace(/\{\{FUNCTION_VAR\}\}/g, functionVar)
500
+ .replace(/\{\{FUNCTION_DISPLAY_NAME\}\}/g, options.displayName)
501
+ .replace(/\{\{FUNCTION_NAME\}\}/g, options.workflowName)
502
+ .replace(/\{\{EVENT_NAME\}\}/g, `fw/${functionId}.execute`);
503
+ }
504
+ /**
505
+ * Generate OpenAPI specification for a single workflow
506
+ */
507
+ generateOpenAPISpec(options) {
508
+ return {
509
+ openapi: '3.0.3',
510
+ info: {
511
+ title: `${options.displayName} API`,
512
+ version: '1.0.0',
513
+ description: options.description || `Inngest-powered API for the ${options.displayName} workflow`,
514
+ },
515
+ servers: [{ url: '/', description: 'Current deployment' }],
516
+ paths: {
517
+ '/api/inngest': {
518
+ post: {
519
+ operationId: 'inngest_webhook',
520
+ summary: 'Inngest webhook endpoint',
521
+ description: 'Receives events from Inngest. Send events via the Inngest SDK or dashboard.',
522
+ tags: ['inngest'],
523
+ requestBody: {
524
+ description: 'Inngest event payload',
525
+ required: true,
526
+ content: { 'application/json': { schema: { type: 'object' } } },
527
+ },
528
+ responses: {
529
+ '200': { description: 'Event acknowledged' },
530
+ },
531
+ },
532
+ },
533
+ },
534
+ tags: [
535
+ { name: 'inngest', description: 'Inngest event endpoints' },
536
+ ],
537
+ 'x-inngest-events': {
538
+ [`fw/${this.toInngestId(options.workflowName)}.execute`]: {
539
+ description: `Trigger ${options.displayName} workflow execution`,
540
+ schema: {
541
+ type: 'object',
542
+ properties: {
543
+ name: { type: 'string', const: `fw/${this.toInngestId(options.workflowName)}.execute` },
544
+ data: { type: 'object', description: 'Workflow input parameters' },
545
+ },
546
+ },
547
+ },
548
+ },
549
+ };
550
+ }
551
+ async generateMultiWorkflow(workflows, options) {
552
+ const files = [];
553
+ const serviceName = options.displayName || 'multi-workflow-service';
554
+ const serviceId = this.toInngestId(serviceName);
555
+ // Generate workflow imports
556
+ const workflowImports = workflows
557
+ .map((w) => `import { ${w.functionName} } from './workflows/${w.name}.js';`)
558
+ .join('\n');
559
+ // Generate Inngest function definitions
560
+ const functionDefs = workflows.map((w) => {
561
+ const fnId = this.toInngestId(w.name);
562
+ const fnVar = `fn_${this.toVarName(w.functionName)}`;
563
+ return `export const ${fnVar} = inngest.createFunction(
564
+ { id: '${fnId}', name: '${w.name}' },
565
+ { event: 'fw/${fnId}.execute' },
566
+ async ({ event, step }) => {
567
+ const params = event.data ?? {};
568
+ const result = await step.run('execute-workflow', async () => {
569
+ return ${w.functionName}(true, params);
570
+ });
571
+ return { success: true, result };
572
+ }
573
+ );`;
574
+ }).join('\n\n');
575
+ const functionList = workflows
576
+ .map((w) => `fn_${this.toVarName(w.functionName)}`)
577
+ .join(', ');
578
+ const workflowEntries = workflows
579
+ .map((w) => ` '${w.name}': ${w.functionName},`)
580
+ .join('\n');
581
+ // Generate handler
582
+ const handlerContent = INNGEST_MULTI_HANDLER_TEMPLATE
583
+ .replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest --multi'))
584
+ .replace('{{WORKFLOW_IMPORTS}}', workflowImports)
585
+ .replace('{{FUNCTION_DEFINITIONS}}', functionDefs)
586
+ .replace('{{FUNCTION_LIST}}', functionList)
587
+ .replace('{{WORKFLOW_ENTRIES}}', workflowEntries)
588
+ .replace(/\{\{SERVICE_ID\}\}/g, serviceId)
589
+ .replace(/\{\{SERVICE_NAME\}\}/g, serviceName);
590
+ files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
591
+ // Generate consolidated OpenAPI spec
592
+ const openApiSpec = this.generateConsolidatedOpenAPI(workflows, {
593
+ title: `${serviceName} API`,
594
+ version: '1.0.0',
595
+ });
596
+ const openApiContent = `// Generated OpenAPI specification\nexport const openApiSpec = ${JSON.stringify(openApiSpec, null, 2)};\n`;
597
+ files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
598
+ // Generate package.json
599
+ const packageJson = this.generatePackageJson({
600
+ name: serviceName,
601
+ description: `Inngest multi-workflow service with ${workflows.length} workflows`,
602
+ main: 'handler.js',
603
+ scripts: {
604
+ build: 'tsc',
605
+ dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
606
+ serve: 'npx tsx handler.ts',
607
+ },
608
+ dependencies: {
609
+ inngest: '^3.0.0',
610
+ express: '^4.18.0',
611
+ },
612
+ devDependencies: {
613
+ '@types/express': '^4.17.0',
614
+ },
615
+ });
616
+ files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
617
+ // Generate tsconfig.json
618
+ const tsConfig = this.generateTsConfig({
619
+ outDir: './dist',
620
+ module: 'NodeNext',
621
+ moduleResolution: 'NodeNext',
622
+ });
623
+ files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
624
+ // Generate workflow content files
625
+ files.push(...this.generateWorkflowContentFiles(workflows, options.outputDir));
626
+ return {
627
+ files,
628
+ target: this.name,
629
+ workflowName: serviceName,
630
+ workflowNames: workflows.map((w) => w.name),
631
+ entryPoint: 'handler.ts',
632
+ openApiSpec,
633
+ };
634
+ }
635
+ async generateNodeTypeService(nodeTypes, options) {
636
+ const files = [];
637
+ const serviceName = options.serviceName || 'node-type-service';
638
+ const serviceId = this.toInngestId(serviceName);
639
+ // Generate node type imports
640
+ const nodeTypeImports = nodeTypes
641
+ .map((nt) => `import { ${nt.functionName} } from './node-types/${nt.functionName.toLowerCase()}.js';`)
642
+ .join('\n');
643
+ // Generate Inngest function definitions
644
+ const functionDefs = nodeTypes.map((nt) => {
645
+ const fnId = this.toInngestId(nt.name);
646
+ const fnVar = `fn_${this.toVarName(nt.functionName)}`;
647
+ return `export const ${fnVar} = inngest.createFunction(
648
+ { id: '${fnId}', name: '${nt.name}' },
649
+ { event: 'fw/${fnId}.execute' },
650
+ async ({ event, step }) => {
651
+ const params = event.data ?? {};
652
+ const result = await step.run('execute-node-type', async () => {
653
+ return ${nt.functionName}(true, params);
654
+ });
655
+ return { success: true, result };
656
+ }
657
+ );`;
658
+ }).join('\n\n');
659
+ const functionList = nodeTypes
660
+ .map((nt) => `fn_${this.toVarName(nt.functionName)}`)
661
+ .join(', ');
662
+ const nodeTypeEntries = nodeTypes
663
+ .map((nt) => ` '${nt.name}': ${nt.functionName},`)
664
+ .join('\n');
665
+ // Generate handler
666
+ const handlerContent = INNGEST_NODE_TYPE_HANDLER_TEMPLATE
667
+ .replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest --node-types'))
668
+ .replace('{{NODE_TYPE_IMPORTS}}', nodeTypeImports)
669
+ .replace('{{FUNCTION_DEFINITIONS}}', functionDefs)
670
+ .replace('{{FUNCTION_LIST}}', functionList)
671
+ .replace('{{NODE_TYPE_ENTRIES}}', nodeTypeEntries)
672
+ .replace(/\{\{SERVICE_ID\}\}/g, serviceId)
673
+ .replace(/\{\{SERVICE_NAME\}\}/g, serviceName);
674
+ files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
675
+ // Generate OpenAPI spec
676
+ const openApiSpec = this.generateNodeTypeOpenAPI(nodeTypes, {
677
+ title: `${serviceName} API`,
678
+ version: '1.0.0',
679
+ });
680
+ const openApiContent = `// Generated OpenAPI specification\nexport const openApiSpec = ${JSON.stringify(openApiSpec, null, 2)};\n`;
681
+ files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
682
+ // Generate package.json
683
+ const packageJson = this.generatePackageJson({
684
+ name: serviceName,
685
+ description: `Inngest node type service with ${nodeTypes.length} endpoints`,
686
+ main: 'handler.js',
687
+ scripts: {
688
+ build: 'tsc',
689
+ dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
690
+ serve: 'npx tsx handler.ts',
691
+ },
692
+ dependencies: {
693
+ inngest: '^3.0.0',
694
+ express: '^4.18.0',
695
+ },
696
+ devDependencies: {
697
+ '@types/express': '^4.17.0',
698
+ },
699
+ });
700
+ files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
701
+ // Generate tsconfig.json
702
+ const tsConfig = this.generateTsConfig({
703
+ outDir: './dist',
704
+ module: 'NodeNext',
705
+ moduleResolution: 'NodeNext',
706
+ });
707
+ files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
708
+ // Generate node-type content files
709
+ files.push(...this.generateNodeTypeContentFiles(nodeTypes, options.outputDir));
710
+ return {
711
+ files,
712
+ target: this.name,
713
+ workflowName: serviceName,
714
+ nodeTypeNames: nodeTypes.map((nt) => nt.name),
715
+ entryPoint: 'handler.ts',
716
+ openApiSpec,
717
+ };
718
+ }
719
+ async generateBundle(workflows, nodeTypes, options) {
720
+ const files = [];
721
+ const serviceName = options.displayName || 'bundle-service';
722
+ const serviceId = this.toInngestId(serviceName);
723
+ // Filter to items with code, skip npm imports
724
+ const workflowsWithCode = workflows.filter((w) => w.code);
725
+ const nodeTypesWithCode = nodeTypes.filter((nt) => nt.code && !nt.name.includes('/'));
726
+ // Separate exposed and bundled-only items
727
+ const exposedWorkflows = workflows.filter((w) => w.expose);
728
+ const exposedNodeTypes = nodeTypes.filter((nt) => nt.expose);
729
+ // Detect name collisions
730
+ const workflowNames = new Set(workflowsWithCode.map((w) => w.functionName));
731
+ const nodeTypeAliases = new Map();
732
+ for (const nt of nodeTypesWithCode) {
733
+ if (workflowNames.has(nt.functionName)) {
734
+ nodeTypeAliases.set(nt.functionName, `${nt.functionName}_nodeType`);
735
+ }
736
+ }
737
+ // Generate workflow imports
738
+ const workflowImports = workflowsWithCode.length > 0
739
+ ? workflowsWithCode
740
+ .map((w) => `import { ${w.functionName} } from './workflows/${w.name}.js';`)
741
+ .join('\n')
742
+ : '// No workflows';
743
+ // Generate node type imports with aliases
744
+ const nodeTypeImports = nodeTypesWithCode.length > 0
745
+ ? nodeTypesWithCode
746
+ .map((nt) => {
747
+ const alias = nodeTypeAliases.get(nt.functionName);
748
+ const lowerFunctionName = nt.functionName.toLowerCase();
749
+ if (alias) {
750
+ return `import { ${nt.functionName} as ${alias} } from './node-types/${lowerFunctionName}.js';`;
751
+ }
752
+ return `import { ${nt.functionName} } from './node-types/${lowerFunctionName}.js';`;
753
+ })
754
+ .join('\n')
755
+ : '// No node types';
756
+ // Filter exposed items with code
757
+ const exposedWorkflowsWithCode = exposedWorkflows.filter((w) => w.code);
758
+ const exposedNodeTypesWithCode = exposedNodeTypes.filter((nt) => nt.code);
759
+ // Generate Inngest function definitions for exposed items
760
+ const allExposed = [
761
+ ...exposedWorkflowsWithCode.map((w) => ({
762
+ type: 'workflow',
763
+ name: w.name,
764
+ functionName: w.functionName,
765
+ })),
766
+ ...exposedNodeTypesWithCode.map((nt) => ({
767
+ type: 'nodeType',
768
+ name: nt.name,
769
+ functionName: nodeTypeAliases.get(nt.functionName) || nt.functionName,
770
+ })),
771
+ ];
772
+ const functionDefs = allExposed.map((item) => {
773
+ const fnId = this.toInngestId(item.name);
774
+ const fnVar = `fn_${this.toVarName(item.functionName)}`;
775
+ const stepName = item.type === 'workflow' ? 'execute-workflow' : 'execute-node-type';
776
+ return `export const ${fnVar} = inngest.createFunction(
777
+ { id: '${fnId}', name: '${item.name}' },
778
+ { event: 'fw/${fnId}.execute' },
779
+ async ({ event, step }) => {
780
+ const params = event.data ?? {};
781
+ const result = await step.run('${stepName}', async () => {
782
+ return ${item.functionName}(true, params);
783
+ });
784
+ return { success: true, result };
785
+ }
786
+ );`;
787
+ }).join('\n\n');
788
+ const functionList = allExposed
789
+ .map((item) => `fn_${this.toVarName(item.functionName)}`)
790
+ .join(', ');
791
+ // Generate entries for exposed items
792
+ const exposedWorkflowEntries = exposedWorkflowsWithCode.length > 0
793
+ ? exposedWorkflowsWithCode.map((w) => ` '${w.name}': ${w.functionName},`).join('\n')
794
+ : ' // No exposed workflows';
795
+ const exposedNodeTypeEntries = exposedNodeTypesWithCode.length > 0
796
+ ? exposedNodeTypesWithCode
797
+ .map((nt) => {
798
+ const alias = nodeTypeAliases.get(nt.functionName);
799
+ return ` '${nt.name}': ${alias || nt.functionName},`;
800
+ })
801
+ .join('\n')
802
+ : ' // No exposed node types';
803
+ // Generate handler
804
+ const handlerContent = INNGEST_BUNDLE_HANDLER_TEMPLATE
805
+ .replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest --bundle'))
806
+ .replace('{{WORKFLOW_IMPORTS}}', workflowImports)
807
+ .replace('{{NODE_TYPE_IMPORTS}}', nodeTypeImports)
808
+ .replace('{{FUNCTION_DEFINITIONS}}', functionDefs)
809
+ .replace('{{FUNCTION_LIST}}', functionList)
810
+ .replace('{{EXPOSED_WORKFLOW_ENTRIES}}', exposedWorkflowEntries)
811
+ .replace('{{EXPOSED_NODE_TYPE_ENTRIES}}', exposedNodeTypeEntries)
812
+ .replace(/\{\{SERVICE_ID\}\}/g, serviceId)
813
+ .replace(/\{\{SERVICE_NAME\}\}/g, serviceName);
814
+ files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
815
+ // Generate OpenAPI spec for exposed items
816
+ const openApiSpec = this.generateBundleOpenAPI(workflows, nodeTypes, {
817
+ title: `${serviceName} API`,
818
+ version: '1.0.0',
819
+ });
820
+ const openApiContent = `// Generated OpenAPI specification\nexport const openApiSpec = ${JSON.stringify(openApiSpec, null, 2)};\n`;
821
+ files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
822
+ // Collect npm package dependencies
823
+ const npmDependencies = {};
824
+ for (const nt of nodeTypes) {
825
+ if (nt.name.startsWith('npm/')) {
826
+ const rest = nt.name.slice(4);
827
+ let packageName;
828
+ if (rest.startsWith('@')) {
829
+ const segments = rest.split('/');
830
+ packageName = `${segments[0]}/${segments[1]}`;
831
+ }
832
+ else {
833
+ packageName = rest.split('/')[0];
834
+ }
835
+ npmDependencies[packageName] = '*';
836
+ }
837
+ }
838
+ // Generate package.json
839
+ const packageJson = this.generatePackageJson({
840
+ name: serviceName,
841
+ description: `Inngest bundle service with ${workflows.length} workflows and ${nodeTypes.length} node types`,
842
+ main: 'handler.js',
843
+ scripts: {
844
+ build: 'tsc',
845
+ dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
846
+ serve: 'npx tsx handler.ts',
847
+ },
848
+ dependencies: {
849
+ inngest: '^3.0.0',
850
+ express: '^4.18.0',
851
+ ...npmDependencies,
852
+ },
853
+ devDependencies: {
854
+ '@types/express': '^4.17.0',
855
+ },
856
+ });
857
+ files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
858
+ // Generate tsconfig.json
859
+ const tsConfig = this.generateTsConfig({
860
+ outDir: './dist',
861
+ module: 'NodeNext',
862
+ moduleResolution: 'NodeNext',
863
+ });
864
+ files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
865
+ // Generate shared runtime types module
866
+ const isProduction = options.production ?? true;
867
+ const runtimeTypesContent = generateStandaloneRuntimeModule(isProduction, 'esm');
868
+ files.push(this.createFile(options.outputDir, 'runtime/types.ts', runtimeTypesContent, 'other'));
869
+ // Generate runtime files
870
+ files.push(...this.generateRuntimeFiles(options.outputDir, workflows, nodeTypes));
871
+ // Generate workflow and node-type content files
872
+ files.push(...this.generateBundleContentFiles(workflows, nodeTypes, options.outputDir));
873
+ return {
874
+ files,
875
+ target: this.name,
876
+ workflowName: serviceName,
877
+ workflowNames: workflows.map((w) => w.name),
878
+ nodeTypeNames: nodeTypes.map((nt) => nt.name),
879
+ entryPoint: 'handler.ts',
880
+ openApiSpec,
881
+ };
882
+ }
883
+ getDeployInstructions(artifacts) {
884
+ const outputDir = artifacts.files[0]?.absolutePath
885
+ ? artifacts.files[0].absolutePath.replace(/\/[^/]+$/, '')
886
+ : '.';
887
+ return {
888
+ title: 'Deploy with Inngest',
889
+ prerequisites: [
890
+ 'Node.js 18+ installed',
891
+ 'Inngest account (https://www.inngest.com/) — free tier available',
892
+ 'Inngest CLI for local development: npx inngest-cli@latest',
893
+ ],
894
+ steps: [
895
+ `cd ${outputDir}`,
896
+ 'npm install',
897
+ 'npm run build',
898
+ '# Deploy your HTTP server (e.g., Vercel, Railway, Fly.io)',
899
+ '# Then register the Inngest serve URL in your Inngest dashboard',
900
+ ],
901
+ localTestSteps: [
902
+ `cd ${outputDir}`,
903
+ 'npm install',
904
+ 'npm run dev',
905
+ '# Inngest Dev Server: http://localhost:8288',
906
+ '# Your functions will auto-register with the dev server',
907
+ '# Send test events from the Inngest Dev Server UI',
908
+ ],
909
+ links: [
910
+ {
911
+ label: 'Inngest Documentation',
912
+ url: 'https://www.inngest.com/docs',
913
+ },
914
+ {
915
+ label: 'Inngest TypeScript SDK',
916
+ url: 'https://www.inngest.com/docs/reference/typescript',
917
+ },
918
+ {
919
+ label: 'Inngest Pricing',
920
+ url: 'https://www.inngest.com/pricing',
921
+ },
922
+ ],
923
+ };
924
+ }
925
+ }
926
+ //# sourceMappingURL=inngest.js.map