@gadmin2n/schematics 0.0.143 → 0.0.145

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +10 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +2 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +140 -19
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +2 -2
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/data-mngt.seed.ts +0 -2
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +694 -327
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-outbox.ts +57 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +35 -5
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +224 -59
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +23 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +16 -5
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.spec.ts +98 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +26 -6
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +17 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +3 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -2
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +30 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +28 -6
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +63 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +151 -38
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +4 -1
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +16 -5
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +23 -6
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.spec.ts +130 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +62 -62
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +15 -1
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +70 -9
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +31 -7
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.spec.ts +30 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +28 -6
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +50 -3
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +26 -3
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +53 -47
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +0 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.spec.ts +541 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +442 -200
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +1 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.spec.ts +150 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +56 -40
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +16 -60
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +13 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.spec.ts +44 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +6 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +258 -12
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +127 -14
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.spec.ts +85 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.ts +108 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +5 -5
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +96 -25
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +77 -34
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +23 -34
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +0 -21
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +245 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +639 -188
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +408 -235
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +1 -3
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +279 -95
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +360 -80
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-event-catalog.spec.ts +323 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution-idempotency.spec.ts +773 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +7 -13
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +0 -16
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.spec.ts +184 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +69 -138
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.spec.ts +113 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +59 -13
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-runtime.facade.ts +86 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.spec.ts +25 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.ts +45 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +78 -43
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +103 -40
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +57 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +3 -1
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +1000 -240
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +2184 -317
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +279 -2
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +5 -1
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +4 -1
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +5 -1
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +12 -3
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +10 -1
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +2 -24
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +3 -70
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +3 -1
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +25 -5
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.test.tsx +71 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.tsx +89 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +52 -12
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +12 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -2
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +10 -33
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +13 -37
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -7
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +14 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +10 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/workflowAction.ts +19 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +1 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +3 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -6
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useReferenceUpload.ts +95 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -2
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +672 -110
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -2
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +676 -114
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +13 -1
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +1 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +38 -4
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +276 -376
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +126 -6
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.test.tsx +50 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +48 -11
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +32 -34
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.test.tsx +111 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.tsx +167 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/business-events.css +99 -0
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.test.tsx +106 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.tsx +324 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.test.tsx +73 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.tsx +359 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CanvasZoomControls.tsx +46 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +9 -1
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +105 -4
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +90 -48
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +3 -2
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.test.tsx +259 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +167 -103
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +142 -140
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +60 -15
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +25 -12
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +364 -200
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +220 -52
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.test.tsx +260 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +300 -130
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +507 -33
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +630 -592
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +67 -70
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.test.tsx +90 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.tsx +325 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.test.tsx +52 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +14 -9
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +2 -1
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +2 -1
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.test.tsx +42 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.tsx +76 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowWorkspaceHeader.tsx +56 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/parameter-binding-editor.css +46 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/workflow-code-editor.css +34 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +53 -7
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +123 -62
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connections.css +85 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connectionsApi.ts +29 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.test.tsx +75 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +69 -36
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.test.tsx +494 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +665 -194
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.test.tsx +92 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.ts +96 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.test.tsx +297 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +135 -65
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +53 -42
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +344 -155
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +79 -58
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +123 -144
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +169 -98
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/node-instance-form.css +91 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +54 -31
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +854 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +41 -14
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +75 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +3 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +20 -2
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +2 -1
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +61 -66
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +33 -1
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +47 -15
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/BranchConfigEditors.test.tsx +104 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +22 -52
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.test.tsx +72 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +78 -70
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CronTriggerConfigEditor.tsx +569 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +130 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DelayConfigEditor.tsx +100 -0
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/EventTriggerConfigEditor.tsx +620 -0
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +22 -45
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +25 -92
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +3 -11
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.test.tsx +58 -0
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.tsx +107 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +212 -31
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +214 -304
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +175 -40
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +693 -293
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/IfElseConfigEditor.tsx +190 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.test.tsx +152 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.tsx +286 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParallelConfigEditor.tsx +101 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParameterBindingListEditor.tsx +99 -0
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +495 -0
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.test.tsx +124 -0
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.tsx +222 -0
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +2 -4
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SwitchConfigEditor.tsx +204 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +3 -1
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +9 -6
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/callable-workflow.ts +4 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/code-config.css +96 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/event-catalog.api.ts +117 -0
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/http-request-config.css +242 -0
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/human-approval-config.css +194 -0
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +264 -167
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +6 -9
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +19 -16
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +28 -4
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.test.tsx +59 -0
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.ts +24 -0
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.test.ts +311 -0
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.ts +198 -0
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.test.ts +143 -0
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.ts +19 -0
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +103 -5
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +158 -3
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +117 -9
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.test.ts +70 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.ts +48 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.test.ts +55 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +95 -22
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +148 -1
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +62 -11
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +19 -0
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +1 -1
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.test.ts +45 -0
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.ts +26 -0
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.test.ts +502 -0
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.ts +694 -0
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.test.ts +27 -0
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.ts +33 -0
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.test.ts +34 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.ts +52 -0
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.test.ts +99 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.ts +91 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.test.ts +74 -0
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.ts +120 -0
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/workflow-ui.css +481 -0
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
  248. package/package.json +1 -1
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +0 -62
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +0 -86
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-event-trigger.ts +0 -60
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
@@ -1,10 +1,17 @@
1
1
  import { useState, useCallback, useRef } from 'react';
2
2
  import type {
3
+ CallableWorkflowOption,
3
4
  WorkflowDSL,
4
5
  AgentOutput,
5
6
  WorkflowNodeType,
6
7
  NodeInstanceAgentOutput,
7
8
  } from '../types';
9
+ import {
10
+ buildWorkflowHandlePrompt,
11
+ buildWorkflowSkillPrompt,
12
+ selectWorkflowPromptNodeTypes,
13
+ } from '../utils/workflowSkillPrompt';
14
+ import { validateWorkflowDsl } from '../utils/validateWorkflowDsl';
8
15
 
9
16
  function extractJson(text: string): string | null {
10
17
  const match = text.match(/```json\s*([\s\S]*?)```/);
@@ -103,73 +110,77 @@ function sendPromptAndWait<T>(
103
110
 
104
111
  interface UseWorkflowAgentOptions {
105
112
  nodeTypes: WorkflowNodeType[];
113
+ referencedConfigs?: Record<string, Record<string, any>>;
114
+ callableWorkflows?: CallableWorkflowOption[];
106
115
  }
107
116
 
108
- export function useWorkflowAgent({ nodeTypes }: UseWorkflowAgentOptions) {
117
+ export function useWorkflowAgent({
118
+ nodeTypes,
119
+ referencedConfigs = {},
120
+ callableWorkflows,
121
+ }: UseWorkflowAgentOptions) {
109
122
  const [loading, setLoading] = useState(false);
110
123
  const [error, setError] = useState<string | null>(null);
111
124
  const abortControllerRef = useRef<AbortController | null>(null);
112
125
 
113
- const buildSystemContext = useCallback(() => {
114
- const nodeTypeSummary = nodeTypes
115
- .map(
116
- (nt) =>
117
- `- ${nt.type} (${nt.category}): ${nt.description}. Config: ${JSON.stringify(nt.configSchema)}`,
126
+ const buildSystemContext = useCallback(
127
+ (contextNodeTypes: WorkflowNodeType[] = nodeTypes) => {
128
+ const nodeTypeSummary = contextNodeTypes
129
+ .map(
130
+ (nt) =>
131
+ `- ${nt.type}(${nt.category}):${nt.description}。配置 Schema:${JSON.stringify(nt.configSchema)}。输入 Schema:${JSON.stringify(nt.inputSchema)}。输出 Schema:${JSON.stringify(nt.outputSchema)}`,
132
+ )
133
+ .join('\n');
134
+
135
+ const handleSection = buildWorkflowHandlePrompt(contextNodeTypes);
136
+ const callableSection = contextNodeTypes.some(
137
+ (nodeType) => nodeType.type === 'sub_workflow',
118
138
  )
119
- .join('\n');
120
-
121
- const enumeratedHandleRules = nodeTypes
122
- .filter((nt) => Array.isArray(nt.outputs) && nt.outputs.length > 0)
123
- .map(
124
- (nt) =>
125
- ` - ${nt.type}: sourceHandle MUST be one of [${nt
126
- .outputs!.map((o) => `'${o}'`)
127
- .join(', ')}]`,
128
- )
129
- .join('\n');
130
-
131
- const dynamicHandleRules = nodeTypes
132
- .filter((nt) => nt.outputs === null)
133
- .map(
134
- (nt) =>
135
- ` - ${nt.type}: sourceHandle MUST match a value listed in this node's config.cases[].value`,
136
- )
137
- .join('\n');
138
-
139
- const noHandleTypes = nodeTypes
140
- .filter((nt) => Array.isArray(nt.outputs) && nt.outputs.length === 0)
141
- .map((nt) => nt.type)
142
- .join(', ');
139
+ ? `\n\n可调用 Workflow 目录(调用节点只能使用这里列出的 workflowId 和对应 workflowVersionId,不得编造 ID):\n${
140
+ callableWorkflows && callableWorkflows.length > 0
141
+ ? JSON.stringify(callableWorkflows, null, 2)
142
+ : '当前没有可调用 Workflow;不要生成 sub_workflow 节点。'
143
+ }`
144
+ : '';
143
145
 
144
- const handleSection = `
145
- Source handle rules (each edge's sourceHandle MUST match the source node's outputs):
146
- ${enumeratedHandleRules}
147
- ${dynamicHandleRules}
148
- For ALL OTHER node types (${noHandleTypes}), edges MUST NOT include the sourceHandle field — omit it entirely.`;
146
+ return `你是 Workflow DSL 生成助手。最终结果只能返回一个由 \`\`\`json 代码块包裹的 JSON 对象。
149
147
 
150
- return `You are a workflow DSL generator. Output ONLY a JSON object wrapped in \`\`\`json code block.
151
-
152
- Available node types:
148
+ 本次相关节点类型:
153
149
  ${nodeTypeSummary}
150
+ ${callableSection}
154
151
 
155
- DSL format:
152
+ 返回格式:
156
153
  {
157
154
  "dsl": { "nodes": [...], "edges": [...] },
158
- "changeSummary": "brief description of changes"
155
+ "changeSummary": "简要说明本次修改"
159
156
  }
160
157
 
161
- Each node: { "id": "uuid", "type": "node_type", "label": "Display Name", "position": {"x": number, "y": number}, "config": {...} }
162
- Each edge: { "id": "uuid", "source": "nodeId", "target": "nodeId", "sourceHandle?": "string", "label?": "string" }
158
+ 节点结构:{ "id": "uuid", "type": "node_type", "label": "显示名称", "position": {"x": number, "y": number}, "config": {...} }
159
+ 边结构:{ "id": "uuid", "source": "nodeId", "target": "nodeId", "sourceHandle?": "string", "targetHandle?": "string", "kind?": "FLOW" | "CALL" | "RETURN", "pairId?": "string", "valueType?": "JSON" | "USER_IDS" | "USER_GROUP_IDS", "label?": "string" }
163
160
  ${handleSection}
164
161
 
165
- Data rules:
166
- - "input" always means the value returned by the immediately previous FLOW node.
167
- - "workflow" always means the original data received when the Workflow started.
168
- - A callable parameter binding must be structured as {"source":"INPUT"|"WORKFLOW","path":"relative.path"} or {"source":"FIXED","valueType":"STRING"|"NUMBER"|"BOOLEAN"|"JSON","value":"..."}.
169
- - Never generate context, inputMapping, node UUID paths, nodes.xxx, PREVIOUS, or CONTEXT_PATH as data references.
170
-
171
- Position nodes using: x = vertical order (increment by 250 for each sequential step), y = horizontal lane (0 for single-path flows; use different y values spaced by 200 only for parallel branches).`;
172
- }, [nodeTypes]);
162
+ 数据规则:
163
+ - "input" 表示紧邻的上一个 FLOW 节点返回的值。
164
+ - "workflow" 表示 Workflow 启动时收到的原始数据。
165
+ - 普通参数绑定使用 {"source":"INPUT"|"WORKFLOW","path":"relative.path"} 或 {"source":"FIXED","valueType":"STRING"|"NUMBER"|"BOOLEAN"|"JSON","value":"..."}。
166
+ - 复合节点内部产生的数据使用节点专属域,不能改变 input 的含义。人工审批外部派单使用 "approval";内嵌 Code 的 HTTP 响应使用 "response",外部回调使用 "callback"。
167
+ - 只有人工审批的 external.request 允许 {"source":"APPROVAL","path":"relative.path"} 或 {{approval.relative.path}};其他节点不得使用 APPROVAL。
168
+ - 禁止使用 context、inputMapping、节点 UUID 路径、nodes.xxx、PREVIOUS 或 CONTEXT_PATH 引用数据。
169
+
170
+ 画布规则:
171
+ - 每个节点和每条边都必须有唯一、非空的 id。
172
+ - 恰好包含一个 *_trigger 节点,所有节点都必须连接到该入口图。
173
+ - FLOW 边必须构成 DAG,不能把后续节点连回前序节点。
174
+ - pairId 只用于 for_each 或 parallel 的完整 START → CALL → FLOW → RETURN → END 私有处理链,普通 FLOW 不得携带 pairId。
175
+ - 每个非触发节点最多一条主流程入边,分支不能合流到同一节点。
176
+ - 普通节点最多一条主流程出边,每个命名分支出口最多连接一次。
177
+ - for_each 必须从 START 连接处理链并返回 END;parallel 配置的每个分支也必须各自形成完整 START / END 处理链。两种节点都只从唯一主流程 OUT 继续。
178
+ - Workflow 自然结束时,终点节点产生的结果就是整个 Workflow 的 output。
179
+
180
+ 节点位置:按执行顺序横向排列,x 每步增加约 250;单路径 y 为 0,只有真实分支才使用间隔约 200 的不同纵向泳道。`;
181
+ },
182
+ [callableWorkflows, nodeTypes],
183
+ );
173
184
 
174
185
  const abort = useCallback(() => {
175
186
  abortControllerRef.current?.abort();
@@ -197,32 +208,55 @@ Position nodes using: x = vertical order (increment by 250 for each sequential s
197
208
 
198
209
  try {
199
210
  let userPrompt = '';
200
- const systemContext = buildSystemContext();
211
+ const callableCatalogReady = callableWorkflows !== undefined;
212
+ const targetNodeType =
213
+ params.action === 'edit_node'
214
+ ? params.currentDsl?.nodes.find(
215
+ (node) => node.id === params.targetNodeId,
216
+ )?.type
217
+ : params.action === 'create_node_instance'
218
+ ? params.nodeType?.type
219
+ : undefined;
220
+ if (targetNodeType === 'sub_workflow' && !callableCatalogReady) {
221
+ throw new Error(
222
+ '可调用 Workflow 目录不可用,暂时不能生成或修改调用 Workflow 节点。',
223
+ );
224
+ }
225
+ const promptNodeTypes = callableCatalogReady
226
+ ? nodeTypes
227
+ : nodeTypes.filter((nodeType) => nodeType.type !== 'sub_workflow');
228
+ const skillNodeTypes = targetNodeType
229
+ ? [targetNodeType]
230
+ : promptNodeTypes.map((nodeType) => nodeType.type);
231
+ const skillContext = buildWorkflowSkillPrompt(skillNodeTypes);
232
+ const systemContext = `${skillContext}\n\n${buildSystemContext([
233
+ ...selectWorkflowPromptNodeTypes(promptNodeTypes, targetNodeType),
234
+ ])}`;
201
235
 
202
236
  if (params.action === 'create') {
203
- userPrompt = `${systemContext}\n\nCreate a workflow: ${params.prompt}`;
237
+ userPrompt = `${systemContext}\n\n请创建一个 Workflow:${params.prompt}`;
204
238
  } else if (params.action === 'edit_workflow') {
205
- userPrompt = `${systemContext}\n\nCurrent DSL:\n\`\`\`json\n${JSON.stringify(params.currentDsl, null, 2)}\n\`\`\`\n\nModify the workflow: ${params.prompt}\n\nReturn the COMPLETE updated DSL.`;
239
+ userPrompt = `${systemContext}\n\n当前 DSL:\n\`\`\`json\n${JSON.stringify(params.currentDsl, null, 2)}\n\`\`\`\n\n请修改这个 Workflow:${params.prompt}\n\n返回修改后的完整 DSL。`;
206
240
  } else if (params.action === 'edit_node') {
207
- userPrompt = `${systemContext}\n\nCurrent DSL:\n\`\`\`json\n${JSON.stringify(params.currentDsl, null, 2)}\n\`\`\`\n\nModify ONLY the node with id "${params.targetNodeId}": ${params.prompt}\n\nReturn the COMPLETE updated DSL with only that node changed.`;
241
+ userPrompt = `${systemContext}\n\n当前 DSL:\n\`\`\`json\n${JSON.stringify(params.currentDsl, null, 2)}\n\`\`\`\n\n只修改 ID 为 "${params.targetNodeId}" 的节点:${params.prompt}\n\n返回修改后的完整 DSL,并确保只有这个节点发生变化。`;
208
242
  } else if (params.action === 'create_node_instance') {
209
243
  const nt = params.nodeType!;
210
- const nodeInstanceContext = `You are a node instance config generator. Output ONLY a JSON object wrapped in \`\`\`json code block.
244
+ const nodeInstanceContext = `你是 Workflow 节点模板配置助手。最终结果只能返回一个由 \`\`\`json 代码块包裹的 JSON 对象。
211
245
 
212
- Node type: ${nt.type} (${nt.category}) - ${nt.description}
246
+ 节点类型:${nt.type}(${nt.category})— ${nt.description}
213
247
 
214
- configSchema (your output "config" must conform to this):
248
+ 配置 Schema(输出的 "config" 必须符合该 Schema):
215
249
  ${JSON.stringify(nt.configSchema, null, 2)}
216
250
 
217
- Business scenario: ${params.scenarioHint || 'Generate appropriate configuration for this node type.'}
251
+ 业务场景:${params.scenarioHint || '为该节点类型生成合适的配置。'}
218
252
 
219
- Output format (strict):
253
+ 严格输出以下格式:
220
254
  {
221
- "name": "A descriptive instance name",
222
- "description": "What this instance does",
223
- "config": { ... fields matching configSchema ... }
255
+ "name": "有业务含义的模板名称",
256
+ "description": "这个模板的用途",
257
+ "config": { ...符合配置 Schema 的字段... }
224
258
  }`;
225
- userPrompt = `${nodeInstanceContext}\n\nUser request: ${params.prompt}`;
259
+ userPrompt = `${skillContext}\n\n${nodeInstanceContext}\n\n用户需求:${params.prompt}`;
226
260
  }
227
261
 
228
262
  if (params.action === 'create_node_instance') {
@@ -234,12 +268,26 @@ Output format (strict):
234
268
  );
235
269
  return result as any;
236
270
  } else {
237
- userPrompt = `${userPrompt} \n\n你先理解下这个需求,然后找我澄清需求(非技术方案),每个node的参数可以不用在这个阶段来确认,每次问我一个问题(如果有多个问题请分多次询问),我全部确认后再行动。切记:仅最终结果以json形式返回,其他非结果数据不以json形式返回。`;
271
+ userPrompt = `${userPrompt} \n\n你先理解这个需求,然后找我澄清业务需求(非技术方案)。节点参数可以不在这个阶段确认。每次只问一个问题;如果有多个问题,请分多次询问。我全部确认后再行动。切记:仅最终结果以 JSON 形式返回,其他内容不要使用 JSON。`;
238
272
  const result = await sendPromptAndWait<AgentOutput>(
239
273
  userPrompt,
240
274
  validateAgentOutput,
241
275
  controller.signal,
242
276
  );
277
+ const validation = validateWorkflowDsl(result.dsl, {
278
+ nodeTypes,
279
+ referencedConfigs,
280
+ callableWorkflows,
281
+ });
282
+ if (!validation.ok)
283
+ throw new Error(`AI 返回的 Workflow 无效:${validation.error}`);
284
+ if (
285
+ !callableCatalogReady &&
286
+ subWorkflowNodesChanged(params.currentDsl, result.dsl)
287
+ )
288
+ throw new Error(
289
+ '可调用 Workflow 目录不可用,AI 不能新增或修改调用 Workflow 节点。',
290
+ );
243
291
  return result;
244
292
  }
245
293
  } catch (e: any) {
@@ -253,8 +301,30 @@ Output format (strict):
253
301
  setLoading(false);
254
302
  }
255
303
  },
256
- [buildSystemContext],
304
+ [buildSystemContext, callableWorkflows, nodeTypes, referencedConfigs],
257
305
  );
258
306
 
259
307
  return { generate, abort, loading, error };
260
308
  }
309
+
310
+ function subWorkflowNodesChanged(
311
+ currentDsl: WorkflowDSL | undefined,
312
+ nextDsl: WorkflowDSL,
313
+ ): boolean {
314
+ return (
315
+ JSON.stringify(subWorkflowNodes(currentDsl)) !==
316
+ JSON.stringify(subWorkflowNodes(nextDsl))
317
+ );
318
+ }
319
+
320
+ function subWorkflowNodes(dsl: WorkflowDSL | undefined) {
321
+ return (dsl?.nodes ?? [])
322
+ .filter((node) => node.type === 'sub_workflow')
323
+ .map((node) => ({
324
+ id: node.id,
325
+ config: node.config,
326
+ configOverride: node.configOverride,
327
+ instanceRef: node.instanceRef,
328
+ }))
329
+ .sort((left, right) => left.id.localeCompare(right.id));
330
+ }
@@ -14,7 +14,6 @@ import {
14
14
  message,
15
15
  } from 'antd';
16
16
  import {
17
- DatabaseOutlined,
18
17
  DeleteOutlined,
19
18
  EditOutlined,
20
19
  ExportOutlined,
@@ -31,9 +30,15 @@ import { StatusCards } from './components/StatusCards';
31
30
  import { ExportModal } from './components/ExportModal';
32
31
  import { ImportModal } from './components/ImportModal';
33
32
  import type { Workflow, WorkflowOverview } from './types';
33
+ import { workflowPublishErrorMessage } from './utils/workflowPublishError';
34
34
  import { useTranslation } from 'react-i18next';
35
35
  import { PageHeader } from 'components';
36
36
  import { PAGE_WRAPPER_STYLE, SEARCH_CARD_PROPS } from 'constants/layout';
37
+ import {
38
+ formatWorkflowUtcDate,
39
+ formatWorkflowUtcDateTime,
40
+ } from './utils/workflowDateTime';
41
+ import './workflow-ui.css';
37
42
 
38
43
  const PAGE_SIZE = 20;
39
44
 
@@ -78,11 +83,11 @@ function RunDot({
78
83
  const STATUS_COLOR: Record<string, string> = {
79
84
  DRAFT: 'default',
80
85
  PUBLISHED: 'success',
86
+ DELETING: 'warning',
81
87
  };
82
88
 
83
89
  export default function WorkflowListPage() {
84
90
  const { t } = useTranslation('workflow');
85
- console.log('[WorkflowList] MOUNTED, pathname:', window.location.pathname);
86
91
  const navigate = useNavigate();
87
92
  const [workflows, setWorkflows] = useState<Workflow[]>([]);
88
93
  const [overview, setOverview] = useState<WorkflowOverview | null>(null);
@@ -168,7 +173,7 @@ export default function WorkflowListPage() {
168
173
  } finally {
169
174
  setLoading(false);
170
175
  }
171
- }, [page, filterStatus, filterInstanceStatus, filterName]);
176
+ }, [page, filterStatus, filterInstanceStatus, filterName, t]);
172
177
 
173
178
  useEffect(() => {
174
179
  fetchData();
@@ -197,7 +202,10 @@ export default function WorkflowListPage() {
197
202
  setPublishSummary('');
198
203
  fetchData();
199
204
  } catch (e: any) {
200
- message.error(e?.message ?? t('list.publishFailed'));
205
+ message.error(
206
+ workflowPublishErrorMessage(e, t('list.publishFailedHint')),
207
+ 8,
208
+ );
201
209
  } finally {
202
210
  setPublishLoading(false);
203
211
  }
@@ -208,7 +216,9 @@ export default function WorkflowListPage() {
208
216
  await customRequest(`workflow/${id}/toggle`, 'PATCH', {
209
217
  enabled: !currentValue,
210
218
  });
211
- message.success(`Workflow ${currentValue ? '禁用' : '启用'}成功`);
219
+ message.success(
220
+ currentValue ? t('list.disabledSuccess') : t('list.enabledSuccess'),
221
+ );
212
222
  fetchData();
213
223
  } catch (e: any) {
214
224
  message.error(e?.message ?? 'Toggle failed');
@@ -228,12 +238,16 @@ export default function WorkflowListPage() {
228
238
  cancelText="取消"
229
239
  onConfirm={() => handleToggleEnabled(record.id, isEnabled)}
230
240
  >
231
- <Switch checked={isEnabled} size="small" />
241
+ <Switch
242
+ checked={isEnabled}
243
+ size="small"
244
+ disabled={record.status === 'DELETING'}
245
+ />
232
246
  </Popconfirm>
233
247
  ),
234
248
  },
235
249
  {
236
- title: 'Name',
250
+ title: t('common.name'),
237
251
  dataIndex: 'name',
238
252
  key: 'name',
239
253
  render: (name: string, record: Workflow) => (
@@ -243,16 +257,20 @@ export default function WorkflowListPage() {
243
257
  ),
244
258
  },
245
259
  {
246
- title: 'Status',
260
+ title: t('list.status'),
247
261
  dataIndex: 'status',
248
262
  key: 'status',
249
263
  width: 100,
250
264
  render: (status: string) => (
251
- <Tag color={STATUS_COLOR[status]}>{status}</Tag>
265
+ <Tag color={STATUS_COLOR[status]}>
266
+ {t(`workflowStatus.${status.toLowerCase()}`, {
267
+ defaultValue: status,
268
+ })}
269
+ </Tag>
252
270
  ),
253
271
  },
254
272
  {
255
- title: 'Version',
273
+ title: t('list.version'),
256
274
  key: 'version',
257
275
  width: 200,
258
276
  render: (_: any, record: Workflow) => {
@@ -263,7 +281,7 @@ export default function WorkflowListPage() {
263
281
  },
264
282
  },
265
283
  {
266
- title: 'Runs',
284
+ title: t('list.runs'),
267
285
  key: 'runs',
268
286
  width: 160,
269
287
  render: (_: any, record: Workflow) => {
@@ -308,31 +326,31 @@ export default function WorkflowListPage() {
308
326
  },
309
327
  },
310
328
  {
311
- title: 'Last Run',
329
+ title: t('list.lastRun'),
312
330
  key: 'lastRun',
313
331
  width: 150,
314
332
  render: (_: any, record: Workflow) => {
315
333
  if (!record.lastRun) return <span style={{ color: '#d9d9d9' }}>—</span>;
316
334
  return (
317
- <Tooltip title={new Date(record.lastRun).toLocaleString()}>
318
- <span>{new Date(record.lastRun).toLocaleDateString()}</span>
335
+ <Tooltip title={formatWorkflowUtcDateTime(record.lastRun)}>
336
+ <span>{formatWorkflowUtcDate(record.lastRun)}</span>
319
337
  </Tooltip>
320
338
  );
321
339
  },
322
340
  },
323
341
  {
324
- title: 'Updated',
342
+ title: t('list.updatedAt'),
325
343
  dataIndex: 'updatedAt',
326
344
  key: 'updatedAt',
327
345
  width: 150,
328
346
  render: (v: string) => (
329
- <Tooltip title={new Date(v).toLocaleString()}>
330
- <span>{new Date(v).toLocaleDateString()}</span>
347
+ <Tooltip title={formatWorkflowUtcDateTime(v)}>
348
+ <span>{formatWorkflowUtcDate(v)}</span>
331
349
  </Tooltip>
332
350
  ),
333
351
  },
334
352
  {
335
- title: 'Actions',
353
+ title: t('list.actions'),
336
354
  key: 'actions',
337
355
  width: 180,
338
356
  render: (_: any, record: Workflow) => (
@@ -348,6 +366,7 @@ export default function WorkflowListPage() {
348
366
  <Button
349
367
  size="small"
350
368
  icon={<EditOutlined />}
369
+ disabled={record.status === 'DELETING'}
351
370
  onClick={() => navigate(`/admin/workflow/edit/${record.id}`)}
352
371
  />
353
372
  </Tooltip>
@@ -370,7 +389,7 @@ export default function WorkflowListPage() {
370
389
  }}
371
390
  />
372
391
  </Tooltip>
373
- {record.status === 'DRAFT' && (
392
+ {record.hasUnpublishedChanges && record.status !== 'DELETING' && (
374
393
  <Tooltip title={t('list.publish')}>
375
394
  <Button
376
395
  size="small"
@@ -386,13 +405,13 @@ export default function WorkflowListPage() {
386
405
  )}
387
406
  <Popconfirm
388
407
  title={t('list.deleteConfirm')}
389
- description="All versions and instances will be deleted."
390
- okText="Delete"
391
- cancelText="Cancel"
408
+ description={t('list.deleteDescription')}
409
+ okText={t('common.delete')}
410
+ cancelText={t('common.cancel')}
392
411
  okButtonProps={{ danger: true }}
393
412
  onConfirm={() => handleDelete(record.id)}
394
413
  >
395
- <Tooltip title="Delete">
414
+ <Tooltip title={t('common.delete')}>
396
415
  <Button size="small" danger icon={<DeleteOutlined />} />
397
416
  </Tooltip>
398
417
  </Popconfirm>
@@ -402,26 +421,17 @@ export default function WorkflowListPage() {
402
421
  ];
403
422
 
404
423
  return (
405
- <div style={PAGE_WRAPPER_STYLE}>
424
+ <div className="workflow-page-stack" style={PAGE_WRAPPER_STYLE}>
406
425
  <PageHeader
407
426
  title={t('list.title')}
427
+ subtitle={t('list.subtitle')}
408
428
  extra={
409
429
  <Space>
410
- <Tooltip title="查看 WorkflowEventOutbox 表原始数据">
411
- <Button
412
- icon={<DatabaseOutlined />}
413
- onClick={() =>
414
- navigate('/admin/data-mngt/workflow-event-outbox')
415
- }
416
- >
417
- PG表事件队列
418
- </Button>
419
- </Tooltip>
420
430
  <Button
421
431
  icon={<ImportOutlined />}
422
432
  onClick={() => setImportModalOpen(true)}
423
433
  >
424
- Import
434
+ {t('list.import')}
425
435
  </Button>
426
436
  <Button
427
437
  type="primary"
@@ -444,18 +454,19 @@ export default function WorkflowListPage() {
444
454
  <Card {...SEARCH_CARD_PROPS}>
445
455
  <Space wrap>
446
456
  <Select
447
- placeholder="Status"
457
+ placeholder={t('list.status')}
448
458
  allowClear
449
459
  value={filterStatus}
450
460
  onChange={(v) => setFilterStatus(v)}
451
461
  style={{ width: 120 }}
452
462
  options={[
453
- { value: 'draft', label: 'Draft' },
463
+ { value: 'draft', label: t('workflowStatus.draft') },
454
464
  { value: 'published', label: t('list.publishedStatus') },
465
+ { value: 'deleting', label: t('workflowStatus.deleting') },
455
466
  ]}
456
467
  />
457
468
  <Input
458
- placeholder="Search by name"
469
+ placeholder={t('list.searchPlaceholder')}
459
470
  allowClear
460
471
  defaultValue={filterName}
461
472
  onChange={(e) => {
@@ -483,7 +494,7 @@ export default function WorkflowListPage() {
483
494
  pageSize: PAGE_SIZE,
484
495
  total,
485
496
  onChange: (p) => setPage(p),
486
- showTotal: (t) => `Total ${t}`,
497
+ showTotal: (totalCount) => t('list.total', { count: totalCount }),
487
498
  }}
488
499
  size="small"
489
500
  />
@@ -499,13 +510,13 @@ export default function WorkflowListPage() {
499
510
  setPublishSummary('');
500
511
  }}
501
512
  okText={t('list.publish')}
502
- cancelText="Cancel"
513
+ cancelText={t('common.cancel')}
503
514
  confirmLoading={publishLoading}
504
515
  >
505
- <p>Please enter a version description:</p>
516
+ <p>{t('list.publishDescription')}</p>
506
517
  <Input.TextArea
507
518
  rows={3}
508
- placeholder="Describe what changed in this version..."
519
+ placeholder={t('list.publishPlaceholder')}
509
520
  value={publishSummary}
510
521
  onChange={(e) => setPublishSummary(e.target.value)}
511
522
  />