@gadmin2n/schematics 0.0.144 → 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
@@ -0,0 +1,57 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+
3
+ /**
4
+ * Workflow Outbox 初始化与旧数据表事件清理。
5
+ *
6
+ * 业务代码在自身事务中显式写入 t_workflow_event_outbox。Workflow 不再通过
7
+ * PostgreSQL Trigger 把任意数据表变化转换成事件。
8
+ */
9
+ export async function seedWorkflowOutbox(prisma: PrismaClient) {
10
+ console.log('Removing legacy workflow table-event triggers...');
11
+
12
+ await prisma.$executeRawUnsafe(`
13
+ DO $$
14
+ DECLARE
15
+ legacy_trigger record;
16
+ BEGIN
17
+ FOR legacy_trigger IN
18
+ SELECT
19
+ event_trigger.tgname AS trigger_name,
20
+ table_schema.nspname AS schema_name,
21
+ table_class.relname AS table_name
22
+ FROM pg_trigger event_trigger
23
+ JOIN pg_class table_class ON table_class.oid = event_trigger.tgrelid
24
+ JOIN pg_namespace table_schema ON table_schema.oid = table_class.relnamespace
25
+ JOIN pg_proc trigger_function ON trigger_function.oid = event_trigger.tgfoid
26
+ JOIN pg_namespace function_schema ON function_schema.oid = trigger_function.pronamespace
27
+ WHERE NOT event_trigger.tgisinternal
28
+ AND table_schema.nspname = current_schema()
29
+ AND function_schema.nspname = current_schema()
30
+ AND trigger_function.proname = 'notify_workflow_event'
31
+ LOOP
32
+ EXECUTE format(
33
+ 'DROP TRIGGER %I ON %I.%I',
34
+ legacy_trigger.trigger_name,
35
+ legacy_trigger.schema_name,
36
+ legacy_trigger.table_name
37
+ );
38
+ END LOOP;
39
+
40
+ EXECUTE format(
41
+ 'DROP FUNCTION IF EXISTS %I.notify_workflow_event()',
42
+ current_schema()
43
+ );
44
+ END
45
+ $$;
46
+ `);
47
+
48
+ console.log('Seeding workflow outbox partial index...');
49
+
50
+ await prisma.$executeRawUnsafe(`
51
+ CREATE INDEX IF NOT EXISTS idx_outbox_unprocessed
52
+ ON t_workflow_event_outbox (created_at)
53
+ WHERE processed = FALSE;
54
+ `);
55
+
56
+ console.log('Workflow outbox initialized.');
57
+ }
@@ -5,8 +5,8 @@ import {
5
5
  grantRoleAccess,
6
6
  upsertPage,
7
7
  } from '../scripts/lib/page-helpers';
8
- import { seedWorkflowEventTrigger } from './workflow-event-trigger';
9
8
  import { seedNodeTypes } from './workflow-node-types';
9
+ import { seedWorkflowOutbox } from './workflow-outbox';
10
10
 
11
11
  /**
12
12
  * Workflow 模块 seed
@@ -15,9 +15,9 @@ import { seedNodeTypes } from './workflow-node-types';
15
15
  * 1. 菜单结构:workflow 父分组及其管理、审批任务页面
16
16
  * 2. resource: workflow / workflowNodeInstance
17
17
  * 3. PageResource 绑定与 SYSTEM_ADMIN 授权
18
- * 4. 业务数据:node-types / workflows / event-trigger function & index
18
+ * 4. 业务数据:node-types / workflows / Outbox index
19
19
  *
20
- * 业务数据 seed 函数仍来自 ./workflow-{node-types,workflows,event-trigger}.ts
20
+ * 业务数据 seed 函数仍来自 ./workflow-{node-types,workflows,outbox}.ts
21
21
  * (文件较大,保持独立但只被本入口 import,不再由 seed/index.ts 直接调用)。
22
22
  *
23
23
  * 前置:seedBootstrap 已建好 SYSTEM_ADMIN。
@@ -83,11 +83,19 @@ export async function seedWorkflowModule(prisma: PrismaClient): Promise<void> {
83
83
  resourceCode: 'temporalTenantConfig',
84
84
  resourceDescription: 'Temporal tenant config management',
85
85
  },
86
+ {
87
+ code: 'workflow_event_catalog',
88
+ zhName: '业务事件',
89
+ enName: 'Business Events',
90
+ sortOrder: 5,
91
+ resourceCode: 'workflow',
92
+ resourceDescription: 'Read registered Workflow business events',
93
+ },
86
94
  {
87
95
  code: 'approval_tasks',
88
96
  zhName: '审批任务',
89
97
  enName: 'Approval Tasks',
90
- sortOrder: 5,
98
+ sortOrder: 6,
91
99
  resourceCode: 'humanApproval',
92
100
  resourceDescription: 'Read and decide assigned Human Approval tasks',
93
101
  },
@@ -121,6 +129,28 @@ export async function seedWorkflowModule(prisma: PrismaClient): Promise<void> {
121
129
  );
122
130
  console.log(`[workflow] PageResource: ${def.code} ↔ ${def.resourceCode}`);
123
131
 
132
+ if (def.code === 'workflow_event_catalog') {
133
+ await bindResourceToPage(
134
+ prisma,
135
+ p.id,
136
+ 'workflowEventRegistration',
137
+ 'Register database-backed Workflow business events',
138
+ );
139
+ console.log(
140
+ '[workflow] PageResource: workflow_event_catalog ↔ workflowEventRegistration',
141
+ );
142
+ }
143
+
144
+ if (def.code === 'workflow_list') {
145
+ await bindResourceToPage(
146
+ prisma,
147
+ p.id,
148
+ 'workflowExecution',
149
+ 'Execute published manual Workflows',
150
+ );
151
+ console.log('[workflow] PageResource: workflow_list ↔ workflowExecution');
152
+ }
153
+
124
154
  // Provider actions live inside the existing Node Instance page. Resolve is
125
155
  // seeded now for the later publish/runtime call path; it has no HTTP route yet.
126
156
  if (def.code === 'workflow_node_instance') {
@@ -201,5 +231,5 @@ export async function seedWorkflowModule(prisma: PrismaClient): Promise<void> {
201
231
 
202
232
  // ── 业务数据 ───────────────────────────────────────────────────────────────
203
233
  await seedNodeTypes(prisma);
204
- await seedWorkflowEventTrigger(prisma);
234
+ await seedWorkflowOutbox(prisma);
205
235
  }
@@ -75,7 +75,21 @@ const WORKFLOWS = [
75
75
  type: 'if_else',
76
76
  label: '审批结果判断',
77
77
  position: { x: 850, y: 200 },
78
- config: {},
78
+ config: {
79
+ conditions: [
80
+ {
81
+ id: 'approval-approved',
82
+ left: { source: 'INPUT', path: 'response.approved' },
83
+ operator: 'EQ',
84
+ right: {
85
+ source: 'FIXED',
86
+ valueType: 'BOOLEAN',
87
+ value: 'true',
88
+ },
89
+ },
90
+ ],
91
+ combineOperation: 'AND',
92
+ },
79
93
  },
80
94
  {
81
95
  id: 'action_2',
@@ -119,21 +133,43 @@ const WORKFLOWS = [
119
133
  type: 'event_trigger',
120
134
  label: '监听错误事件',
121
135
  position: { x: 100, y: 200 },
122
- config: {},
136
+ config: {
137
+ registrationCode: 'admin-audit-log-insert',
138
+ processingMode: 'PARALLEL',
139
+ },
123
140
  },
124
141
  {
125
142
  id: 'action_1',
126
- type: 'db_query',
143
+ type: 'db_execute',
127
144
  label: '查询近5分钟错误数',
128
145
  position: { x: 350, y: 200 },
129
- config: {},
146
+ config: {
147
+ allowWrite: false,
148
+ sql: "SELECT COUNT(*) AS error_count FROM t_admin_audit_log WHERE created_at >= NOW() - INTERVAL '5 minutes'",
149
+ parameters: [],
150
+ timeoutSeconds: 30,
151
+ },
130
152
  },
131
153
  {
132
154
  id: 'condition_1',
133
155
  type: 'if_else',
134
156
  label: '错误率 > 5%?',
135
157
  position: { x: 600, y: 200 },
136
- config: {},
158
+ config: {
159
+ conditions: [
160
+ {
161
+ id: 'error-count-high',
162
+ left: { source: 'INPUT', path: 'rows.0.error_count' },
163
+ operator: 'GT',
164
+ right: {
165
+ source: 'FIXED',
166
+ valueType: 'NUMBER',
167
+ value: '5',
168
+ },
169
+ },
170
+ ],
171
+ combineOperation: 'AND',
172
+ },
137
173
  },
138
174
  {
139
175
  id: 'action_3',
@@ -176,17 +212,26 @@ const WORKFLOWS = [
176
212
  },
177
213
  {
178
214
  id: 'action_1',
179
- type: 'db_query',
215
+ type: 'db_execute',
180
216
  label: '查询数据',
181
217
  position: { x: 350, y: 200 },
182
- config: {},
218
+ config: {
219
+ allowWrite: false,
220
+ sql: 'SELECT * FROM t_admin_audit_log',
221
+ parameters: [],
222
+ timeoutSeconds: 30,
223
+ },
183
224
  },
184
225
  {
185
226
  id: 'loop_1',
186
227
  type: 'for_each',
187
228
  label: '遍历分页',
188
229
  position: { x: 600, y: 200 },
189
- config: {},
230
+ config: {
231
+ itemsBinding: { source: 'INPUT', path: 'rows' },
232
+ execution: { mode: 'SEQUENTIAL' },
233
+ errorPolicy: 'STOP',
234
+ },
190
235
  },
191
236
  {
192
237
  id: 'action_2',
@@ -199,7 +244,25 @@ const WORKFLOWS = [
199
244
  edges: [
200
245
  { id: 'e-trigger_1-action_1', source: 'trigger_1', target: 'action_1' },
201
246
  { id: 'e-action_1-loop_1', source: 'action_1', target: 'loop_1' },
202
- { id: 'e-loop_1-action_2', source: 'loop_1', target: 'action_2' },
247
+ {
248
+ id: 'e-loop_1-action_2',
249
+ kind: 'CALL',
250
+ pairId: 'pair-loop_1-action_2',
251
+ source: 'loop_1',
252
+ target: 'action_2',
253
+ sourceHandle: 'start',
254
+ targetHandle: 'data-in',
255
+ },
256
+ {
257
+ id: 'e-action_2-loop_1',
258
+ kind: 'RETURN',
259
+ pairId: 'pair-loop_1-action_2',
260
+ source: 'action_2',
261
+ target: 'loop_1',
262
+ sourceHandle: 'result-out',
263
+ targetHandle: 'end',
264
+ valueType: 'JSON',
265
+ },
203
266
  ],
204
267
  },
205
268
  },
@@ -223,7 +286,12 @@ const WORKFLOWS = [
223
286
  type: 'parallel',
224
287
  label: '并行部署',
225
288
  position: { x: 350, y: 200 },
226
- config: {},
289
+ config: {
290
+ branches: [
291
+ { id: 'staging', label: '部署 Staging' },
292
+ { id: 'production', label: '部署 Production' },
293
+ ],
294
+ },
227
295
  },
228
296
  {
229
297
  id: 'action_1',
@@ -232,13 +300,6 @@ const WORKFLOWS = [
232
300
  position: { x: 600, y: 100 },
233
301
  config: {},
234
302
  },
235
- {
236
- id: 'approval_1',
237
- type: 'approval',
238
- label: 'Production 审批',
239
- position: { x: 600, y: 300 },
240
- config: {},
241
- },
242
303
  {
243
304
  id: 'action_2',
244
305
  type: 'http_request',
@@ -255,18 +316,41 @@ const WORKFLOWS = [
255
316
  },
256
317
  {
257
318
  id: 'e-parallel_1-action_1',
319
+ kind: 'CALL',
320
+ pairId: 'pair-staging',
258
321
  source: 'parallel_1',
259
322
  target: 'action_1',
323
+ sourceHandle: 'staging-start',
324
+ targetHandle: 'request-in',
260
325
  },
261
326
  {
262
- id: 'e-parallel_1-approval_1',
263
- source: 'parallel_1',
264
- target: 'approval_1',
327
+ id: 'e-action_1-parallel_1',
328
+ kind: 'RETURN',
329
+ pairId: 'pair-staging',
330
+ source: 'action_1',
331
+ target: 'parallel_1',
332
+ sourceHandle: 'response-out',
333
+ targetHandle: 'staging-end',
334
+ valueType: 'JSON',
265
335
  },
266
336
  {
267
- id: 'e-approval_1-action_2',
268
- source: 'approval_1',
337
+ id: 'e-parallel_1-action_2',
338
+ kind: 'CALL',
339
+ pairId: 'pair-production',
340
+ source: 'parallel_1',
269
341
  target: 'action_2',
342
+ sourceHandle: 'production-start',
343
+ targetHandle: 'request-in',
344
+ },
345
+ {
346
+ id: 'e-action_2-parallel_1',
347
+ kind: 'RETURN',
348
+ pairId: 'pair-production',
349
+ source: 'action_2',
350
+ target: 'parallel_1',
351
+ sourceHandle: 'response-out',
352
+ targetHandle: 'production-end',
353
+ valueType: 'JSON',
270
354
  },
271
355
  ],
272
356
  },
@@ -285,16 +369,21 @@ const WORKFLOWS = [
285
369
  type: 'event_trigger',
286
370
  label: '监听角色变更事件',
287
371
  position: { x: 100, y: 200 },
288
- config: { eventName: 'user_role.updated' },
372
+ config: {
373
+ registrationCode: 'admin-user-role-update',
374
+ processingMode: 'PARALLEL',
375
+ },
289
376
  },
290
377
  {
291
378
  id: 'action_1',
292
- type: 'db_query',
379
+ type: 'db_execute',
293
380
  label: '查询用户详情',
294
381
  position: { x: 350, y: 200 },
295
382
  config: {
296
- query:
297
- 'SELECT userid, username, roles FROM t_admin_user_role WHERE userid = $1',
383
+ allowWrite: false,
384
+ sql: 'SELECT userid, username, roles FROM t_admin_user_role WHERE userid = $1',
385
+ parameters: [{ source: 'INPUT', path: 'userid' }],
386
+ timeoutSeconds: 30,
298
387
  },
299
388
  },
300
389
  {
@@ -314,8 +403,18 @@ const WORKFLOWS = [
314
403
  position: { x: 850, y: 200 },
315
404
  config: {
316
405
  conditions: [
317
- { field: 'added', operator: 'contains', value: 'SYSTEM_ADMIN' },
406
+ {
407
+ id: 'contains-system-admin',
408
+ left: { source: 'INPUT', path: 'added' },
409
+ operator: 'CONTAINS',
410
+ right: {
411
+ source: 'FIXED',
412
+ valueType: 'STRING',
413
+ value: 'SYSTEM_ADMIN',
414
+ },
415
+ },
318
416
  ],
417
+ combineOperation: 'AND',
319
418
  },
320
419
  },
321
420
  {
@@ -363,16 +462,18 @@ const WORKFLOWS = [
363
462
  type: 'cron_trigger',
364
463
  label: '每日9点检查',
365
464
  position: { x: 100, y: 200 },
366
- config: { cron: '0 9 * * *', timezone: 'Asia/Shanghai' },
465
+ config: { cronExpressions: ['0 9 * * *'], timezone: 'Asia/Shanghai' },
367
466
  },
368
467
  {
369
468
  id: 'action_1',
370
- type: 'db_query',
469
+ type: 'db_execute',
371
470
  label: '查询3天内活动',
372
471
  position: { x: 350, y: 200 },
373
472
  config: {
374
- query:
375
- "SELECT * FROM t_event WHERE start_date BETWEEN NOW() AND NOW() + INTERVAL '3 days'",
473
+ allowWrite: false,
474
+ sql: "SELECT * FROM t_event WHERE start_date BETWEEN NOW() AND NOW() + INTERVAL '3 days'",
475
+ parameters: [],
476
+ timeoutSeconds: 30,
376
477
  },
377
478
  },
378
479
  {
@@ -381,7 +482,19 @@ const WORKFLOWS = [
381
482
  label: '有即将开始的活动?',
382
483
  position: { x: 600, y: 200 },
383
484
  config: {
384
- conditions: [{ field: 'rowCount', operator: 'gt', value: '0' }],
485
+ conditions: [
486
+ {
487
+ id: 'has-upcoming-events',
488
+ left: { source: 'INPUT', path: 'rowCount' },
489
+ operator: 'GT',
490
+ right: {
491
+ source: 'FIXED',
492
+ valueType: 'NUMBER',
493
+ value: '0',
494
+ },
495
+ },
496
+ ],
497
+ combineOperation: 'AND',
385
498
  },
386
499
  },
387
500
  {
@@ -389,21 +502,10 @@ const WORKFLOWS = [
389
502
  type: 'for_each',
390
503
  label: '遍历活动列表',
391
504
  position: { x: 850, y: 150 },
392
- config: { iteratorField: 'rows', concurrency: 3 },
393
- },
394
- {
395
- id: 'condition_2',
396
- type: 'if_else',
397
- label: '已同步ServiceNow?',
398
- position: { x: 1100, y: 150 },
399
505
  config: {
400
- conditions: [
401
- {
402
- field: 'currentItem.sn_sys_id',
403
- operator: 'isNotEmpty',
404
- value: '',
405
- },
406
- ],
506
+ itemsBinding: { source: 'INPUT', path: 'rows' },
507
+ execution: { mode: 'PARALLEL', concurrency: 3 },
508
+ errorPolicy: 'STOP',
407
509
  },
408
510
  },
409
511
  {
@@ -452,14 +554,32 @@ const WORKFLOWS = [
452
554
  target: 'action_5',
453
555
  label: 'false',
454
556
  },
455
- { id: 'e-loop_1-condition_2', source: 'loop_1', target: 'condition_2' },
456
557
  {
457
- id: 'e-condition_2-action_2',
458
- source: 'condition_2',
558
+ id: 'e-loop_1-action_2',
559
+ kind: 'CALL',
560
+ pairId: 'pair-loop_1-action_2',
561
+ source: 'loop_1',
459
562
  target: 'action_2',
460
- label: 'false',
563
+ sourceHandle: 'start',
564
+ targetHandle: 'data-in',
565
+ },
566
+ {
567
+ id: 'e-action_2-action_3',
568
+ kind: 'FLOW',
569
+ pairId: 'pair-loop_1-action_2',
570
+ source: 'action_2',
571
+ target: 'action_3',
572
+ },
573
+ {
574
+ id: 'e-action_3-loop_1',
575
+ kind: 'RETURN',
576
+ pairId: 'pair-loop_1-action_2',
577
+ source: 'action_3',
578
+ target: 'loop_1',
579
+ sourceHandle: 'result-out',
580
+ targetHandle: 'end',
581
+ valueType: 'JSON',
461
582
  },
462
- { id: 'e-action_2-action_3', source: 'action_2', target: 'action_3' },
463
583
  ],
464
584
  },
465
585
  },
@@ -478,16 +598,21 @@ const WORKFLOWS = [
478
598
  type: 'event_trigger',
479
599
  label: '监听用户创建事件',
480
600
  position: { x: 100, y: 200 },
481
- config: { eventName: 'user.created' },
601
+ config: {
602
+ registrationCode: 'admin-user-role-insert',
603
+ processingMode: 'PARALLEL',
604
+ },
482
605
  },
483
606
  {
484
607
  id: 'action_1',
485
- type: 'db_query',
608
+ type: 'db_execute',
486
609
  label: '查询新用户信息',
487
610
  position: { x: 350, y: 200 },
488
611
  config: {
489
- query:
490
- 'SELECT userid, username, roles, is_active FROM t_admin_user_role WHERE userid = $1',
612
+ allowWrite: false,
613
+ sql: 'SELECT userid, username, roles, is_active FROM t_admin_user_role WHERE userid = $1',
614
+ parameters: [{ source: 'INPUT', path: 'userid' }],
615
+ timeoutSeconds: 30,
491
616
  },
492
617
  },
493
618
  {
@@ -507,8 +632,18 @@ const WORKFLOWS = [
507
632
  position: { x: 850, y: 200 },
508
633
  config: {
509
634
  conditions: [
510
- { field: 'needsUpdate', operator: 'eq', value: 'true' },
635
+ {
636
+ id: 'needs-default-role',
637
+ left: { source: 'INPUT', path: 'needsUpdate' },
638
+ operator: 'EQ',
639
+ right: {
640
+ source: 'FIXED',
641
+ valueType: 'BOOLEAN',
642
+ value: 'true',
643
+ },
644
+ },
511
645
  ],
646
+ combineOperation: 'AND',
512
647
  },
513
648
  },
514
649
  {
@@ -519,8 +654,19 @@ const WORKFLOWS = [
519
654
  config: {
520
655
  operation: 'update',
521
656
  table: 't_admin_user_role',
522
- data: { roles: '["GUEST"]' },
523
- where: 'userid = $1',
657
+ values: [
658
+ {
659
+ column: 'roles',
660
+ binding: {
661
+ source: 'FIXED',
662
+ valueType: 'STRING',
663
+ value: '["GUEST"]',
664
+ },
665
+ },
666
+ ],
667
+ where: 'userid = $2',
668
+ parameters: [{ source: 'INPUT', path: 'userid' }],
669
+ timeoutSeconds: 30,
524
670
  },
525
671
  },
526
672
  {
@@ -541,7 +687,26 @@ const WORKFLOWS = [
541
687
  config: {
542
688
  operation: 'insert',
543
689
  table: 't_admin_audit_log',
544
- data: { action: 'user.onboarded', resource: 'user' },
690
+ values: [
691
+ {
692
+ column: 'action',
693
+ binding: {
694
+ source: 'FIXED',
695
+ valueType: 'STRING',
696
+ value: 'user.onboarded',
697
+ },
698
+ },
699
+ {
700
+ column: 'resource',
701
+ binding: {
702
+ source: 'FIXED',
703
+ valueType: 'STRING',
704
+ value: 'user',
705
+ },
706
+ },
707
+ ],
708
+ parameters: [],
709
+ timeoutSeconds: 30,
545
710
  },
546
711
  },
547
712
  ],
@@ -39,4 +39,27 @@ describe('executeCode', () => {
39
39
  applicant: 'alice',
40
40
  });
41
41
  });
42
+
43
+ it('exposes node-local scopes without replacing input', async () => {
44
+ await expect(
45
+ executeCode(
46
+ {
47
+ script:
48
+ 'return { title: input.title, requestId: approval.requestId, status: response.status, eventId: callback.eventId };',
49
+ },
50
+ { title: '服务器权限申请' },
51
+ {},
52
+ {
53
+ approval: { requestId: '41' },
54
+ response: { status: 201 },
55
+ callback: { eventId: 'external:W-1' },
56
+ },
57
+ ),
58
+ ).resolves.toEqual({
59
+ title: '服务器权限申请',
60
+ requestId: '41',
61
+ status: 201,
62
+ eventId: 'external:W-1',
63
+ });
64
+ });
42
65
  });
@@ -6,14 +6,23 @@ export interface CodeNodeConfig {
6
6
  timeout?: number;
7
7
  }
8
8
 
9
+ export interface CodeNodeScopes {
10
+ approval?: unknown;
11
+ response?: unknown;
12
+ callback?: unknown;
13
+ }
14
+
9
15
  const WORKER_SOURCE = String.raw`
10
16
  const { parentPort, workerData } = require('node:worker_threads');
11
17
  const vm = require('node:vm');
12
18
 
13
- function run(script, input, workflow, timeout) {
19
+ function run(script, input, workflow, scopes, timeout) {
14
20
  const sandbox = Object.create(null);
15
21
  sandbox.input = input;
16
22
  sandbox.workflow = workflow;
23
+ sandbox.approval = scopes.approval;
24
+ sandbox.response = scopes.response;
25
+ sandbox.callback = scopes.callback;
17
26
  sandbox.data = input && typeof input === 'object' && 'data' in input
18
27
  ? input.data
19
28
  : input;
@@ -32,17 +41,17 @@ function run(script, input, workflow, timeout) {
32
41
  }
33
42
 
34
43
  try {
35
- const { config, input, workflow } = workerData;
44
+ const { config, input, workflow, scopes } = workerData;
36
45
  let result;
37
46
  if (config.mode === 'runOnceForEach') {
38
47
  const items = Array.isArray(input)
39
48
  ? input
40
49
  : input && Array.isArray(input.items) ? input.items : [];
41
50
  result = items.map((item) =>
42
- run(config.script, item, workflow, config.timeout)
51
+ run(config.script, item, workflow, scopes, config.timeout)
43
52
  );
44
53
  } else {
45
- result = run(config.script, input, workflow, config.timeout);
54
+ result = run(config.script, input, workflow, scopes, config.timeout);
46
55
  }
47
56
  parentPort.postMessage({ ok: true, result });
48
57
  } catch (error) {
@@ -57,11 +66,12 @@ export async function executeCode(
57
66
  config: CodeNodeConfig,
58
67
  input: unknown,
59
68
  workflow: Record<string, unknown> = {},
69
+ scopes: CodeNodeScopes = {},
60
70
  ): Promise<unknown> {
61
71
  if (typeof config.script !== 'string' || !config.script.trim())
62
72
  throw new Error('CODE_SCRIPT_REQUIRED');
63
73
  const timeout = Math.min(
64
- Math.max(Math.trunc(config.timeout ?? 1000), 1),
74
+ Math.max(Math.trunc(config.timeout ?? 5000), 1),
65
75
  5000,
66
76
  );
67
77
  const mode = config.mode ?? 'runOnceForAll';
@@ -75,6 +85,7 @@ export async function executeCode(
75
85
  config: { script: config.script, mode, timeout },
76
86
  input,
77
87
  workflow,
88
+ scopes,
78
89
  },
79
90
  resourceLimits: {
80
91
  maxOldGenerationSizeMb: 16,