@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
@@ -1,5 +1,7 @@
1
1
  import { BadRequestException } from '@nestjs/common';
2
+ import { NODE_TYPES } from '../../../seed/workflow-node-types';
2
3
  import { NodeConfigValidatorService } from './node-config-validator.service';
4
+ import type { JsonSchema } from './schema.types';
3
5
 
4
6
  describe('NodeConfigValidatorService', () => {
5
7
  const schema = {
@@ -32,6 +34,7 @@ describe('NodeConfigValidatorService', () => {
32
34
  expect(error).toBeInstanceOf(BadRequestException);
33
35
  expect((error as BadRequestException).getResponse()).toEqual({
34
36
  code: 'NODE_CONFIG_INVALID',
37
+ message: '节点配置不完整或有误',
35
38
  errors: expect.arrayContaining([
36
39
  { path: '/count', keyword: 'minimum', message: 'must be >= 1' },
37
40
  {
@@ -53,8 +56,9 @@ describe('NodeConfigValidatorService', () => {
53
56
  (config) => {
54
57
  expect(() => service.validateOrThrow('12:3', schema, config)).toThrow(
55
58
  expect.objectContaining({
56
- response: {
59
+ response: expect.objectContaining({
57
60
  code: 'NODE_CONFIG_INVALID',
61
+ message: '节点配置不完整或有误',
58
62
  errors: [
59
63
  {
60
64
  path: '/',
@@ -62,7 +66,7 @@ describe('NodeConfigValidatorService', () => {
62
66
  message: 'must be object',
63
67
  },
64
68
  ],
65
- },
69
+ }),
66
70
  }),
67
71
  );
68
72
  },
@@ -76,4 +80,277 @@ describe('NodeConfigValidatorService', () => {
76
80
 
77
81
  expect(compile).toHaveBeenCalledTimes(1);
78
82
  });
83
+
84
+ it('rejects an approval without any possible approver', () => {
85
+ const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
86
+ const approvalSchema = approval.configSchema as JsonSchema;
87
+
88
+ expect(() =>
89
+ service.validateOrThrow('approval:10', approvalSchema, {
90
+ subjects: [],
91
+ approvalRule: { mode: 'ANY' },
92
+ rejectionRule: { mode: 'ANY' },
93
+ timeout: { durationSeconds: 0, action: 'REJECTED' },
94
+ }),
95
+ ).toThrow(BadRequestException);
96
+ });
97
+
98
+ it('accepts a complete approval and requires threshold values', () => {
99
+ const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
100
+ const approvalSchema = approval.configSchema as JsonSchema;
101
+ const baseConfig = {
102
+ task: {
103
+ title: {
104
+ source: 'FIXED',
105
+ valueType: 'STRING',
106
+ value: '请审批',
107
+ },
108
+ description: {
109
+ source: 'FIXED',
110
+ valueType: 'STRING',
111
+ value: '',
112
+ },
113
+ details: [],
114
+ },
115
+ subjects: [{ source: 'STATIC', provider: 'USER', refs: ['reviewer'] }],
116
+ rejectionRule: { mode: 'ANY' },
117
+ timeout: { durationSeconds: 0, action: 'REJECTED' },
118
+ };
119
+
120
+ expect(() =>
121
+ service.validateOrThrow('approval:10-valid', approvalSchema, {
122
+ ...baseConfig,
123
+ approvalRule: { mode: 'COUNT', count: 1 },
124
+ }),
125
+ ).not.toThrow();
126
+ expect(() =>
127
+ service.validateOrThrow('approval:10-invalid', approvalSchema, {
128
+ ...baseConfig,
129
+ approvalRule: { mode: 'COUNT' },
130
+ }),
131
+ ).toThrow(BadRequestException);
132
+ });
133
+
134
+ it('requires a complete embedded external approval configuration when enabled', () => {
135
+ const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
136
+ const approvalSchema = approval.configSchema as JsonSchema;
137
+ const config = {
138
+ task: {
139
+ title: {
140
+ source: 'FIXED',
141
+ valueType: 'STRING',
142
+ value: '请审批',
143
+ },
144
+ description: {
145
+ source: 'FIXED',
146
+ valueType: 'STRING',
147
+ value: '',
148
+ },
149
+ details: [],
150
+ },
151
+ subjects: [{ source: 'STATIC', provider: 'USER', refs: ['reviewer'] }],
152
+ approvalRule: { mode: 'ANY' },
153
+ rejectionRule: { mode: 'ANY' },
154
+ timeout: { durationSeconds: 0, action: 'REJECTED' },
155
+ };
156
+
157
+ expect(() =>
158
+ service.validateOrThrow('approval:external-missing', approvalSchema, {
159
+ ...config,
160
+ external: {
161
+ request: {
162
+ connectionRef: 'myoa',
163
+ method: 'POST',
164
+ path: '/approvals',
165
+ bodyMode: 'JSON',
166
+ },
167
+ },
168
+ }),
169
+ ).toThrow(BadRequestException);
170
+ expect(() =>
171
+ service.validateOrThrow('approval:external-valid', approvalSchema, {
172
+ ...config,
173
+ external: {
174
+ request: {
175
+ connectionRef: 'myoa',
176
+ method: 'POST',
177
+ path: '/approvals',
178
+ bodyMode: 'FIELDS',
179
+ bodyBindings: {
180
+ callbackToken: {
181
+ source: 'APPROVAL',
182
+ path: 'callbackToken',
183
+ },
184
+ },
185
+ },
186
+ creationResult: { script: 'return response;' },
187
+ callbackResult: { script: 'return callback.body;' },
188
+ },
189
+ }),
190
+ ).not.toThrow();
191
+ });
192
+
193
+ it('requires the HTTP and Code configuration for dynamic approvers', () => {
194
+ const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
195
+ const approvalSchema = approval.configSchema as JsonSchema;
196
+ const config = {
197
+ task: {
198
+ title: {
199
+ source: 'FIXED',
200
+ valueType: 'STRING',
201
+ value: '请审批',
202
+ },
203
+ description: {
204
+ source: 'FIXED',
205
+ valueType: 'STRING',
206
+ value: '',
207
+ },
208
+ details: [],
209
+ },
210
+ subjects: [
211
+ {
212
+ source: 'DYNAMIC',
213
+ provider: 'USER',
214
+ inputKey: 'direct_manager',
215
+ label: '查询直属领导',
216
+ },
217
+ ],
218
+ approvalRule: { mode: 'ANY' },
219
+ rejectionRule: { mode: 'ANY' },
220
+ timeout: { durationSeconds: 0, action: 'REJECTED' },
221
+ };
222
+
223
+ expect(() =>
224
+ service.validateOrThrow(
225
+ 'approval:lookup-missing',
226
+ approvalSchema,
227
+ config,
228
+ ),
229
+ ).toThrow(BadRequestException);
230
+ expect(() =>
231
+ service.validateOrThrow('approval:lookup-valid', approvalSchema, {
232
+ ...config,
233
+ subjects: [
234
+ {
235
+ ...config.subjects[0],
236
+ lookup: {
237
+ request: {
238
+ connectionRef: 'erp',
239
+ method: 'GET',
240
+ path: '/',
241
+ bodyMode: 'FIELDS',
242
+ },
243
+ result: { script: 'return response;' },
244
+ },
245
+ },
246
+ ],
247
+ }),
248
+ ).not.toThrow();
249
+ });
250
+
251
+ it.each(['', ' '])(
252
+ 'rejects a blank HTTP request field name when publishing',
253
+ (fieldName) => {
254
+ const httpRequest = NODE_TYPES.find(
255
+ (node) => node.type === 'http_request',
256
+ )!;
257
+ const httpRequestSchema = httpRequest.configSchema as JsonSchema;
258
+
259
+ expect(() =>
260
+ service.validateOrThrow('http-request:empty-field', httpRequestSchema, {
261
+ connectionRef: 'erp',
262
+ method: 'GET',
263
+ path: '/',
264
+ queryBindings: {
265
+ [fieldName]: {
266
+ source: 'FIXED',
267
+ valueType: 'STRING',
268
+ value: '',
269
+ },
270
+ },
271
+ bodyMode: 'FIELDS',
272
+ }),
273
+ ).toThrow(BadRequestException);
274
+ },
275
+ );
276
+
277
+ it('requires the matching external wait timeout value', () => {
278
+ const externalWait = NODE_TYPES.find(
279
+ (node) => node.type === 'external_wait',
280
+ )!;
281
+ const externalWaitSchema = externalWait.configSchema as JsonSchema;
282
+ const callbackTokenBinding = { source: 'INPUT', path: 'callbackToken' };
283
+
284
+ expect(() =>
285
+ service.validateOrThrow(
286
+ 'external-wait:duration-invalid',
287
+ externalWaitSchema,
288
+ {
289
+ callbackTokenBinding,
290
+ timeout: { mode: 'DURATION' },
291
+ },
292
+ ),
293
+ ).toThrow(BadRequestException);
294
+ expect(() =>
295
+ service.validateOrThrow(
296
+ 'external-wait:deadline-invalid',
297
+ externalWaitSchema,
298
+ {
299
+ callbackTokenBinding,
300
+ timeout: { mode: 'DEADLINE' },
301
+ },
302
+ ),
303
+ ).toThrow(BadRequestException);
304
+ expect(() =>
305
+ service.validateOrThrow(
306
+ 'external-wait:duration-valid',
307
+ externalWaitSchema,
308
+ {
309
+ callbackTokenBinding,
310
+ timeout: { mode: 'DURATION', durationSeconds: 60 },
311
+ },
312
+ ),
313
+ ).not.toThrow();
314
+ expect(() =>
315
+ service.validateOrThrow(
316
+ 'external-wait:deadline-valid',
317
+ externalWaitSchema,
318
+ {
319
+ callbackTokenBinding,
320
+ timeout: {
321
+ mode: 'DEADLINE',
322
+ deadlineBinding: { source: 'WORKFLOW', path: 'deadline' },
323
+ },
324
+ },
325
+ ),
326
+ ).not.toThrow();
327
+ });
328
+
329
+ it('requires concurrency for parallel for-each execution', () => {
330
+ const forEach = NODE_TYPES.find((node) => node.type === 'for_each')!;
331
+ const forEachSchema = forEach.configSchema as JsonSchema;
332
+ const baseConfig = {
333
+ itemsBinding: { source: 'INPUT', path: 'items' },
334
+ errorPolicy: 'STOP',
335
+ };
336
+
337
+ expect(() =>
338
+ service.validateOrThrow('for-each:parallel-invalid', forEachSchema, {
339
+ ...baseConfig,
340
+ execution: { mode: 'PARALLEL' },
341
+ }),
342
+ ).toThrow(BadRequestException);
343
+ expect(() =>
344
+ service.validateOrThrow('for-each:parallel-valid', forEachSchema, {
345
+ ...baseConfig,
346
+ execution: { mode: 'PARALLEL', concurrency: 3 },
347
+ }),
348
+ ).not.toThrow();
349
+ expect(() =>
350
+ service.validateOrThrow('for-each:sequential-valid', forEachSchema, {
351
+ ...baseConfig,
352
+ execution: { mode: 'SEQUENTIAL' },
353
+ }),
354
+ ).not.toThrow();
355
+ });
79
356
  });
@@ -57,6 +57,10 @@ export class NodeConfigValidatorService {
57
57
  });
58
58
 
59
59
  private throwInvalid(errors: NodeConfigValidationError[]): never {
60
- throw new BadRequestException({ code: 'NODE_CONFIG_INVALID', errors });
60
+ throw new BadRequestException({
61
+ code: 'NODE_CONFIG_INVALID',
62
+ message: '节点配置不完整或有误',
63
+ errors,
64
+ });
61
65
  }
62
66
  }
@@ -89,7 +89,10 @@ describe('SubjectConfigValidatorService', () => {
89
89
  actor,
90
90
  ),
91
91
  ).rejects.toMatchObject({
92
- response: { code: 'SUBJECT_REF_INVALID' },
92
+ response: {
93
+ code: 'SUBJECT_REF_INVALID',
94
+ message: '审批人配置不完整或无效',
95
+ },
93
96
  });
94
97
  });
95
98
 
@@ -212,7 +212,11 @@ export class SubjectConfigValidatorService {
212
212
  }
213
213
 
214
214
  private throwInvalid(issues: SubjectValidationIssue[]): never {
215
- throw new BadRequestException({ code: 'SUBJECT_REF_INVALID', issues });
215
+ throw new BadRequestException({
216
+ code: 'SUBJECT_REF_INVALID',
217
+ message: '审批人配置不完整或无效',
218
+ issues,
219
+ });
216
220
  }
217
221
  }
218
222
 
@@ -11,7 +11,15 @@ describe('WidgetCatalogService', () => {
11
11
  externalWait: { widget: 'external-wait-config' },
12
12
  callableInputs: { widget: 'callable-input-parameters' },
13
13
  approvalRequest: { widget: 'approval-request-trigger-config' },
14
- returnResult: { widget: 'return-result-config' },
14
+ manualTrigger: { widget: 'manual-trigger-config' },
15
+ forEach: { widget: 'for-each-config' },
16
+ subWorkflow: { widget: 'sub-workflow-config' },
17
+ eventTrigger: { widget: 'event-trigger-config' },
18
+ database: { widget: 'db-execute-config' },
19
+ delay: { widget: 'delay-config' },
20
+ parallel: { widget: 'parallel-config' },
21
+ ifElse: { widget: 'if-else-config' },
22
+ switch: { widget: 'switch-config' },
15
23
  }),
16
24
  ).not.toThrow();
17
25
  });
@@ -37,11 +45,12 @@ describe('WidgetCatalogService', () => {
37
45
  }),
38
46
  ).toThrow(
39
47
  expect.objectContaining({
40
- response: {
48
+ response: expect.objectContaining({
41
49
  code: 'NODE_WIDGET_NOT_REGISTERED',
50
+ message: '服务端尚未启用当前节点所需的配置组件',
42
51
  widget: 'missing-widget',
43
52
  path: '/approval/subjects/widget',
44
- },
53
+ }),
45
54
  }),
46
55
  );
47
56
  });
@@ -13,10 +13,18 @@ const PRIMITIVE_WIDGETS = [
13
13
  const WORKFLOW_WIDGETS = [
14
14
  'callable-input-parameters',
15
15
  'approval-request-trigger-config',
16
- 'return-result-config',
17
16
  'external-request-config',
18
17
  'submit-approval-result-config',
19
18
  'external-wait-config',
19
+ 'manual-trigger-config',
20
+ 'for-each-config',
21
+ 'sub-workflow-config',
22
+ 'event-trigger-config',
23
+ 'db-execute-config',
24
+ 'delay-config',
25
+ 'parallel-config',
26
+ 'if-else-config',
27
+ 'switch-config',
20
28
  ] as const;
21
29
 
22
30
  @Injectable()
@@ -50,6 +58,7 @@ export class WidgetCatalogService {
50
58
  if (!this.widgets.has(child)) {
51
59
  throw new BadRequestException({
52
60
  code: 'NODE_WIDGET_NOT_REGISTERED',
61
+ message: '服务端尚未启用当前节点所需的配置组件',
53
62
  widget: child,
54
63
  path: toJsonPointer(childPath),
55
64
  });
@@ -26,18 +26,6 @@ const mockPrismaService = {
26
26
  },
27
27
  };
28
28
 
29
- const mockNodeConfigValidator = {
30
- validateOrThrow: jest.fn(),
31
- };
32
-
33
- const mockWidgetCatalog = {
34
- assertUiSchemaSupported: jest.fn(),
35
- };
36
-
37
- const mockSubjectConfigValidator = {
38
- validateSubjects: jest.fn(),
39
- };
40
-
41
29
  describe('WorkflowNodeInstanceService', () => {
42
30
  let service: WorkflowNodeInstanceService;
43
31
  let prisma: typeof mockPrismaService;
@@ -46,12 +34,7 @@ describe('WorkflowNodeInstanceService', () => {
46
34
  // 每个测试前重置所有 mock
47
35
  jest.clearAllMocks();
48
36
 
49
- service = new WorkflowNodeInstanceService(
50
- mockPrismaService as any,
51
- mockNodeConfigValidator as any,
52
- mockWidgetCatalog as any,
53
- mockSubjectConfigValidator as any,
54
- );
37
+ service = new WorkflowNodeInstanceService(mockPrismaService as any);
55
38
  prisma = mockPrismaService;
56
39
  });
57
40
 
@@ -76,7 +59,7 @@ describe('WorkflowNodeInstanceService', () => {
76
59
  };
77
60
  const actor = { userId: 'user-1', username: 'tester' };
78
61
 
79
- it('should validate and create a configured node instance', async () => {
62
+ it('should save an incomplete config without publish-time validation', async () => {
80
63
  const expectedResult = {
81
64
  id: BigInt(1),
82
65
  ...input,
@@ -90,11 +73,6 @@ describe('WorkflowNodeInstanceService', () => {
90
73
 
91
74
  const result = await service.createConfigured(input, actor);
92
75
 
93
- expect(mockNodeConfigValidator.validateOrThrow).toHaveBeenCalledWith(
94
- '1:1',
95
- nodeType.configSchema,
96
- input.config,
97
- );
98
76
  expect(prisma.workflowNodeInstance.create).toHaveBeenCalledWith({
99
77
  data: {
100
78
  nodeTypeId: BigInt(1),
@@ -3,10 +3,6 @@ import { Prisma, WorkflowNodeInstance } from '@prisma/client';
3
3
  import { PrismaService } from 'nestjs-prisma';
4
4
 
5
5
  import { ActorContext } from '../subjectProvider/subject-provider.types';
6
- import { NodeConfigValidatorService } from '../workflowConfig/node-config-validator.service';
7
- import { JsonSchema } from '../workflowConfig/schema.types';
8
- import { SubjectConfigValidatorService } from '../workflowConfig/subject-config-validator.service';
9
- import { WidgetCatalogService } from '../workflowConfig/widget-catalog.service';
10
6
  import {
11
7
  CreateConfiguredNodeInstanceDto,
12
8
  UpdateConfiguredNodeInstanceDto,
@@ -14,12 +10,7 @@ import {
14
10
 
15
11
  @Injectable()
16
12
  export class WorkflowNodeInstanceService {
17
- constructor(
18
- private prisma: PrismaService,
19
- private readonly nodeConfigValidator: NodeConfigValidatorService,
20
- private readonly widgetCatalog: WidgetCatalogService,
21
- private readonly subjectConfigValidator: SubjectConfigValidatorService,
22
- ) {}
13
+ constructor(private prisma: PrismaService) {}
23
14
 
24
15
  async createConfigured(
25
16
  input: CreateConfiguredNodeInstanceDto,
@@ -27,18 +18,10 @@ export class WorkflowNodeInstanceService {
27
18
  ) {
28
19
  const nodeType = await this.prisma.workflowNodeType.findUnique({
29
20
  where: { id: BigInt(input.nodeTypeId) },
30
- select: {
31
- id: true,
32
- runtimeKey: true,
33
- schemaVersion: true,
34
- configSchema: true,
35
- uiSchema: true,
36
- },
21
+ select: { id: true },
37
22
  });
38
23
  if (!nodeType) throw new NotFoundException('Node type not found');
39
24
 
40
- await this.validateConfig(nodeType, input.config, actor);
41
-
42
25
  const config = input.config as Prisma.InputJsonValue;
43
26
  const creator = this.creatorFrom(actor);
44
27
  const instance = await this.prisma.workflowNodeInstance.create({
@@ -63,23 +46,10 @@ export class WorkflowNodeInstanceService {
63
46
  const id = BigInt(instanceId);
64
47
  const instance = await this.prisma.workflowNodeInstance.findUnique({
65
48
  where: { id },
66
- select: {
67
- id: true,
68
- nodeType: {
69
- select: {
70
- id: true,
71
- runtimeKey: true,
72
- schemaVersion: true,
73
- configSchema: true,
74
- uiSchema: true,
75
- },
76
- },
77
- },
49
+ select: { id: true },
78
50
  });
79
51
  if (!instance) throw new NotFoundException('Node instance not found');
80
52
 
81
- if (input.config !== undefined)
82
- await this.validateConfig(instance.nodeType, input.config, actor);
83
53
  const data = {
84
54
  ...(input.name !== undefined && { name: input.name }),
85
55
  ...(input.description !== undefined && {
@@ -102,43 +72,6 @@ export class WorkflowNodeInstanceService {
102
72
  return updated;
103
73
  }
104
74
 
105
- private async validateConfig(
106
- nodeType: {
107
- id: bigint;
108
- runtimeKey: string;
109
- schemaVersion: number;
110
- configSchema: Prisma.JsonValue;
111
- uiSchema: Prisma.JsonValue;
112
- },
113
- config: unknown,
114
- actor: ActorContext,
115
- ): Promise<void> {
116
- const schemaKey = `${nodeType.id}:${nodeType.schemaVersion}`;
117
- const configSchema = nodeType.configSchema as JsonSchema;
118
-
119
- this.nodeConfigValidator.validateOrThrow(schemaKey, configSchema, config);
120
- this.widgetCatalog.assertUiSchemaSupported(nodeType.uiSchema);
121
- await this.subjectConfigValidator.validateSubjects(
122
- configSchema,
123
- config,
124
- actor,
125
- );
126
- if (nodeType.runtimeKey === 'http_request') {
127
- const connectionRef = (config as Record<string, unknown>)?.connectionRef;
128
- const connection =
129
- typeof connectionRef === 'string'
130
- ? await this.prisma.integrationConnection.findUnique({
131
- where: { code: connectionRef },
132
- select: { isEnabled: true },
133
- })
134
- : null;
135
- if (!connection?.isEnabled)
136
- throw new NotFoundException(
137
- 'HTTP Request Connection was not found or is disabled',
138
- );
139
- }
140
- }
141
-
142
75
  private creatorFrom(actor: ActorContext): string {
143
76
  return actor.username ?? actor.userId;
144
77
  }
@@ -11,7 +11,7 @@
11
11
  "@dnd-kit/sortable": "^7.0.2",
12
12
  "@dnd-kit/utilities": "^3.2.2",
13
13
  "@gadmin2n/charts": "0.0.10",
14
- "@gadmin2n/react-common": "^0.0.72",
14
+ "@gadmin2n/react-common": "^0.0.75",
15
15
  "@monaco-editor/react": "^4.7.0",
16
16
  "@refinedev/antd": "^6.0.3",
17
17
  "@refinedev/cli": "^2.16.52",
@@ -22,6 +22,8 @@
22
22
  "@tanstack/react-query": "^5.81.5",
23
23
  "@uiw/react-md-editor": "^3.19.5",
24
24
  "@xyflow/react": "^12.10.2",
25
+ "ajv": "^8.16.0",
26
+ "ajv-formats": "^2.1.1",
25
27
  "antd": "^5.24.6",
26
28
  "class-validator": "^0.14.0",
27
29
  "dayjs": "^1.11.19",
@@ -49,7 +49,7 @@ export interface RowActionsProps<T = any> {
49
49
  showDetail?: boolean;
50
50
  showClone?: boolean;
51
51
  showDelete?: boolean;
52
- /** History/Log button —— actions 数组里没有,需要通过 LogButton 或显式 showHistory 开启 */
52
+ /** History/Log button —— 强制显式覆盖;actions 未声明 HISTORY 时需显式 showHistory 或 LogButton 开启 */
53
53
  showHistory?: boolean;
54
54
  /** Custom children - if provided, replaces entire default UI */
55
55
  children?:
@@ -95,7 +95,7 @@ export function RowActions<T extends { id: number | string }>({
95
95
  showDetail,
96
96
  showClone,
97
97
  showDelete,
98
- showHistory = false,
98
+ showHistory,
99
99
  children,
100
100
  renderEditButton,
101
101
  renderDetailButton,
@@ -132,6 +132,7 @@ export function RowActions<T extends { id: number | string }>({
132
132
  const resolvedShowDetail = showDetail ?? flags.showDetail;
133
133
  const resolvedShowClone = showClone ?? flags.showClone;
134
134
  const resolvedShowDelete = showDelete ?? flags.showDelete;
135
+ const resolvedShowHistory = showHistory ?? flags.showHistory;
135
136
 
136
137
  // ---------- 默认按钮渲染器 ----------
137
138
  const defaultEditButton = (id: number | string) => (
@@ -212,6 +213,22 @@ export function RowActions<T extends { id: number | string }>({
212
213
  : defaultDetailButton(recordId),
213
214
  }
214
215
  : null;
216
+ case 'CLONE':
217
+ return resolvedShowClone
218
+ ? {
219
+ key,
220
+ node: renderCloneButton
221
+ ? renderCloneButton(recordId)
222
+ : defaultCloneButton(recordId),
223
+ }
224
+ : null;
225
+ case 'HISTORY': {
226
+ if (!resolvedShowHistory) return null;
227
+ const node = renderHistoryButton
228
+ ? renderHistoryButton(recordId)
229
+ : defaultHistoryButton(recordId);
230
+ return node != null ? { key, node } : null;
231
+ }
215
232
  case 'DELETE':
216
233
  return resolvedShowDelete
217
234
  ? {
@@ -281,8 +298,8 @@ export function RowActions<T extends { id: number | string }>({
281
298
  .map((a, i) => renderAction(a, i))
282
299
  .filter((x): x is Renderable => x != null);
283
300
 
284
- // 隐式按钮(actions 数组里通常没有):CLONE 由显式 showClone 控制;HISTORY 由 showHistory 或 LogButton 触发
285
- if (resolvedShowClone) {
301
+ // 隐式按钮:CLONE/HISTORY 未在 actions 声明时,分别由显式 showClone、showHistory 或 LogButton 触发
302
+ if (resolvedShowClone && !actions.some((a) => a.action === 'CLONE')) {
286
303
  renderables.push({
287
304
  key: 'clone-implicit',
288
305
  node: renderCloneButton
@@ -290,7 +307,10 @@ export function RowActions<T extends { id: number | string }>({
290
307
  : defaultCloneButton(recordId),
291
308
  });
292
309
  }
293
- if (showHistory || LogButton) {
310
+ if (
311
+ (showHistory || LogButton) &&
312
+ !actions.some((a) => a.action === 'HISTORY')
313
+ ) {
294
314
  const node = renderHistoryButton
295
315
  ? renderHistoryButton(recordId)
296
316
  : defaultHistoryButton(recordId);