@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,6 +1,6 @@
1
1
  export type ParameterBinding =
2
2
  | {
3
- source: 'INPUT' | 'WORKFLOW' | 'SYSTEM';
3
+ source: 'INPUT' | 'WORKFLOW' | 'APPROVAL';
4
4
  path: string;
5
5
  }
6
6
  | {
@@ -17,7 +17,7 @@ export function validateParameterBinding(
17
17
  if (
18
18
  binding.source === 'INPUT' ||
19
19
  binding.source === 'WORKFLOW' ||
20
- binding.source === 'SYSTEM'
20
+ binding.source === 'APPROVAL'
21
21
  )
22
22
  return typeof binding.path === 'string' && Boolean(binding.path.trim());
23
23
  if (binding.source !== 'FIXED') return false;
@@ -49,7 +49,7 @@ export function resolveParameterBinding(
49
49
  binding: ParameterBinding,
50
50
  input: unknown,
51
51
  workflow: Record<string, unknown>,
52
- system: Record<string, unknown> = {},
52
+ approval?: unknown,
53
53
  ): unknown {
54
54
  if (binding.source === 'FIXED') {
55
55
  if (binding.valueType === 'STRING') return binding.value;
@@ -63,13 +63,13 @@ export function resolveParameterBinding(
63
63
  ? 'input'
64
64
  : binding.source === 'WORKFLOW'
65
65
  ? 'workflow'
66
- : 'system';
66
+ : 'approval';
67
67
  const root =
68
68
  binding.source === 'INPUT'
69
69
  ? input
70
70
  : binding.source === 'WORKFLOW'
71
71
  ? workflow
72
- : system;
72
+ : approval;
73
73
  const value = readPath(root, binding.path);
74
74
  if (value === undefined)
75
75
  throw new Error(
@@ -1,5 +1,9 @@
1
1
  import { Test, TestingModule } from '@nestjs/testing';
2
- import { ScheduleNotFoundError } from '@temporalio/client';
2
+ import {
3
+ ScheduleNotFoundError,
4
+ WorkflowIdConflictPolicy,
5
+ WorkflowIdReusePolicy,
6
+ } from '@temporalio/client';
3
7
  import { TemporalService } from './temporal.service';
4
8
 
5
9
  /**
@@ -16,6 +20,7 @@ const mockHandle = {
16
20
  const mockWorkflowHandle = {
17
21
  cancel: jest.fn(),
18
22
  result: jest.fn(),
23
+ describe: jest.fn(),
19
24
  };
20
25
  const mockClient = {
21
26
  schedule: {
@@ -39,6 +44,8 @@ jest.mock('@temporalio/client', () => {
39
44
  Client: jest.fn(() => mockClient),
40
45
  Connection: { connect: jest.fn(async () => ({ close: jest.fn() })) },
41
46
  ScheduleNotFoundError: FakeScheduleNotFoundError,
47
+ WorkflowIdConflictPolicy: { USE_EXISTING: 'USE_EXISTING' },
48
+ WorkflowIdReusePolicy: { REJECT_DUPLICATE: 'REJECT_DUPLICATE' },
42
49
  };
43
50
  });
44
51
 
@@ -54,33 +61,60 @@ describe('TemporalService — cron schedule methods', () => {
54
61
  await service.onModuleInit();
55
62
  });
56
63
 
57
- describe('waitForWorkflowResult', () => {
58
- it('returns the completed Workflow result', async () => {
59
- const workflowResult = {
64
+ describe('inspectWorkflow', () => {
65
+ it('returns the Temporal execution state and completed result', async () => {
66
+ const startedAt = new Date('2026-08-13T00:00:00.000Z');
67
+ const finishedAt = new Date('2026-08-13T00:00:01.000Z');
68
+ mockWorkflowHandle.describe.mockResolvedValueOnce({
69
+ status: { name: 'COMPLETED' },
70
+ startTime: startedAt,
71
+ closeTime: finishedAt,
72
+ });
73
+ mockWorkflowHandle.result.mockResolvedValueOnce({ output: { id: 1 } });
74
+
75
+ await expect(service.inspectWorkflow('wf-42-99')).resolves.toEqual({
76
+ kind: 'FOUND',
60
77
  status: 'COMPLETED',
61
- output: { ticketId: 'T-42' },
62
- };
63
- mockWorkflowHandle.result.mockResolvedValueOnce(workflowResult);
64
-
65
- await expect(
66
- service.waitForWorkflowResult('wf-42', 1000),
67
- ).resolves.toEqual({
68
- kind: 'COMPLETED',
69
- result: workflowResult,
78
+ startedAt,
79
+ finishedAt,
80
+ result: { output: { id: 1 } },
70
81
  });
71
82
  });
72
83
 
73
- it('stops waiting at the configured timeout without cancelling the Workflow', async () => {
74
- jest.useFakeTimers();
75
- mockWorkflowHandle.result.mockReturnValueOnce(new Promise(() => {}));
84
+ it('reports a missing Temporal execution', async () => {
85
+ const error = new Error('not found');
86
+ error.name = 'WorkflowNotFoundError';
87
+ mockWorkflowHandle.describe.mockRejectedValueOnce(error);
76
88
 
77
- const result = service.waitForWorkflowResult('wf-42', 1000);
78
- jest.advanceTimersByTime(1000);
89
+ await expect(service.inspectWorkflow('wf-42-99')).resolves.toEqual({
90
+ kind: 'MISSING',
91
+ });
92
+ });
93
+ });
79
94
 
80
- await expect(result).resolves.toEqual({ kind: 'TIMED_OUT' });
81
- expect(mockWorkflowHandle.cancel).not.toHaveBeenCalled();
82
- jest.useRealTimers();
95
+ it('reuses the same open execution and rejects a completed duplicate', async () => {
96
+ mockClient.workflow.start.mockResolvedValueOnce({
97
+ workflowId: 'wf-42-99',
83
98
  });
99
+
100
+ await expect(
101
+ service.startWorkflow({
102
+ instanceId: 99,
103
+ workflowId: 42,
104
+ versionId: 7,
105
+ dsl: { nodes: [], edges: [] },
106
+ context: { workflow: {}, nodes: {} },
107
+ }),
108
+ ).resolves.toEqual({ temporalRunId: 'wf-42-99' });
109
+
110
+ expect(mockClient.workflow.start).toHaveBeenCalledWith(
111
+ 'dslWorkflow',
112
+ expect.objectContaining({
113
+ workflowId: 'wf-42-99',
114
+ workflowIdConflictPolicy: WorkflowIdConflictPolicy.USE_EXISTING,
115
+ workflowIdReusePolicy: WorkflowIdReusePolicy.REJECT_DUPLICATE,
116
+ }),
117
+ );
84
118
  });
85
119
 
86
120
  describe('upsertCronSchedule', () => {
@@ -93,14 +127,14 @@ describe('TemporalService — cron schedule methods', () => {
93
127
  workflowId: 42,
94
128
  versionId: 7,
95
129
  dsl: { nodes: [], edges: [] },
96
- cron: '0 * * * *',
130
+ cronExpressions: ['0 9 * * *', '30 18 * * *'],
97
131
  timezone: 'Asia/Shanghai',
98
132
  });
99
133
 
100
134
  expect(mockClient.schedule.create).toHaveBeenCalledTimes(1);
101
135
  const arg = mockClient.schedule.create.mock.calls[0][0];
102
136
  expect(arg.scheduleId).toBe('wf-42-cron');
103
- expect(arg.spec.cronExpressions).toEqual(['0 * * * *']);
137
+ expect(arg.spec.cronExpressions).toEqual(['0 9 * * *', '30 18 * * *']);
104
138
  expect(arg.spec.timezoneName).toBe('Asia/Shanghai');
105
139
  expect(arg.action.workflowType).toBe('cronTriggerWorkflow');
106
140
  expect(arg.action.args[0]).toMatchObject({
@@ -117,7 +151,7 @@ describe('TemporalService — cron schedule methods', () => {
117
151
  workflowId: 42,
118
152
  versionId: 8,
119
153
  dsl: { nodes: [], edges: [] },
120
- cron: '*/5 * * * *',
154
+ cronExpressions: ['*/5 * * * *'],
121
155
  });
122
156
 
123
157
  expect(mockClient.schedule.create).not.toHaveBeenCalled();
@@ -132,13 +166,29 @@ describe('TemporalService — cron schedule methods', () => {
132
166
  workflowId: 1,
133
167
  versionId: 1,
134
168
  dsl: {},
135
- cron: '0 0 * * *',
169
+ cronExpressions: ['0 0 * * *'],
136
170
  });
137
171
  const spec = mockClient.schedule.create.mock.calls[0][0].spec;
138
172
  expect(spec.timezoneName).toBeUndefined();
139
173
  });
140
174
  });
141
175
 
176
+ describe('getCronScheduleStatus', () => {
177
+ it('returns the live paused state', async () => {
178
+ mockHandle.describe.mockResolvedValueOnce({
179
+ state: { paused: true },
180
+ });
181
+ await expect(service.getCronScheduleStatus(42)).resolves.toBe('PAUSED');
182
+ });
183
+
184
+ it('returns missing when the schedule does not exist', async () => {
185
+ mockHandle.describe.mockRejectedValueOnce(
186
+ new ScheduleNotFoundError('nf', 'wf-x-cron'),
187
+ );
188
+ await expect(service.getCronScheduleStatus(42)).resolves.toBe('MISSING');
189
+ });
190
+ });
191
+
142
192
  describe('pauseCronSchedule', () => {
143
193
  it('calls handle.pause for existing schedule', async () => {
144
194
  mockHandle.pause.mockResolvedValueOnce(undefined);
@@ -157,6 +207,13 @@ describe('TemporalService — cron schedule methods', () => {
157
207
  mockHandle.pause.mockRejectedValueOnce(new Error('boom'));
158
208
  await expect(service.pauseCronSchedule(42)).rejects.toThrow('boom');
159
209
  });
210
+
211
+ it('fails when the Temporal client is unavailable', async () => {
212
+ (service as any).client = undefined;
213
+ await expect(service.pauseCronSchedule(42)).rejects.toThrow(
214
+ 'Temporal client not connected',
215
+ );
216
+ });
160
217
  });
161
218
 
162
219
  describe('unpauseCronSchedule', () => {
@@ -172,6 +229,13 @@ describe('TemporalService — cron schedule methods', () => {
172
229
  );
173
230
  await expect(service.unpauseCronSchedule(42)).resolves.toBeUndefined();
174
231
  });
232
+
233
+ it('fails when the Temporal client is unavailable', async () => {
234
+ (service as any).client = undefined;
235
+ await expect(service.unpauseCronSchedule(42)).rejects.toThrow(
236
+ 'Temporal client not connected',
237
+ );
238
+ });
175
239
  });
176
240
 
177
241
  describe('deleteCronSchedule', () => {
@@ -187,5 +251,12 @@ describe('TemporalService — cron schedule methods', () => {
187
251
  );
188
252
  await expect(service.deleteCronSchedule(42)).resolves.toBeUndefined();
189
253
  });
254
+
255
+ it('fails when the Temporal client is unavailable', async () => {
256
+ (service as any).client = undefined;
257
+ await expect(service.deleteCronSchedule(42)).rejects.toThrow(
258
+ 'Temporal client not connected',
259
+ );
260
+ });
190
261
  });
191
262
  });
@@ -4,17 +4,43 @@ import {
4
4
  OnModuleDestroy,
5
5
  OnModuleInit,
6
6
  } from '@nestjs/common';
7
- import { Client, Connection, ScheduleNotFoundError } from '@temporalio/client';
7
+ import {
8
+ Client,
9
+ Connection,
10
+ ScheduleNotFoundError,
11
+ WorkflowIdConflictPolicy,
12
+ WorkflowIdReusePolicy,
13
+ } from '@temporalio/client';
8
14
 
9
15
  const TEMPORAL_ADDRESS = process.env.TEMPORAL_ADDRESS || 'localhost:7233';
10
16
  const TEMPORAL_NAMESPACE = process.env.TEMPORAL_NAMESPACE || 'default';
11
17
  const TASK_QUEUE = process.env.TEMPORAL_TASK_QUEUE || 'workflow-execution';
12
18
 
13
19
  const cronScheduleId = (workflowId: number) => `wf-${workflowId}-cron`;
20
+ export const workflowTemporalId = (workflowId: number, instanceId: number) =>
21
+ `wf-${workflowId}-${instanceId}`;
22
+
23
+ export type WorkflowExecutionState =
24
+ | { kind: 'MISSING' }
25
+ | {
26
+ kind: 'FOUND';
27
+ status: string;
28
+ startedAt: Date;
29
+ finishedAt?: Date;
30
+ result?: unknown;
31
+ };
32
+
33
+ export type CronScheduleStatus =
34
+ | 'ACTIVE'
35
+ | 'PAUSED'
36
+ | 'MISSING'
37
+ | 'UNAVAILABLE';
14
38
 
15
- export type WorkflowWaitResult =
16
- | { kind: 'COMPLETED'; result: unknown }
17
- | { kind: 'TIMED_OUT' };
39
+ export interface WorkflowRetryCheckpoint {
40
+ startNodeId: string;
41
+ completedNodeIds: string[];
42
+ outputs: Record<string, unknown>;
43
+ }
18
44
 
19
45
  @Injectable()
20
46
  export class TemporalService implements OnModuleInit, OnModuleDestroy {
@@ -56,44 +82,25 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
56
82
  versionId: number;
57
83
  dsl: any;
58
84
  context: Record<string, any>;
85
+ retryCheckpoint?: WorkflowRetryCheckpoint;
59
86
  }): Promise<{ temporalRunId: string }> {
60
87
  if (!this.client) {
61
88
  throw new Error('Temporal client not connected');
62
89
  }
63
90
 
64
- const workflowId = `wf-${params.workflowId}-${params.instanceId}`;
91
+ const workflowId = workflowTemporalId(params.workflowId, params.instanceId);
65
92
 
66
93
  const handle = await this.client.workflow.start('dslWorkflow', {
67
94
  taskQueue: TASK_QUEUE,
68
95
  workflowId,
96
+ workflowIdConflictPolicy: WorkflowIdConflictPolicy.USE_EXISTING,
97
+ workflowIdReusePolicy: WorkflowIdReusePolicy.REJECT_DUPLICATE,
69
98
  args: [params],
70
99
  });
71
100
 
72
101
  return { temporalRunId: handle.workflowId };
73
102
  }
74
103
 
75
- async waitForWorkflowResult(
76
- temporalRunId: string,
77
- timeoutMs: number,
78
- ): Promise<WorkflowWaitResult> {
79
- if (!this.client) throw new Error('Temporal client not connected');
80
- const handle = this.client.workflow.getHandle(temporalRunId);
81
- let timeout: ReturnType<typeof setTimeout> | undefined;
82
-
83
- try {
84
- return await Promise.race([
85
- handle
86
- .result()
87
- .then((result) => ({ kind: 'COMPLETED', result } as const)),
88
- new Promise<{ kind: 'TIMED_OUT' }>((resolve) => {
89
- timeout = setTimeout(() => resolve({ kind: 'TIMED_OUT' }), timeoutMs);
90
- }),
91
- ]);
92
- } finally {
93
- if (timeout) clearTimeout(timeout);
94
- }
95
- }
96
-
97
104
  /**
98
105
  * Cancel a running workflow.
99
106
  */
@@ -103,6 +110,29 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
103
110
  await handle.cancel();
104
111
  }
105
112
 
113
+ async inspectWorkflow(
114
+ temporalRunId: string,
115
+ ): Promise<WorkflowExecutionState> {
116
+ if (!this.client) throw new Error('Temporal client not connected');
117
+ const handle = this.client.workflow.getHandle(temporalRunId);
118
+ try {
119
+ const description = await handle.describe();
120
+ return {
121
+ kind: 'FOUND',
122
+ status: description.status.name,
123
+ startedAt: description.startTime,
124
+ ...(description.closeTime && { finishedAt: description.closeTime }),
125
+ ...(description.status.name === 'COMPLETED' && {
126
+ result: await handle.result(),
127
+ }),
128
+ };
129
+ } catch (error) {
130
+ if (error instanceof Error && error.name === 'WorkflowNotFoundError')
131
+ return { kind: 'MISSING' };
132
+ throw error;
133
+ }
134
+ }
135
+
106
136
  /**
107
137
  * Send a signal to a running workflow (e.g., approval).
108
138
  */
@@ -142,7 +172,7 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
142
172
  workflowId: number;
143
173
  versionId: number;
144
174
  dsl: any;
145
- cron: string;
175
+ cronExpressions: string[];
146
176
  timezone?: string;
147
177
  }): Promise<void> {
148
178
  if (!this.client) throw new Error('Temporal client not connected');
@@ -162,7 +192,7 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
162
192
  ],
163
193
  };
164
194
  const spec = {
165
- cronExpressions: [input.cron],
195
+ cronExpressions: input.cronExpressions,
166
196
  ...(input.timezone ? { timezoneName: input.timezone } : {}),
167
197
  };
168
198
 
@@ -176,7 +206,7 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
176
206
  action,
177
207
  }));
178
208
  this.logger.log(
179
- `Updated cron schedule ${scheduleId} (cron="${input.cron}")`,
209
+ `Updated cron schedule ${scheduleId} (${input.cronExpressions.length} expression(s))`,
180
210
  );
181
211
  } catch (err: any) {
182
212
  if (err instanceof ScheduleNotFoundError) {
@@ -186,7 +216,7 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
186
216
  action,
187
217
  });
188
218
  this.logger.log(
189
- `Created cron schedule ${scheduleId} (cron="${input.cron}")`,
219
+ `Created cron schedule ${scheduleId} (${input.cronExpressions.length} expression(s))`,
190
220
  );
191
221
  } else {
192
222
  throw err;
@@ -194,11 +224,24 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
194
224
  }
195
225
  }
196
226
 
227
+ async getCronScheduleStatus(workflowId: number): Promise<CronScheduleStatus> {
228
+ if (!this.client) return 'UNAVAILABLE';
229
+ try {
230
+ const description = await this.client.schedule
231
+ .getHandle(cronScheduleId(workflowId))
232
+ .describe();
233
+ return description.state.paused ? 'PAUSED' : 'ACTIVE';
234
+ } catch (error) {
235
+ if (error instanceof ScheduleNotFoundError) return 'MISSING';
236
+ return 'UNAVAILABLE';
237
+ }
238
+ }
239
+
197
240
  /**
198
241
  * Pause a cron schedule. No-op if it doesn't exist.
199
242
  */
200
243
  async pauseCronSchedule(workflowId: number): Promise<void> {
201
- if (!this.client) return;
244
+ if (!this.client) throw new Error('Temporal client not connected');
202
245
  const scheduleId = cronScheduleId(workflowId);
203
246
  try {
204
247
  await this.client.schedule.getHandle(scheduleId).pause();
@@ -213,7 +256,7 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
213
256
  * Resume a paused cron schedule. No-op if it doesn't exist.
214
257
  */
215
258
  async unpauseCronSchedule(workflowId: number): Promise<void> {
216
- if (!this.client) return;
259
+ if (!this.client) throw new Error('Temporal client not connected');
217
260
  const scheduleId = cronScheduleId(workflowId);
218
261
  try {
219
262
  await this.client.schedule.getHandle(scheduleId).unpause();
@@ -228,7 +271,7 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
228
271
  * Delete a cron schedule. No-op if it doesn't exist.
229
272
  */
230
273
  async deleteCronSchedule(workflowId: number): Promise<void> {
231
- if (!this.client) return;
274
+ if (!this.client) throw new Error('Temporal client not connected');
232
275
  const scheduleId = cronScheduleId(workflowId);
233
276
  try {
234
277
  await this.client.schedule.getHandle(scheduleId).delete();
@@ -15,13 +15,12 @@ const validDsl = {
15
15
  },
16
16
  },
17
17
  { id: 'http', type: 'http_request', config: {} },
18
- { id: 'return', type: 'return_result', config: {} },
19
18
  ],
20
- edges: [{ source: 'http', target: 'return', kind: 'FLOW' }],
19
+ edges: [{ source: 'input', target: 'http', kind: 'FLOW' }],
21
20
  };
22
21
 
23
22
  describe('callable Workflow contract', () => {
24
- it('describes declared inputs and a returning workflow without a result type', () => {
23
+ it('describes declared inputs and returns the terminal node result', () => {
25
24
  expect(describeCallableWorkflow(validDsl)).toEqual({
26
25
  mode: 'RETURN',
27
26
  inputParameters: [
@@ -42,45 +41,35 @@ describe('callable Workflow contract', () => {
42
41
  ).toThrow('不能同时包含其他触发器');
43
42
  });
44
43
 
45
- it('rejects a callable Workflow without a return node', () => {
46
- expect(() =>
47
- validateCallableWorkflow({
48
- ...validDsl,
49
- nodes: validDsl.nodes.filter((node) => node.type !== 'return_result'),
50
- }),
51
- ).toThrow('必须且只能包含一个“返回调用”节点');
44
+ it('accepts a callable Workflow without a separate return node', () => {
45
+ expect(() => validateCallableWorkflow(validDsl)).not.toThrow();
52
46
  });
53
47
 
54
- it('rejects more than one return node', () => {
48
+ it('accepts conditional terminal branches', () => {
55
49
  expect(() =>
56
50
  validateCallableWorkflow({
57
- ...validDsl,
58
51
  nodes: [
59
- ...validDsl.nodes,
60
- { id: 'return-2', type: 'return_result', config: {} },
52
+ validDsl.nodes[0],
53
+ { id: 'branch', type: 'if_else', config: {} },
54
+ { id: 'accepted', type: 'code', config: {} },
55
+ { id: 'rejected', type: 'code', config: {} },
61
56
  ],
62
- }),
63
- ).toThrow('必须且只能包含一个“返回调用”节点');
64
- });
65
-
66
- it('requires exactly one previous node', () => {
67
- expect(() =>
68
- validateCallableWorkflow({
69
- ...validDsl,
70
- edges: [],
71
- }),
72
- ).toThrow('“返回调用”前需要连接一个节点');
73
- });
74
-
75
- it('requires the return node to be terminal', () => {
76
- expect(() =>
77
- validateCallableWorkflow({
78
- ...validDsl,
79
57
  edges: [
80
- ...validDsl.edges,
81
- { source: 'return', target: 'after', kind: 'FLOW' },
58
+ { source: 'input', target: 'branch', kind: 'FLOW' },
59
+ {
60
+ source: 'branch',
61
+ target: 'accepted',
62
+ sourceHandle: 'true',
63
+ kind: 'FLOW',
64
+ },
65
+ {
66
+ source: 'branch',
67
+ target: 'rejected',
68
+ sourceHandle: 'false',
69
+ kind: 'FLOW',
70
+ },
82
71
  ],
83
72
  }),
84
- ).toThrow('“返回调用”必须是流程最后一个节点');
73
+ ).not.toThrow();
85
74
  });
86
75
  });
@@ -56,31 +56,10 @@ export function validateCallableWorkflow(
56
56
  if (externalTriggers.length)
57
57
  throw new Error('可调用 Workflow 不能同时包含其他触发器');
58
58
 
59
- const returns = nodes.filter((node) => node.type === 'return_result');
60
59
  const triggerConfig = asObject(triggers[0].config);
61
60
  const inputParameters = normalizeInputParameters(
62
61
  triggerConfig.inputParameters,
63
62
  );
64
- if (returns.length !== 1)
65
- throw new Error('可调用 Workflow 必须且只能包含一个“返回调用”节点');
66
-
67
- const returnNodeId = returns[0].id;
68
- const predecessors = (asDsl(dsl).edges ?? []).filter(
69
- (edge) =>
70
- edge.target === returnNodeId &&
71
- (!edge.kind || edge.kind === 'FLOW') &&
72
- !edge.pairId,
73
- );
74
- if (predecessors.length !== 1)
75
- throw new Error('“返回调用”前需要连接一个节点');
76
- const successors = (asDsl(dsl).edges ?? []).filter(
77
- (edge) =>
78
- edge.source === returnNodeId &&
79
- (!edge.kind || edge.kind === 'FLOW') &&
80
- !edge.pairId,
81
- );
82
- if (successors.length > 0)
83
- throw new Error('“返回调用”必须是流程最后一个节点');
84
63
 
85
64
  return {
86
65
  mode: 'RETURN',