@gadmin2n/schematics 0.0.143 → 0.0.145

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 (279) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +10 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +2 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +140 -19
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +2 -2
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/data-mngt.seed.ts +0 -2
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +694 -327
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-outbox.ts +57 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +35 -5
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +224 -59
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +23 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +16 -5
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.spec.ts +98 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +26 -6
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +17 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +3 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -2
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +30 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +28 -6
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +63 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +151 -38
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +4 -1
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +16 -5
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +23 -6
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.spec.ts +130 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +62 -62
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +15 -1
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +70 -9
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +31 -7
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.spec.ts +30 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +28 -6
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +50 -3
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +26 -3
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +53 -47
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +0 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.spec.ts +541 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +442 -200
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +1 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.spec.ts +150 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +56 -40
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +16 -60
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +13 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.spec.ts +44 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +6 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +258 -12
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +127 -14
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.spec.ts +85 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.ts +108 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +5 -5
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +96 -25
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +77 -34
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +23 -34
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +0 -21
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +245 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +639 -188
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +408 -235
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +1 -3
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +279 -95
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +360 -80
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-event-catalog.spec.ts +323 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution-idempotency.spec.ts +773 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +7 -13
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +0 -16
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.spec.ts +184 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +69 -138
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.spec.ts +113 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +59 -13
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-runtime.facade.ts +86 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.spec.ts +25 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.ts +45 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +78 -43
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +103 -40
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +57 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +3 -1
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +1000 -240
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +2184 -317
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +279 -2
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +5 -1
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +4 -1
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +5 -1
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +12 -3
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +10 -1
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +2 -24
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +3 -70
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +3 -1
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +25 -5
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.test.tsx +71 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.tsx +89 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +52 -12
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +12 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -2
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +10 -33
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +13 -37
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -7
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +14 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +10 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/workflowAction.ts +19 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +1 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +3 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -6
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useReferenceUpload.ts +95 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -2
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +672 -110
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -2
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +676 -114
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +13 -1
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +1 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +38 -4
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +276 -376
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +126 -6
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.test.tsx +50 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +48 -11
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +32 -34
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.test.tsx +111 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.tsx +167 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/business-events.css +99 -0
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.test.tsx +106 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.tsx +324 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.test.tsx +73 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.tsx +359 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CanvasZoomControls.tsx +46 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +9 -1
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +105 -4
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +90 -48
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +3 -2
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.test.tsx +259 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +167 -103
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +142 -140
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +60 -15
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +25 -12
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +364 -200
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +220 -52
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.test.tsx +260 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +300 -130
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +507 -33
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +630 -592
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +67 -70
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.test.tsx +90 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.tsx +325 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.test.tsx +52 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +14 -9
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +2 -1
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +2 -1
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.test.tsx +42 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.tsx +76 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowWorkspaceHeader.tsx +56 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/parameter-binding-editor.css +46 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/workflow-code-editor.css +34 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +53 -7
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +123 -62
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connections.css +85 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connectionsApi.ts +29 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.test.tsx +75 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +69 -36
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.test.tsx +494 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +665 -194
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.test.tsx +92 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.ts +96 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.test.tsx +297 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +135 -65
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +53 -42
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +344 -155
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +79 -58
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +123 -144
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +169 -98
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/node-instance-form.css +91 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +54 -31
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +854 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +41 -14
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +75 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +3 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +20 -2
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +2 -1
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +61 -66
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +33 -1
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +47 -15
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/BranchConfigEditors.test.tsx +104 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +22 -52
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.test.tsx +72 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +78 -70
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CronTriggerConfigEditor.tsx +569 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +130 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DelayConfigEditor.tsx +100 -0
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/EventTriggerConfigEditor.tsx +620 -0
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +22 -45
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +25 -92
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +3 -11
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.test.tsx +58 -0
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.tsx +107 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +212 -31
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +214 -304
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +175 -40
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +693 -293
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/IfElseConfigEditor.tsx +190 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.test.tsx +152 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.tsx +286 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParallelConfigEditor.tsx +101 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParameterBindingListEditor.tsx +99 -0
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +495 -0
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.test.tsx +124 -0
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.tsx +222 -0
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +2 -4
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SwitchConfigEditor.tsx +204 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +3 -1
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +9 -6
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/callable-workflow.ts +4 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/code-config.css +96 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/event-catalog.api.ts +117 -0
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/http-request-config.css +242 -0
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/human-approval-config.css +194 -0
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +264 -167
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +6 -9
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +19 -16
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +28 -4
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.test.tsx +59 -0
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.ts +24 -0
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.test.ts +311 -0
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.ts +198 -0
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.test.ts +143 -0
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.ts +19 -0
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +103 -5
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +158 -3
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +117 -9
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.test.ts +70 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.ts +48 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.test.ts +55 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +95 -22
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +148 -1
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +62 -11
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +19 -0
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +1 -1
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.test.ts +45 -0
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.ts +26 -0
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.test.ts +502 -0
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.ts +694 -0
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.test.ts +27 -0
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.ts +33 -0
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.test.ts +34 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.ts +52 -0
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.test.ts +99 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.ts +91 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.test.ts +74 -0
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.ts +120 -0
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/workflow-ui.css +481 -0
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
  248. package/package.json +1 -1
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +0 -62
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +0 -86
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-event-trigger.ts +0 -60
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
@@ -19,12 +19,15 @@ type NodeTypeSeed = BaseNodeTypeSeed & {
19
19
  instancePolicy: 'REQUIRED' | 'OPTIONAL' | 'INLINE_ONLY';
20
20
  };
21
21
 
22
- const inlineNode = (definition: BaseNodeTypeSeed): NodeTypeSeed => ({
22
+ const templatableNode = (definition: BaseNodeTypeSeed): NodeTypeSeed => ({
23
23
  ...definition,
24
24
  runtimeKey: definition.type,
25
25
  schemaVersion: 1,
26
- instancePolicy: 'INLINE_ONLY',
27
- uiSchema: {},
26
+ instancePolicy: 'OPTIONAL',
27
+ uiSchema:
28
+ definition.type === 'manual_trigger'
29
+ ? { widget: 'manual-trigger-config' }
30
+ : {},
28
31
  });
29
32
 
30
33
  const PARAMETER_BINDING_SCHEMA = {
@@ -34,7 +37,7 @@ const PARAMETER_BINDING_SCHEMA = {
34
37
  properties: {
35
38
  source: {
36
39
  type: 'string',
37
- enum: ['INPUT', 'WORKFLOW', 'SYSTEM'],
40
+ enum: ['INPUT', 'WORKFLOW'],
38
41
  },
39
42
  path: { type: 'string', minLength: 1 },
40
43
  },
@@ -57,36 +60,62 @@ const PARAMETER_BINDING_SCHEMA = {
57
60
  ],
58
61
  };
59
62
 
63
+ const APPROVAL_PARAMETER_BINDING_SCHEMA = {
64
+ ...PARAMETER_BINDING_SCHEMA,
65
+ oneOf: [
66
+ {
67
+ ...PARAMETER_BINDING_SCHEMA.oneOf[0],
68
+ properties: {
69
+ ...PARAMETER_BINDING_SCHEMA.oneOf[0].properties,
70
+ source: {
71
+ type: 'string',
72
+ enum: ['INPUT', 'WORKFLOW', 'APPROVAL'],
73
+ },
74
+ },
75
+ },
76
+ PARAMETER_BINDING_SCHEMA.oneOf[1],
77
+ ],
78
+ };
79
+
60
80
  const PARAMETER_BINDINGS_SCHEMA = {
61
81
  type: 'object',
62
82
  additionalProperties: PARAMETER_BINDING_SCHEMA,
63
83
  };
64
84
 
65
- const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
85
+ const HTTP_PARAMETER_BINDINGS_SCHEMA = {
86
+ ...PARAMETER_BINDINGS_SCHEMA,
87
+ propertyNames: { minLength: 1, pattern: '\\S' },
88
+ };
89
+
90
+ const NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
66
91
  // ─── TRIGGER ───────────────────────────────────────────────────────────────
67
92
  {
68
93
  type: 'cron_trigger',
69
94
  category: 'TRIGGER',
70
- label: 'Cron Trigger',
95
+ label: '定时触发',
71
96
  icon: 'ClockCircleOutlined',
72
- description: 'Trigger workflow on a cron schedule',
97
+ description: '按照配置的时间计划自动启动 Workflow',
73
98
  configSchema: {
74
99
  type: 'object',
100
+ additionalProperties: false,
75
101
  properties: {
76
- cron: {
77
- type: 'string',
78
- description: 'Cron expression (6-field with seconds supported)',
102
+ cronExpressions: {
103
+ type: 'array',
104
+ minItems: 1,
105
+ uniqueItems: true,
106
+ items: { type: 'string', minLength: 1 },
107
+ description: '一个或多个 Temporal Schedule Cron 表达式',
79
108
  },
80
109
  timezone: {
81
110
  type: 'string',
82
- description: 'IANA timezone, e.g. Asia/Shanghai',
111
+ description: 'IANA 时区,例如 Asia/Shanghai',
83
112
  },
84
113
  },
85
- required: ['cron'],
114
+ required: ['cronExpressions'],
86
115
  },
87
116
  inputSchema: { type: 'object', properties: {} },
88
117
  outputSchema: {
89
- description: 'Workflow start data supplied by the schedule trigger',
118
+ description: '定时启动 Workflow 时提供的启动数据',
90
119
  },
91
120
  outputs: [],
92
121
  },
@@ -101,41 +130,27 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
101
130
  properties: {
102
131
  path: {
103
132
  type: 'string',
133
+ minLength: 1,
134
+ pattern: '^[A-Za-z0-9](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$',
104
135
  description:
105
- 'Webhook endpoint path segment, e.g. "order-paid". Final URL: POST /api/workflow/webhook/{path}',
136
+ '外部调用路径,例如 order-paid;界面会显示最终可访问地址',
106
137
  },
107
138
  method: {
108
139
  type: 'string',
109
140
  enum: ['POST'],
110
141
  default: 'POST',
111
- description: 'External requests use POST',
142
+ description: '外部请求统一使用 POST',
112
143
  },
113
144
  verificationMode: {
114
145
  type: 'string',
115
146
  enum: ['HMAC', 'NONE'],
116
147
  default: 'HMAC',
117
- description:
118
- 'HMAC verifies signed callers. NONE directly accepts systems that cannot sign requests.',
148
+ description: 'HMAC 校验调用方签名;NONE 用于无法签名的可信系统',
119
149
  },
120
150
  secret: {
121
151
  type: 'string',
122
152
  description:
123
- 'HMAC-SHA256 secret. Caller must send X-Workflow-Signature: sha256=HEX(HMAC(secret, "{ts}.{rawBody}")) and X-Workflow-Timestamp.',
124
- },
125
- responseMode: {
126
- type: 'string',
127
- enum: ['IMMEDIATE', 'WAIT_FOR_RESULT'],
128
- default: 'IMMEDIATE',
129
- description:
130
- 'Immediately acknowledge the request or wait for a Return Result node.',
131
- },
132
- responseTimeoutSeconds: {
133
- type: 'integer',
134
- minimum: 1,
135
- maximum: 300,
136
- default: 60,
137
- description:
138
- 'Maximum time to keep the HTTP request open in WAIT_FOR_RESULT mode.',
153
+ '用于 HMAC-SHA256 验签的密钥;调用方需传入 X-Workflow-Signature 和 X-Workflow-Timestamp',
139
154
  },
140
155
  },
141
156
  required: ['path', 'method'],
@@ -151,21 +166,24 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
151
166
  else: { required: ['secret'] },
152
167
  },
153
168
  ],
169
+ additionalProperties: false,
154
170
  },
155
171
  inputSchema: {
156
172
  type: 'object',
157
173
  properties: {
158
- body: { type: 'object' },
174
+ body: { description: '请求体原始内容' },
159
175
  headers: { type: 'object' },
160
176
  query: { type: 'object' },
177
+ receivedAt: { type: 'string' },
161
178
  },
162
179
  },
163
180
  outputSchema: {
164
181
  type: 'object',
165
182
  properties: {
166
- body: { type: 'object', description: 'Unmodified request body' },
167
- headers: { type: 'object', description: 'Request headers' },
168
- query: { type: 'object', description: 'Query parameters' },
183
+ body: { description: '请求体原始内容' },
184
+ headers: { type: 'object', description: '请求头' },
185
+ query: { type: 'object', description: 'URL 查询参数' },
186
+ receivedAt: { type: 'string', description: '收到请求的时间' },
169
187
  },
170
188
  },
171
189
  outputs: [],
@@ -173,52 +191,157 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
173
191
  {
174
192
  type: 'event_trigger',
175
193
  category: 'TRIGGER',
176
- label: 'Event Trigger',
194
+ label: '业务事件触发',
177
195
  icon: 'ThunderboltOutlined',
178
- description: '收到内部业务事件(Outbox)后启动 Workflow',
196
+ description: '业务数据发生变化后自动启动 Workflow',
179
197
  configSchema: {
180
198
  type: 'object',
181
199
  properties: {
182
- eventName: {
200
+ registrationCode: {
201
+ type: 'string',
202
+ minLength: 1,
203
+ description: '前端登记的 PostgreSQL 表字段监听标识',
204
+ },
205
+ match: {
206
+ type: 'object',
207
+ properties: {
208
+ combineOperation: {
209
+ type: 'string',
210
+ enum: ['AND', 'OR'],
211
+ },
212
+ conditions: {
213
+ type: 'array',
214
+ minItems: 1,
215
+ items: {
216
+ type: 'object',
217
+ properties: {
218
+ id: { type: 'string', minLength: 1 },
219
+ left: {
220
+ type: 'object',
221
+ properties: {
222
+ source: { const: 'WORKFLOW' },
223
+ path: { type: 'string', minLength: 1 },
224
+ },
225
+ required: ['source', 'path'],
226
+ additionalProperties: false,
227
+ },
228
+ operator: {
229
+ type: 'string',
230
+ enum: ['EQ', 'NEQ', 'EMPTY', 'NOT_EMPTY'],
231
+ },
232
+ right: {
233
+ type: 'object',
234
+ properties: {
235
+ source: { const: 'FIXED' },
236
+ valueType: {
237
+ type: 'string',
238
+ enum: ['STRING', 'NUMBER', 'BOOLEAN'],
239
+ },
240
+ value: { type: 'string' },
241
+ },
242
+ required: ['source', 'valueType', 'value'],
243
+ additionalProperties: false,
244
+ },
245
+ },
246
+ required: ['id', 'left', 'operator'],
247
+ allOf: [
248
+ {
249
+ if: {
250
+ properties: {
251
+ operator: { enum: ['EQ', 'NEQ'] },
252
+ },
253
+ required: ['operator'],
254
+ },
255
+ then: { required: ['right'] },
256
+ },
257
+ ],
258
+ additionalProperties: false,
259
+ },
260
+ },
261
+ },
262
+ required: ['combineOperation', 'conditions'],
263
+ additionalProperties: false,
264
+ },
265
+ processingMode: {
183
266
  type: 'string',
184
- description: 'Internal event/signal name to listen for',
267
+ enum: ['PARALLEL', 'SERIAL_BY_KEY'],
268
+ default: 'PARALLEL',
269
+ description: '事件的并发处理方式',
185
270
  },
186
- filterExpression: {
271
+ concurrencyKeyPath: {
187
272
  type: 'string',
188
- description: 'Optional expression to filter events',
273
+ minLength: 1,
274
+ description: '需要保持顺序的业务对象字段',
275
+ },
276
+ maxConcurrency: {
277
+ type: 'integer',
278
+ minimum: 1,
279
+ maximum: 100,
280
+ default: 20,
281
+ description: '顺序调度器最多同时处理的业务对象数量',
189
282
  },
190
283
  },
191
- required: ['eventName'],
192
- },
193
- inputSchema: {
194
- type: 'object',
195
- properties: { payload: { type: 'object' } },
284
+ required: ['registrationCode', 'processingMode'],
285
+ allOf: [
286
+ {
287
+ if: {
288
+ properties: { processingMode: { const: 'SERIAL_BY_KEY' } },
289
+ required: ['processingMode'],
290
+ },
291
+ then: {
292
+ required: ['concurrencyKeyPath', 'maxConcurrency'],
293
+ },
294
+ },
295
+ ],
296
+ additionalProperties: false,
196
297
  },
298
+ inputSchema: { description: 'PostgreSQL 行变化的标准 before/after 数据' },
197
299
  outputSchema: {
198
300
  type: 'object',
199
- properties: { payload: { type: 'object' } },
301
+ properties: {
302
+ operation: { type: 'string', enum: ['INSERT', 'UPDATE', 'DELETE'] },
303
+ table: {
304
+ type: 'object',
305
+ properties: {
306
+ schema: { type: 'string' },
307
+ name: { type: 'string' },
308
+ },
309
+ },
310
+ primaryKey: { type: 'object' },
311
+ before: { type: ['object', 'null'] },
312
+ after: { type: ['object', 'null'] },
313
+ changedFields: { type: 'array', items: { type: 'string' } },
314
+ },
315
+ required: [
316
+ 'operation',
317
+ 'table',
318
+ 'primaryKey',
319
+ 'before',
320
+ 'after',
321
+ 'changedFields',
322
+ ],
200
323
  },
201
324
  outputs: [],
202
325
  },
203
326
  {
204
327
  type: 'manual_trigger',
205
328
  category: 'TRIGGER',
206
- label: 'Manual Trigger',
329
+ label: '手动触发',
207
330
  icon: 'PlayCircleOutlined',
208
- description: 'Trigger workflow manually for testing or one-time execution',
331
+ description: '由用户手动启动 Workflow,适合测试或一次性执行',
209
332
  configSchema: {
210
333
  type: 'object',
211
334
  properties: {
212
335
  inputSchema: {
213
336
  type: 'object',
214
- description: 'JSON Schema defining expected manual input',
337
+ description: '手动运行时需要填写的启动参数',
215
338
  },
216
339
  },
217
340
  required: [],
218
341
  },
219
- inputSchema: { type: 'object', properties: { data: { type: 'object' } } },
342
+ inputSchema: { description: '手动触发节点没有上一个节点输入' },
220
343
  outputSchema: {
221
- description: 'Workflow start data supplied for the manual run',
344
+ description: '用户手动启动时提供的数据',
222
345
  },
223
346
  outputs: [],
224
347
  },
@@ -227,20 +350,20 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
227
350
  {
228
351
  type: 'http_request',
229
352
  category: 'ACTION',
230
- label: 'HTTP Request',
353
+ label: 'HTTP 请求',
231
354
  icon: 'GlobalOutlined',
232
- description: 'Call an external API through a reusable Connection',
355
+ description: '通过已注册的连接调用外部 HTTP 接口',
233
356
  configSchema: {
234
357
  type: 'object',
235
358
  properties: {
236
359
  connectionRef: {
237
360
  type: 'string',
238
- description: 'Immutable code of a reusable Connection',
361
+ description: '要使用的连接编码',
239
362
  },
240
363
  method: {
241
364
  type: 'string',
242
365
  enum: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'],
243
- description: 'HTTP method',
366
+ description: 'HTTP 请求方法',
244
367
  },
245
368
  path: {
246
369
  type: 'string',
@@ -248,39 +371,32 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
248
371
  'Relative API path. Supports explicit {{input.path}} and {{workflow.path}} references.',
249
372
  },
250
373
  queryBindings: {
251
- ...PARAMETER_BINDINGS_SCHEMA,
252
- description: 'Direct value sources for query parameters',
374
+ ...HTTP_PARAMETER_BINDINGS_SCHEMA,
375
+ description: 'URL 查询参数及其取值来源',
253
376
  },
254
377
  headerBindings: {
255
- ...PARAMETER_BINDINGS_SCHEMA,
256
- description: 'Direct value sources for request headers',
378
+ ...HTTP_PARAMETER_BINDINGS_SCHEMA,
379
+ description: '请求头及其取值来源',
257
380
  },
258
381
  bodyMode: {
259
382
  type: 'string',
260
383
  enum: ['FIELDS', 'JSON'],
261
- description: 'Request body editing mode',
384
+ description: '请求体编辑方式',
262
385
  },
263
386
  bodyBindings: {
264
- ...PARAMETER_BINDINGS_SCHEMA,
265
- description: 'Direct value sources for request body fields',
387
+ ...HTTP_PARAMETER_BINDINGS_SCHEMA,
388
+ description: '请求体字段及其取值来源',
266
389
  },
267
390
  body: {
268
391
  description:
269
- 'Advanced JSON body with explicit {{input.path}}, {{workflow.path}}, and {{system.path}} references',
392
+ '高级 JSON 请求体,可明确引用上一个节点结果或 Workflow 启动数据',
270
393
  },
271
394
  timeoutSeconds: {
272
395
  type: 'integer',
273
396
  minimum: 1,
274
397
  maximum: 300,
275
- description: 'Request timeout in seconds',
276
- },
277
- retryOnFail: { type: 'boolean', description: 'Retry on failure' },
278
- maxRetries: { type: 'integer', minimum: 0, maximum: 10 },
279
- retryInterval: {
280
- type: 'integer',
281
- minimum: 0,
282
- maximum: 60000,
283
- description: 'Interval between retries in milliseconds',
398
+ default: 30,
399
+ description: '请求超时时间(秒)',
284
400
  },
285
401
  },
286
402
  required: ['connectionRef', 'method', 'path', 'bodyMode'],
@@ -291,89 +407,51 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
291
407
  type: 'object',
292
408
  properties: {
293
409
  status: { type: 'number' },
294
- data: { description: 'Unmodified response body' },
410
+ data: { description: '响应体原始内容' },
295
411
  headers: { type: 'object' },
296
412
  },
297
413
  },
298
414
  outputs: [],
299
415
  },
300
- {
301
- type: 'db_query',
302
- category: 'ACTION',
303
- label: 'Database Query',
304
- icon: 'DatabaseOutlined',
305
- description: 'Execute a database read query (SELECT)',
306
- configSchema: {
307
- type: 'object',
308
- properties: {
309
- query: { type: 'string', description: 'SQL statement' },
310
- params: {
311
- type: 'array',
312
- items: { type: 'string' },
313
- description: 'Parameterized values ($1, $2...)',
314
- },
315
- datasource: {
316
- type: 'string',
317
- description: 'Database connection identifier',
318
- },
319
- timeout: {
320
- type: 'number',
321
- description: 'Query timeout in milliseconds',
322
- },
323
- },
324
- required: ['query'],
325
- },
326
- inputSchema: { type: 'object', properties: {} },
327
- outputSchema: {
328
- type: 'object',
329
- properties: { rows: { type: 'array' }, rowCount: { type: 'number' } },
330
- },
331
- outputs: [],
332
- },
333
416
  {
334
417
  type: 'db_execute',
335
418
  category: 'ACTION',
336
- label: 'Database Execute',
419
+ label: '数据库操作',
337
420
  icon: 'ConsoleSqlOutlined',
338
- description: 'Execute a database write operation (INSERT/UPDATE/DELETE)',
421
+ description: '使用 SQL 查询或修改当前服务注册的数据库',
339
422
  configSchema: {
340
423
  type: 'object',
341
424
  properties: {
342
- operation: {
343
- type: 'string',
344
- enum: ['insert', 'update', 'delete', 'raw'],
345
- description: 'Write operation type',
425
+ allowWrite: {
426
+ type: 'boolean',
427
+ description: '是否允许新增、更新或删除数据',
346
428
  },
347
- table: { type: 'string', description: 'Target table name' },
348
- data: { type: 'object', description: 'Data to insert/update (JSON)' },
349
- where: {
429
+ sql: {
350
430
  type: 'string',
351
- description: 'WHERE condition for update/delete',
431
+ minLength: 1,
432
+ description: '要执行的单条 SQL',
352
433
  },
353
- rawSql: {
354
- type: 'string',
355
- description: 'Raw SQL for complex writes (when operation=raw)',
356
- },
357
- params: {
434
+ parameters: {
358
435
  type: 'array',
359
- items: { type: 'string' },
360
- description: 'Parameterized values',
361
- },
362
- datasource: {
363
- type: 'string',
364
- description: 'Database connection identifier',
436
+ items: PARAMETER_BINDING_SCHEMA,
437
+ description: 'SQL 中参数占位符对应的值',
365
438
  },
366
- timeout: {
367
- type: 'number',
368
- description: 'Execution timeout in milliseconds',
439
+ timeoutSeconds: {
440
+ type: 'integer',
441
+ minimum: 1,
442
+ maximum: 300,
443
+ description: '执行超时时间(秒)',
369
444
  },
370
445
  },
371
- required: ['operation'],
446
+ required: ['allowWrite', 'sql'],
447
+ additionalProperties: false,
372
448
  },
373
- inputSchema: { type: 'object', properties: { data: { type: 'object' } } },
449
+ inputSchema: { description: '上一个节点的完整结果' },
374
450
  outputSchema: {
375
451
  type: 'object',
376
452
  properties: {
453
+ rows: { type: 'array' },
454
+ rowCount: { type: 'number' },
377
455
  affectedRows: { type: 'number' },
378
456
  insertedId: { type: 'string' },
379
457
  },
@@ -383,32 +461,32 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
383
461
  {
384
462
  type: 'code',
385
463
  category: 'ACTION',
386
- label: 'Code',
464
+ label: '代码处理',
387
465
  icon: 'CodeOutlined',
388
- description: 'Execute custom JavaScript code for data transformation',
466
+ description: '使用 JavaScript 处理或转换上一个节点的结果',
389
467
  configSchema: {
390
468
  type: 'object',
391
469
  properties: {
392
- script: { type: 'string', description: 'JavaScript code to execute' },
470
+ script: { type: 'string', description: '要执行的 JavaScript 代码' },
393
471
  mode: {
394
472
  type: 'string',
395
- enum: ['runOnceForAll', 'runOnceForEach'],
396
- description: 'Execution mode: run once for all items or per item',
473
+ enum: ['runOnceForAll'],
474
+ default: 'runOnceForAll',
475
+ description: '对完整输入执行一次',
397
476
  },
398
477
  timeout: {
399
- type: 'number',
400
- description: 'Script execution timeout (ms)',
478
+ type: 'integer',
479
+ minimum: 1,
480
+ maximum: 5000,
481
+ default: 5000,
482
+ description: '代码执行超时时间(毫秒)',
401
483
  },
402
484
  },
403
485
  required: ['script'],
404
486
  },
405
- inputSchema: {
406
- type: 'object',
407
- properties: { data: { type: 'object' }, items: { type: 'array' } },
408
- },
487
+ inputSchema: { description: '上一个节点的完整结果' },
409
488
  outputSchema: {
410
- type: 'object',
411
- properties: { result: { type: 'object' } },
489
+ description: '代码中 return 的完整结果',
412
490
  },
413
491
  outputs: [],
414
492
  },
@@ -417,71 +495,105 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
417
495
  {
418
496
  type: 'if_else',
419
497
  category: 'CONDITION',
420
- label: 'If/Else',
498
+ label: '条件分支',
421
499
  icon: 'BranchesOutlined',
422
- description: 'Branch workflow based on a condition',
500
+ description: '根据一个或多个条件选择满足或不满足分支',
423
501
  configSchema: {
424
502
  type: 'object',
425
503
  properties: {
426
504
  conditions: {
427
505
  type: 'array',
506
+ minItems: 1,
428
507
  items: {
429
508
  type: 'object',
430
509
  properties: {
431
- field: { type: 'string' },
432
- operator: { type: 'string' },
433
- value: { type: 'string' },
510
+ id: { type: 'string', minLength: 1 },
511
+ left: PARAMETER_BINDING_SCHEMA,
512
+ operator: {
513
+ type: 'string',
514
+ enum: [
515
+ 'EQ',
516
+ 'NEQ',
517
+ 'GT',
518
+ 'GTE',
519
+ 'LT',
520
+ 'LTE',
521
+ 'CONTAINS',
522
+ 'NOT_CONTAINS',
523
+ 'EMPTY',
524
+ 'NOT_EMPTY',
525
+ ],
526
+ },
527
+ right: PARAMETER_BINDING_SCHEMA,
434
528
  },
529
+ required: ['id', 'left', 'operator'],
530
+ allOf: [
531
+ {
532
+ if: {
533
+ properties: {
534
+ operator: { enum: ['EMPTY', 'NOT_EMPTY'] },
535
+ },
536
+ required: ['operator'],
537
+ },
538
+ then: {},
539
+ else: { required: ['right'] },
540
+ },
541
+ ],
542
+ additionalProperties: false,
435
543
  },
436
- description: 'Condition rules (field + operator + value)',
544
+ description: '使用结构化数据来源配置的判断条件',
437
545
  },
438
546
  combineOperation: {
439
547
  type: 'string',
440
548
  enum: ['AND', 'OR'],
441
- description: 'How to combine multiple conditions',
549
+ description: '多个条件之间使用并且或或者',
442
550
  },
443
551
  },
444
- required: [],
552
+ required: ['conditions', 'combineOperation'],
553
+ additionalProperties: false,
445
554
  },
446
- inputSchema: { type: 'object', properties: { data: { type: 'object' } } },
555
+ inputSchema: { description: '上一个节点的完整结果' },
447
556
  outputSchema: {
448
- type: 'object',
449
- properties: { branch: { type: 'string', enum: ['true', 'false'] } },
557
+ description: '原样传递上一个节点的完整结果',
450
558
  },
451
559
  outputs: ['true', 'false'],
452
560
  },
453
561
  {
454
562
  type: 'switch',
455
563
  category: 'CONDITION',
456
- label: 'Switch',
564
+ label: '多路分支',
457
565
  icon: 'PartitionOutlined',
458
- description: 'Multi-way branch based on a field value',
566
+ description: '根据一个字段值匹配多个分支,未匹配时进入其他情况',
459
567
  configSchema: {
460
568
  type: 'object',
461
569
  properties: {
462
- field: { type: 'string', description: 'Field to evaluate' },
570
+ valueBinding: PARAMETER_BINDING_SCHEMA,
463
571
  cases: {
464
572
  type: 'array',
573
+ minItems: 1,
465
574
  items: {
466
575
  type: 'object',
467
576
  properties: {
577
+ id: { type: 'string', minLength: 1, not: { const: 'default' } },
468
578
  value: { type: 'string' },
469
- label: { type: 'string' },
579
+ valueType: {
580
+ type: 'string',
581
+ enum: ['STRING', 'NUMBER', 'BOOLEAN'],
582
+ },
583
+ label: { type: 'string', minLength: 1 },
470
584
  },
585
+ required: ['id', 'value', 'valueType', 'label'],
586
+ additionalProperties: false,
471
587
  },
472
- description: 'Case branches (value → output handle)',
473
- },
474
- defaultCase: {
475
- type: 'string',
476
- description: 'Default branch label when no case matches',
588
+ description: '多路匹配项;稳定标识用于保持画布连线',
477
589
  },
478
590
  },
479
- required: ['field', 'cases'],
591
+ required: ['valueBinding', 'cases'],
592
+ additionalProperties: false,
480
593
  },
481
- inputSchema: { type: 'object', properties: { data: { type: 'object' } } },
594
+ inputSchema: { description: '上一个节点的完整结果' },
482
595
  outputSchema: {
483
- type: 'object',
484
- properties: { matchedCase: { type: 'string' } },
596
+ description: '原样传递上一个节点的完整结果',
485
597
  },
486
598
  outputs: null,
487
599
  },
@@ -490,38 +602,84 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
490
602
  {
491
603
  type: 'for_each',
492
604
  category: 'FLOW_CONTROL',
493
- label: 'For Each',
605
+ label: '循环处理',
494
606
  icon: 'RetweetOutlined',
495
- description: 'Iterate over an array field',
607
+ description: '逐项处理数组数据,并在全部完成后继续流程',
496
608
  configSchema: {
497
609
  type: 'object',
498
610
  properties: {
499
- iteratorField: {
500
- type: 'string',
501
- description: 'Path to the array field to iterate',
502
- },
503
- concurrency: {
504
- type: 'number',
505
- description: 'Parallel concurrency (1 = sequential)',
611
+ itemsBinding: PARAMETER_BINDING_SCHEMA,
612
+ execution: {
613
+ type: 'object',
614
+ properties: {
615
+ mode: {
616
+ type: 'string',
617
+ enum: ['SEQUENTIAL', 'PARALLEL'],
618
+ default: 'SEQUENTIAL',
619
+ },
620
+ concurrency: {
621
+ type: 'integer',
622
+ minimum: 2,
623
+ maximum: 20,
624
+ default: 3,
625
+ },
626
+ },
627
+ required: ['mode'],
628
+ allOf: [
629
+ {
630
+ if: {
631
+ properties: { mode: { const: 'PARALLEL' } },
632
+ required: ['mode'],
633
+ },
634
+ then: { required: ['concurrency'] },
635
+ },
636
+ {
637
+ if: {
638
+ properties: { mode: { const: 'SEQUENTIAL' } },
639
+ required: ['mode'],
640
+ },
641
+ then: { not: { required: ['concurrency'] } },
642
+ },
643
+ ],
644
+ additionalProperties: false,
506
645
  },
507
646
  errorPolicy: {
508
647
  type: 'string',
509
- enum: ['stop', 'continue', 'collect'],
510
- description:
511
- 'Behavior on item failure: stop all, continue, or collect errors',
648
+ enum: ['STOP', 'CONTINUE'],
649
+ default: 'STOP',
512
650
  },
513
651
  },
514
- required: ['iteratorField'],
652
+ required: ['itemsBinding', 'execution', 'errorPolicy'],
653
+ additionalProperties: false,
515
654
  },
516
- inputSchema: { type: 'object', properties: { items: { type: 'array' } } },
655
+ inputSchema: { description: '包含待循环数组的上一个节点结果' },
517
656
  outputSchema: {
518
657
  type: 'object',
519
658
  properties: {
520
- results: { type: 'array' },
521
- errors: { type: 'array' },
522
- totalProcessed: { type: 'number' },
523
- error: { type: 'string' },
659
+ results: {
660
+ type: 'array',
661
+ items: {
662
+ type: 'object',
663
+ properties: {
664
+ index: { type: 'number' },
665
+ status: {
666
+ type: 'string',
667
+ enum: ['SUCCEEDED', 'FAILED'],
668
+ },
669
+ output: {},
670
+ error: {
671
+ type: 'object',
672
+ properties: { message: { type: 'string' } },
673
+ },
674
+ },
675
+ required: ['index', 'status'],
676
+ },
677
+ },
678
+ total: { type: 'number' },
679
+ succeeded: { type: 'number' },
680
+ failed: { type: 'number' },
524
681
  },
682
+ required: ['results', 'total', 'succeeded', 'failed'],
525
683
  },
526
684
  outputs: [],
527
685
  },
@@ -530,69 +688,89 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
530
688
  category: 'FLOW_CONTROL',
531
689
  label: '定时等待',
532
690
  icon: 'HourglassOutlined',
533
- description:
534
- 'Pause workflow execution for a specified duration (Temporal Timer)',
691
+ description: '等待一段时间或等待到指定时间后继续执行',
535
692
  configSchema: {
536
693
  type: 'object',
537
694
  properties: {
538
- delayType: {
695
+ mode: {
539
696
  type: 'string',
540
- enum: ['fixedDuration', 'untilTime'],
541
- description: 'Type of delay',
697
+ enum: ['DURATION', 'UNTIL'],
698
+ description: '等待一段时间或等待到指定时间',
542
699
  },
543
700
  duration: {
544
- type: 'number',
545
- description: 'Delay duration in seconds (for fixedDuration)',
701
+ type: 'object',
702
+ properties: {
703
+ value: { type: 'integer', minimum: 1 },
704
+ unit: {
705
+ type: 'string',
706
+ enum: ['SECONDS', 'MINUTES', 'HOURS', 'DAYS'],
707
+ },
708
+ },
709
+ required: ['value', 'unit'],
710
+ additionalProperties: false,
546
711
  },
547
712
  untilTime: {
548
713
  type: 'string',
549
- description: 'Resume at ISO datetime (for untilTime)',
714
+ format: 'date-time',
715
+ description: '恢复执行的时间',
550
716
  },
551
717
  },
552
- required: ['delayType'],
718
+ required: ['mode'],
719
+ allOf: [
720
+ {
721
+ if: { properties: { mode: { const: 'DURATION' } } },
722
+ then: { required: ['duration'] },
723
+ },
724
+ {
725
+ if: { properties: { mode: { const: 'UNTIL' } } },
726
+ then: { required: ['untilTime'] },
727
+ },
728
+ ],
729
+ additionalProperties: false,
553
730
  },
554
- inputSchema: { type: 'object', properties: {} },
731
+ inputSchema: { description: '上一个节点的完整结果' },
555
732
  outputSchema: {
556
- type: 'object',
557
- properties: {
558
- resumedAt: { type: 'string' },
559
- resumeReason: { type: 'string' },
560
- },
733
+ description: '原样传递上一个节点的完整结果',
561
734
  },
562
735
  outputs: [],
563
736
  },
564
737
  {
565
738
  type: 'parallel',
566
739
  category: 'FLOW_CONTROL',
567
- label: 'Parallel',
740
+ label: '并行执行',
568
741
  icon: 'ForkOutlined',
569
- description:
570
- 'Execute multiple branches in parallel and wait for all to complete',
742
+ description: '同时执行画布连接的多个分支',
571
743
  configSchema: {
572
744
  type: 'object',
573
745
  properties: {
574
746
  branches: {
575
747
  type: 'array',
748
+ minItems: 2,
576
749
  items: {
577
750
  type: 'object',
578
751
  properties: {
579
- label: { type: 'string' },
752
+ id: { type: 'string', minLength: 1 },
753
+ label: { type: 'string', minLength: 1 },
580
754
  },
755
+ required: ['id', 'label'],
756
+ additionalProperties: false,
581
757
  },
582
- description: 'Named parallel branches',
583
- },
584
- waitMode: {
585
- type: 'string',
586
- enum: ['all', 'any'],
587
- description: 'Wait for all branches or any one branch to complete',
588
758
  },
589
759
  },
590
760
  required: ['branches'],
761
+ additionalProperties: false,
591
762
  },
592
- inputSchema: { type: 'object', properties: { data: { type: 'object' } } },
763
+ inputSchema: { description: '上一个节点的完整结果' },
593
764
  outputSchema: {
594
765
  type: 'object',
595
- properties: { completedBranches: { type: 'number' } },
766
+ properties: {
767
+ branch: {
768
+ type: 'array',
769
+ description: '按分支配置顺序汇总的最终结果,数组索引从 0 开始',
770
+ items: {},
771
+ },
772
+ },
773
+ required: ['branch'],
596
774
  },
597
775
  outputs: [],
598
776
  },
@@ -602,9 +780,9 @@ const INLINE_NODE_DEFINITIONS: BaseNodeTypeSeed[] = [
602
780
  const approvalDefinition: BaseNodeTypeSeed = {
603
781
  type: 'approval',
604
782
  category: 'APPROVAL',
605
- label: 'Human Approval',
783
+ label: '人工审批',
606
784
  icon: 'CheckCircleOutlined',
607
- description: 'Pause workflow and wait for human approval (Temporal Signal)',
785
+ description: '创建审批请求并等待审批人通过、拒绝或超时',
608
786
  configSchema: {
609
787
  type: 'object',
610
788
  properties: {
@@ -618,54 +796,61 @@ const approvalDefinition: BaseNodeTypeSeed = {
618
796
  },
619
797
  required: ['type', 'id'],
620
798
  },
621
- description:
622
- 'Approvers — mix of individual users (type=user, id=userid) and reusable groups (type=group, id=UserGroup.code)',
799
+ description: '可以处理本次审批的用户或可复用用户组',
623
800
  },
624
801
  approvalMode: {
625
802
  type: 'string',
626
803
  enum: ['any', 'all', 'percentage'],
627
- description: 'any = one approver, all = unanimous, percentage = quorum',
804
+ description: '任意一人、全部通过或达到指定比例',
628
805
  },
629
806
  minApprovalCount: {
630
807
  type: 'number',
631
- description: 'Minimum approvals needed (for percentage mode)',
808
+ description: '达到通过条件所需的最少人数',
632
809
  },
633
- timeout: { type: 'number', description: 'Approval timeout in seconds' },
810
+ timeout: { type: 'number', description: '审批超时时间(秒)' },
634
811
  timeoutAction: {
635
812
  type: 'string',
636
813
  enum: ['auto_approve', 'auto_reject', 'escalate'],
637
- description: 'Action when approval times out',
814
+ description: '审批超时后的处理动作',
638
815
  },
639
816
  escalateTo: {
640
817
  type: 'array',
641
818
  items: { type: 'string' },
642
- description: 'Escalation targets (when timeoutAction=escalate)',
819
+ description: '审批超时后的升级处理人',
643
820
  },
644
821
  reminderInterval: {
645
822
  type: 'number',
646
- description: 'Reminder interval in hours (0 = no reminder)',
823
+ description: '提醒间隔(小时),0 表示不提醒',
647
824
  },
648
825
  allowDelegate: {
649
826
  type: 'boolean',
650
- description: 'Allow approvers to delegate to others',
827
+ description: '是否允许审批人转交给其他人',
651
828
  },
652
829
  },
653
830
  required: ['approvers'],
654
831
  },
655
- inputSchema: {
656
- type: 'object',
657
- properties: { requestData: { type: 'object' } },
658
- },
832
+ inputSchema: { description: '上一个节点的完整结果' },
659
833
  outputSchema: {
660
834
  type: 'object',
661
835
  properties: {
662
- requestId: { type: 'string' },
663
- nodeId: { type: 'string' },
664
- result: { type: 'string', enum: ['APPROVED', 'REJECTED'] },
665
- reason: { type: 'string' },
666
- decidedAt: { type: 'string' },
667
- approved: { type: 'boolean' },
836
+ previous: {
837
+ description: '进入人工审批前收到的完整数据',
838
+ },
839
+ result: {
840
+ type: 'object',
841
+ properties: {
842
+ requestId: { type: 'string' },
843
+ result: {
844
+ type: 'string',
845
+ enum: ['APPROVED', 'REJECTED'],
846
+ },
847
+ reason: { type: 'string' },
848
+ decidedAt: { type: 'string' },
849
+ approved: { type: 'boolean' },
850
+ },
851
+ },
668
852
  },
853
+ required: ['previous', 'result'],
669
854
  },
670
855
  outputs: [],
671
856
  };
@@ -682,63 +867,136 @@ const subWorkflowDefinition: BaseNodeTypeSeed = {
682
867
  properties: {
683
868
  workflowId: {
684
869
  type: 'string',
685
- description: 'Target workflow ID to invoke',
870
+ description: '要调用的 Workflow ID',
871
+ },
872
+ workflowVersionId: {
873
+ type: 'string',
874
+ description: '要调用的 Workflow 版本 ID',
686
875
  },
687
876
  inputBindings: {
688
877
  ...PARAMETER_BINDINGS_SCHEMA,
689
- description:
690
- 'Bind child inputs to the previous node, Workflow data, or fixed values',
878
+ description: '从上一个节点的结果、Workflow 启动数据或固定值传入参数',
691
879
  },
692
880
  },
693
- required: ['workflowId'],
881
+ required: ['workflowId', 'workflowVersionId'],
882
+ additionalProperties: false,
694
883
  },
695
- inputSchema: { type: 'object', properties: { data: { type: 'object' } } },
884
+ inputSchema: { description: '上一个节点的完整结果' },
696
885
  outputSchema: {
697
- description: 'Unmodified result returned by the called Workflow',
886
+ description: '被调用 Workflow 返回的完整结果',
698
887
  },
699
888
  outputs: [],
700
889
  };
701
890
 
702
- const HUMAN_APPROVAL_CONFIG_SCHEMA: NodeTypeSeed['configSchema'] = {
891
+ const HTTP_REQUEST_CONFIG_SCHEMA = NODE_DEFINITIONS.find(
892
+ (definition) => definition.type === 'http_request',
893
+ )!.configSchema as any;
894
+
895
+ const APPROVAL_HTTP_REQUEST_CONFIG_SCHEMA = {
896
+ ...HTTP_REQUEST_CONFIG_SCHEMA,
897
+ properties: {
898
+ ...HTTP_REQUEST_CONFIG_SCHEMA.properties,
899
+ queryBindings: {
900
+ ...HTTP_REQUEST_CONFIG_SCHEMA.properties.queryBindings,
901
+ additionalProperties: APPROVAL_PARAMETER_BINDING_SCHEMA,
902
+ },
903
+ headerBindings: {
904
+ ...HTTP_REQUEST_CONFIG_SCHEMA.properties.headerBindings,
905
+ additionalProperties: APPROVAL_PARAMETER_BINDING_SCHEMA,
906
+ },
907
+ bodyBindings: {
908
+ ...HTTP_REQUEST_CONFIG_SCHEMA.properties.bodyBindings,
909
+ additionalProperties: APPROVAL_PARAMETER_BINDING_SCHEMA,
910
+ },
911
+ },
912
+ };
913
+
914
+ const EMBEDDED_CODE_CONFIG_SCHEMA = {
703
915
  type: 'object',
704
916
  properties: {
705
- approvalWorkflowId: {
917
+ script: { type: 'string', minLength: 1 },
918
+ mode: {
706
919
  type: 'string',
707
- title: 'Approval Workflow',
708
- description:
709
- 'Optional callable Workflow that dispatches the request, waits for the external result, and returns the decision.',
920
+ enum: ['runOnceForAll'],
921
+ default: 'runOnceForAll',
710
922
  },
711
- approvalWorkflowInputBindings: {
712
- ...PARAMETER_BINDINGS_SCHEMA,
713
- title: 'Approval document fields',
714
- description:
715
- 'Bind the selected approval Workflow inputs to input, Workflow data, or fixed values.',
923
+ timeout: {
924
+ type: 'integer',
925
+ minimum: 1,
926
+ maximum: 5000,
927
+ default: 5000,
716
928
  },
717
- approverSources: {
718
- type: 'array',
719
- title: '自动找审批人',
720
- items: {
721
- type: 'object',
722
- properties: {
723
- workflowId: { type: 'string' },
724
- inputBindings: PARAMETER_BINDINGS_SCHEMA,
929
+ },
930
+ required: ['script'],
931
+ additionalProperties: false,
932
+ };
933
+
934
+ const HUMAN_APPROVAL_CONFIG_SCHEMA: NodeTypeSeed['configSchema'] = {
935
+ type: 'object',
936
+ properties: {
937
+ external: {
938
+ type: 'object',
939
+ title: '外部审批',
940
+ properties: {
941
+ request: APPROVAL_HTTP_REQUEST_CONFIG_SCHEMA,
942
+ creationResult: EMBEDDED_CODE_CONFIG_SCHEMA,
943
+ callbackResult: EMBEDDED_CODE_CONFIG_SCHEMA,
944
+ },
945
+ required: ['request', 'creationResult', 'callbackResult'],
946
+ additionalProperties: false,
947
+ },
948
+ task: {
949
+ type: 'object',
950
+ title: '审批任务',
951
+ properties: {
952
+ title: PARAMETER_BINDING_SCHEMA,
953
+ description: PARAMETER_BINDING_SCHEMA,
954
+ details: {
955
+ type: 'array',
956
+ default: [],
957
+ items: {
958
+ type: 'object',
959
+ properties: {
960
+ key: { type: 'string', minLength: 1 },
961
+ label: { type: 'string', minLength: 1 },
962
+ value: PARAMETER_BINDING_SCHEMA,
963
+ },
964
+ required: ['key', 'label', 'value'],
965
+ additionalProperties: false,
966
+ },
725
967
  },
726
- required: ['workflowId', 'inputBindings'],
727
968
  },
969
+ required: ['title', 'description', 'details'],
970
+ additionalProperties: false,
728
971
  },
729
972
  subjects: {
730
973
  type: 'array',
731
- title: 'Approvers',
732
- description: 'Users and reusable groups that may decide this request.',
733
- minItems: 0,
974
+ title: '审批人',
975
+ description: '可以处理本次审批的用户和可复用用户组',
976
+ minItems: 1,
977
+ default: [],
734
978
  'x-gadmin-capability': 'subject-references',
735
979
  items: {
736
980
  type: 'object',
737
981
  properties: {
738
982
  source: { type: 'string', enum: ['STATIC', 'DYNAMIC'] },
739
983
  provider: { type: 'string', enum: ['USER', 'USER_GROUP'] },
740
- refs: { type: 'array', items: { type: 'string' } },
741
- inputKey: { type: 'string' },
984
+ refs: {
985
+ type: 'array',
986
+ minItems: 1,
987
+ items: { type: 'string', minLength: 1 },
988
+ },
989
+ inputKey: { type: 'string', minLength: 1 },
990
+ label: { type: 'string', minLength: 1 },
991
+ lookup: {
992
+ type: 'object',
993
+ properties: {
994
+ request: HTTP_REQUEST_CONFIG_SCHEMA,
995
+ result: EMBEDDED_CODE_CONFIG_SCHEMA,
996
+ },
997
+ required: ['request', 'result'],
998
+ additionalProperties: false,
999
+ },
742
1000
  },
743
1001
  required: ['source', 'provider'],
744
1002
  allOf: [
@@ -748,36 +1006,64 @@ const HUMAN_APPROVAL_CONFIG_SCHEMA: NodeTypeSeed['configSchema'] = {
748
1006
  },
749
1007
  {
750
1008
  if: { properties: { source: { const: 'DYNAMIC' } } },
751
- then: { required: ['inputKey'] },
1009
+ then: { required: ['inputKey', 'label', 'lookup'] },
752
1010
  },
753
1011
  ],
1012
+ additionalProperties: false,
754
1013
  },
755
1014
  },
756
1015
  approvalRule: {
757
1016
  type: 'object',
758
- title: 'Approval rule',
1017
+ title: '通过规则',
759
1018
  properties: {
760
1019
  mode: { type: 'string', enum: ['ANY', 'ALL', 'COUNT', 'PERCENTAGE'] },
761
1020
  count: { type: 'integer', minimum: 1 },
762
1021
  percentage: { type: 'integer', minimum: 1, maximum: 100 },
763
1022
  },
764
1023
  required: ['mode'],
1024
+ allOf: [
1025
+ {
1026
+ if: { properties: { mode: { const: 'COUNT' } } },
1027
+ then: { required: ['count'] },
1028
+ },
1029
+ {
1030
+ if: { properties: { mode: { const: 'PERCENTAGE' } } },
1031
+ then: { required: ['percentage'] },
1032
+ },
1033
+ ],
1034
+ additionalProperties: false,
765
1035
  default: { mode: 'ANY' },
766
1036
  },
767
1037
  rejectionRule: {
768
1038
  type: 'object',
769
- title: 'Rejection rule',
1039
+ title: '拒绝规则',
770
1040
  properties: {
771
1041
  mode: { type: 'string', enum: ['ANY', 'ALL', 'COUNT', 'PERCENTAGE'] },
772
1042
  count: { type: 'integer', minimum: 1 },
773
1043
  percentage: { type: 'integer', minimum: 1, maximum: 100 },
774
1044
  },
775
1045
  required: ['mode'],
1046
+ allOf: [
1047
+ {
1048
+ if: { properties: { mode: { const: 'COUNT' } } },
1049
+ then: { required: ['count'] },
1050
+ },
1051
+ {
1052
+ if: { properties: { mode: { const: 'PERCENTAGE' } } },
1053
+ then: { required: ['percentage'] },
1054
+ },
1055
+ ],
1056
+ additionalProperties: false,
776
1057
  default: { mode: 'ANY' },
777
1058
  },
1059
+ blockCancellationOnResolved: {
1060
+ type: 'boolean',
1061
+ title: '审批完成后禁止取消',
1062
+ default: false,
1063
+ },
778
1064
  timeout: {
779
1065
  type: 'object',
780
- title: 'Timeout',
1066
+ title: '审批超时',
781
1067
  properties: {
782
1068
  durationSeconds: {
783
1069
  type: 'integer',
@@ -794,7 +1080,8 @@ const HUMAN_APPROVAL_CONFIG_SCHEMA: NodeTypeSeed['configSchema'] = {
794
1080
  default: { durationSeconds: 0, action: 'REJECTED' },
795
1081
  },
796
1082
  },
797
- required: ['subjects', 'approvalRule', 'rejectionRule', 'timeout'],
1083
+ required: ['task', 'subjects', 'approvalRule', 'rejectionRule', 'timeout'],
1084
+ additionalProperties: false,
798
1085
  };
799
1086
 
800
1087
  const HUMAN_APPROVAL_UI_SCHEMA: NodeTypeSeed['uiSchema'] = {
@@ -806,14 +1093,14 @@ const humanApprovalNode: NodeTypeSeed = {
806
1093
  configSchema: HUMAN_APPROVAL_CONFIG_SCHEMA,
807
1094
  outputs: ['true', 'false'],
808
1095
  runtimeKey: 'human_approval',
809
- schemaVersion: 7,
810
- instancePolicy: 'REQUIRED',
1096
+ schemaVersion: 20,
1097
+ instancePolicy: 'OPTIONAL',
811
1098
  uiSchema: HUMAN_APPROVAL_UI_SCHEMA,
812
1099
  };
813
1100
 
814
1101
  const callableTriggerNode: NodeTypeSeed = {
815
1102
  type: 'callable_trigger',
816
- category: 'SUB_WORKFLOW',
1103
+ category: 'TRIGGER',
817
1104
  label: '接收内部调用',
818
1105
  icon: 'ImportOutlined',
819
1106
  description: '接收其他地方传入的 Workflow 启动数据',
@@ -837,12 +1124,12 @@ const callableTriggerNode: NodeTypeSeed = {
837
1124
  },
838
1125
  inputSchema: { type: 'object' },
839
1126
  outputSchema: {
840
- description: 'Workflow start data supplied by the caller',
1127
+ description: '调用方传入的 Workflow 启动数据',
841
1128
  },
842
1129
  outputs: [],
843
1130
  runtimeKey: 'callable_trigger',
844
1131
  schemaVersion: 2,
845
- instancePolicy: 'INLINE_ONLY',
1132
+ instancePolicy: 'OPTIONAL',
846
1133
  uiSchema: {
847
1134
  fields: {
848
1135
  inputParameters: { widget: 'callable-input-parameters' },
@@ -850,26 +1137,6 @@ const callableTriggerNode: NodeTypeSeed = {
850
1137
  },
851
1138
  };
852
1139
 
853
- const returnResultNode: NodeTypeSeed = {
854
- type: 'return_result',
855
- category: 'SUB_WORKFLOW',
856
- label: '返回调用',
857
- icon: 'ExportOutlined',
858
- description: '结束当前 Workflow,并把上一个节点的结果返回给调用方',
859
- configSchema: {
860
- type: 'object',
861
- properties: {},
862
- additionalProperties: false,
863
- },
864
- inputSchema: { type: 'object' },
865
- outputSchema: { type: 'object' },
866
- outputs: [],
867
- runtimeKey: 'return_result',
868
- schemaVersion: 5,
869
- instancePolicy: 'INLINE_ONLY',
870
- uiSchema: { widget: 'return-result-config' },
871
- };
872
-
873
1140
  const externalWaitNode: NodeTypeSeed = {
874
1141
  type: 'external_wait',
875
1142
  category: 'FLOW_CONTROL',
@@ -891,6 +1158,42 @@ const externalWaitNode: NodeTypeSeed = {
891
1158
  deadlineBinding: PARAMETER_BINDING_SCHEMA,
892
1159
  },
893
1160
  required: ['mode'],
1161
+ allOf: [
1162
+ {
1163
+ if: {
1164
+ properties: { mode: { const: 'DURATION' } },
1165
+ required: ['mode'],
1166
+ },
1167
+ then: {
1168
+ required: ['durationSeconds'],
1169
+ not: { required: ['deadlineBinding'] },
1170
+ },
1171
+ },
1172
+ {
1173
+ if: {
1174
+ properties: { mode: { const: 'DEADLINE' } },
1175
+ required: ['mode'],
1176
+ },
1177
+ then: {
1178
+ required: ['deadlineBinding'],
1179
+ not: { required: ['durationSeconds'] },
1180
+ },
1181
+ },
1182
+ {
1183
+ if: {
1184
+ properties: { mode: { const: 'NONE' } },
1185
+ required: ['mode'],
1186
+ },
1187
+ then: {
1188
+ not: {
1189
+ anyOf: [
1190
+ { required: ['durationSeconds'] },
1191
+ { required: ['deadlineBinding'] },
1192
+ ],
1193
+ },
1194
+ },
1195
+ },
1196
+ ],
894
1197
  additionalProperties: false,
895
1198
  },
896
1199
  },
@@ -903,48 +1206,56 @@ const externalWaitNode: NodeTypeSeed = {
903
1206
  outputSchema: {
904
1207
  type: 'object',
905
1208
  properties: {
906
- callbackToken: { type: 'string' },
907
- nodeId: { type: 'string' },
908
- eventId: { type: 'string' },
909
- outcome: { type: 'string' },
910
- operatorId: { type: 'string' },
911
- data: { type: 'object' },
912
- completedAt: { type: 'string' },
913
- reason: { type: 'string' },
1209
+ previous: {
1210
+ description: '进入等待节点前收到的完整数据',
1211
+ },
1212
+ result: {
1213
+ type: 'object',
1214
+ properties: {
1215
+ callbackToken: { type: 'string' },
1216
+ eventId: { type: 'string' },
1217
+ outcome: { type: 'string' },
1218
+ operatorId: { type: 'string' },
1219
+ data: { type: 'object' },
1220
+ completedAt: { type: 'string' },
1221
+ reason: { type: 'string' },
1222
+ },
1223
+ required: ['callbackToken'],
1224
+ },
914
1225
  },
915
- required: ['callbackToken'],
1226
+ required: ['previous', 'result'],
916
1227
  },
917
1228
  outputs: ['RECEIVED', 'TIMEOUT'],
918
1229
  runtimeKey: 'external_wait',
919
- schemaVersion: 2,
920
- instancePolicy: 'INLINE_ONLY',
1230
+ schemaVersion: 6,
1231
+ instancePolicy: 'OPTIONAL',
921
1232
  uiSchema: { widget: 'external-wait-config' },
922
1233
  };
923
1234
 
924
- const httpRequestDefinition = INLINE_NODE_DEFINITIONS.find(
1235
+ const httpRequestDefinition = NODE_DEFINITIONS.find(
925
1236
  (definition) => definition.type === 'http_request',
926
1237
  )!;
927
1238
 
928
- const webhookDefinition = INLINE_NODE_DEFINITIONS.find(
1239
+ const webhookDefinition = NODE_DEFINITIONS.find(
929
1240
  (definition) => definition.type === 'webhook_trigger',
930
1241
  )!;
931
1242
 
932
1243
  const webhookNode: NodeTypeSeed = {
933
- ...inlineNode(webhookDefinition),
1244
+ ...templatableNode(webhookDefinition),
934
1245
  runtimeKey: 'webhook_trigger',
935
- schemaVersion: 4,
1246
+ schemaVersion: 5,
936
1247
  uiSchema: { widget: 'external-request-config' },
937
1248
  };
938
1249
 
939
1250
  const httpRequestNode: NodeTypeSeed = {
940
1251
  ...httpRequestDefinition,
941
1252
  runtimeKey: 'http_request',
942
- schemaVersion: 5,
1253
+ schemaVersion: 8,
943
1254
  instancePolicy: 'OPTIONAL',
944
1255
  uiSchema: { widget: 'http-request-config' },
945
1256
  };
946
1257
 
947
- const codeDefinition = INLINE_NODE_DEFINITIONS.find(
1258
+ const codeDefinition = NODE_DEFINITIONS.find(
948
1259
  (definition) => definition.type === 'code',
949
1260
  )!;
950
1261
 
@@ -955,58 +1266,114 @@ const codeNode: NodeTypeSeed = {
955
1266
  properties: {
956
1267
  script: {
957
1268
  type: 'string',
958
- description: 'JavaScript function body. Return the transformed value.',
1269
+ description: 'JavaScript 函数体,通过 return 返回处理结果',
959
1270
  default: 'return input;',
960
1271
  },
961
1272
  mode: {
962
1273
  type: 'string',
963
- enum: ['runOnceForAll', 'runOnceForEach'],
1274
+ enum: ['runOnceForAll'],
964
1275
  default: 'runOnceForAll',
965
1276
  },
966
1277
  timeout: {
967
1278
  type: 'integer',
968
1279
  minimum: 1,
969
1280
  maximum: 5000,
970
- default: 1000,
971
- description: 'Maximum script execution time in milliseconds',
1281
+ default: 5000,
1282
+ description: '代码执行的最长时间(毫秒)',
972
1283
  },
973
1284
  },
974
1285
  required: ['script'],
975
1286
  },
976
- inputSchema: { description: 'Any JSON value from the previous node' },
1287
+ inputSchema: { description: '上一个节点返回的任意 JSON 值' },
977
1288
  outputSchema: {
978
- description: 'Any JSON value returned by the script',
1289
+ description: '代码通过 return 返回的任意 JSON 值',
979
1290
  },
980
1291
  runtimeKey: 'code',
981
- schemaVersion: 4,
1292
+ schemaVersion: 6,
982
1293
  instancePolicy: 'OPTIONAL',
983
1294
  uiSchema: { widget: 'code-config' },
984
1295
  };
985
1296
 
1297
+ const forEachDefinition = NODE_DEFINITIONS.find(
1298
+ (definition) => definition.type === 'for_each',
1299
+ )!;
1300
+
1301
+ const forEachNode: NodeTypeSeed = {
1302
+ ...templatableNode(forEachDefinition),
1303
+ schemaVersion: 6,
1304
+ uiSchema: { widget: 'for-each-config' },
1305
+ };
1306
+
986
1307
  const subWorkflowNode: NodeTypeSeed = {
987
- ...inlineNode(subWorkflowDefinition),
988
- schemaVersion: 2,
1308
+ ...templatableNode(subWorkflowDefinition),
1309
+ schemaVersion: 5,
1310
+ uiSchema: { widget: 'sub-workflow-config' },
989
1311
  };
990
1312
 
1313
+ const dedicatedEditorNodes: NodeTypeSeed[] = [
1314
+ ['event_trigger', 'event-trigger-config'],
1315
+ ['db_execute', 'db-execute-config'],
1316
+ ['delay', 'delay-config'],
1317
+ ['parallel', 'parallel-config'],
1318
+ ['if_else', 'if-else-config'],
1319
+ ['switch', 'switch-config'],
1320
+ ].map(([type, widget]) => ({
1321
+ ...templatableNode(
1322
+ NODE_DEFINITIONS.find((definition) => definition.type === type)!,
1323
+ ),
1324
+ schemaVersion:
1325
+ type === 'event_trigger'
1326
+ ? 4
1327
+ : type === 'db_execute'
1328
+ ? 4
1329
+ : type === 'parallel'
1330
+ ? 6
1331
+ : ['if_else', 'switch'].includes(type)
1332
+ ? 3
1333
+ : 2,
1334
+ uiSchema: {
1335
+ widget,
1336
+ ...(type === 'db_execute' && {
1337
+ options: { validationErrors: 'widget' },
1338
+ }),
1339
+ },
1340
+ }));
1341
+
991
1342
  export const NODE_TYPES: NodeTypeSeed[] = [
992
- ...INLINE_NODE_DEFINITIONS.filter(
1343
+ ...NODE_DEFINITIONS.filter(
993
1344
  (definition) =>
994
1345
  definition.type !== 'http_request' &&
995
1346
  definition.type !== 'code' &&
1347
+ definition.type !== 'for_each' &&
1348
+ !dedicatedEditorNodes.some((node) => node.type === definition.type) &&
996
1349
  definition.type !== 'webhook_trigger',
997
- ).map(inlineNode),
1350
+ ).map(templatableNode),
998
1351
  webhookNode,
999
1352
  httpRequestNode,
1000
1353
  codeNode,
1354
+ forEachNode,
1355
+ ...dedicatedEditorNodes,
1001
1356
  humanApprovalNode,
1002
1357
  callableTriggerNode,
1003
- returnResultNode,
1004
1358
  externalWaitNode,
1005
1359
  subWorkflowNode,
1006
1360
  ];
1007
1361
 
1008
1362
  export async function seedNodeTypes(prisma: PrismaClient) {
1009
1363
  console.log('Seeding workflow node types...');
1364
+ for (const removedType of ['return_result', 'db_query']) {
1365
+ const removedNodeType = await prisma.workflowNodeType.findUnique({
1366
+ where: { type: removedType },
1367
+ select: { id: true },
1368
+ });
1369
+ if (!removedNodeType) continue;
1370
+ await prisma.workflowNodeInstance.deleteMany({
1371
+ where: { nodeTypeId: removedNodeType.id },
1372
+ });
1373
+ await prisma.workflowNodeType.delete({
1374
+ where: { id: removedNodeType.id },
1375
+ });
1376
+ }
1010
1377
  for (const nodeType of NODE_TYPES) {
1011
1378
  // Json? null requires Prisma.DbNull (SQL NULL) — literal null is rejected at type level.
1012
1379
  const outputsValue =