@gadmin2n/schematics 0.0.139 → 0.0.140

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 (314) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +6 -34
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +199 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +9 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +191 -14
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +6 -5
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +10 -3
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +6 -4
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +4 -1
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +12 -3
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +86 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +682 -121
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +110 -1
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +28 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.spec.ts +61 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.ts +7 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +54 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +86 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +9 -3
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +89 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +68 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +177 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +283 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +10 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +42 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +108 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +101 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +29 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +21 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.registry.ts +30 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.ts +15 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +105 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +96 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +78 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +56 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +111 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.spec.ts +23 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.ts +18 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +240 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +339 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.types.ts +74 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +47 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +41 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +70 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +76 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +12 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +227 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +121 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +160 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +41 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +171 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +245 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +22 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.spec.ts +68 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.ts +126 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule.types.ts +34 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +115 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +45 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +59 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +72 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +144 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +19 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +350 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +774 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +46 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +227 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +14 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +151 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +88 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +43 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +21 -1
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +77 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.dto.ts +98 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +277 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.spec.ts +14 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.ts +59 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integrationConnection.module.ts +10 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/actor-context.util.ts +27 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user-group.provider.ts +208 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +168 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.spec.ts +157 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.ts +176 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.dto.ts +21 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +78 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.spec.ts +100 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +115 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +97 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subjectProvider.module.ts +34 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +89 -1
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +4 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +119 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +91 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +34 -0
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +161 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +390 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/userGroup.module.ts +10 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +17 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +8 -2
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +93 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +158 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +155 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +363 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +354 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +43 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +174 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +149 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-comparison.ts +43 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +4 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +70 -28
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +128 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +12 -1
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +18 -3
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +369 -22
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +319 -90
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +79 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +62 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/schema.types.ts +10 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +124 -0
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +236 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +49 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +69 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/workflowConfig.module.ts +20 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.spec.ts +15 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.ts +25 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +103 -11
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.dto.ts +98 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +3 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +72 -62
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +148 -11
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -9
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +5 -2
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +2 -2
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +0 -5
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +26 -18
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +2 -2
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +24 -17
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +7 -18
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +2 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +288 -33
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/themeStyles.ts +97 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/SettingDrawer.tsx +251 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +47 -19
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +18 -9
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/menuRenderer.tsx +155 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +123 -129
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +16 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -1
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +98 -3
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +101 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +51 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -1
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +40 -1
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +5 -5
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +16 -1
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +10 -7
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +4 -2
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +26 -2
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +556 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +26 -2
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +556 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +152 -2
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +6 -1
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +41 -9
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +1 -1
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +10 -8
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +3 -3
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +1 -1
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +3 -6
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.css +3 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +45 -13
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasComponentLibrary.tsx +45 -22
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +168 -101
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +248 -74
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +33 -18
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +16 -10
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +1 -1
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +31 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +15 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +16 -11
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +25 -21
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +6 -1
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +9 -10
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartConfigModal.tsx +4 -7
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +23 -9
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +16 -11
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +2 -5
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +16 -11
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +2 -9
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +23 -12
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +2 -17
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.test.ts +149 -0
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +111 -17
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +1 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.test.ts +83 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.ts +118 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardName.test.ts +26 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +9 -1
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +1 -1
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +10 -8
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +3 -6
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +71 -0
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +216 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +6 -1
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +8 -8
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +1 -1
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +5 -5
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +1 -1
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +84 -0
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +141 -0
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +16 -0
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +208 -0
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +154 -0
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +194 -5
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +76 -0
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +1 -1
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +176 -22
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +62 -0
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +94 -5
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +15 -10
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +251 -70
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +18 -24
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +106 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +45 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +43 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +279 -0
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +6 -7
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +335 -0
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +433 -237
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +179 -0
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +18 -16
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +20 -16
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +6 -4
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +68 -0
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +367 -0
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connection.types.ts +21 -0
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +171 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +38 -22
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +41 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +6 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +27 -20
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +8 -11
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +6 -1
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +56 -23
  248. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +21 -6
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +17 -20
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +6 -1
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +311 -0
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +218 -0
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +83 -0
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +135 -0
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema-defaults.ts +36 -0
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema.types.ts +32 -0
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.test.tsx +23 -0
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +52 -0
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +9 -13
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +39 -0
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +20 -0
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +72 -0
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +47 -0
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +185 -0
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.test.tsx +102 -0
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +150 -0
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +103 -0
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +93 -0
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +196 -0
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +303 -0
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +189 -0
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +706 -0
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +86 -0
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +458 -0
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +53 -0
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +91 -0
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +61 -0
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +266 -0
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +104 -0
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +98 -0
  281. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +70 -0
  282. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +138 -0
  283. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +25 -0
  284. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +42 -0
  285. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +95 -0
  286. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +15 -11
  287. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +49 -8
  288. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +49 -0
  289. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +31 -2
  290. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +208 -0
  291. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +246 -0
  292. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +73 -0
  293. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +34 -0
  294. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +18 -0
  295. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +66 -0
  296. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +39 -0
  297. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +48 -0
  298. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +51 -0
  299. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +32 -0
  300. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +1 -1
  301. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +10 -8
  302. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +3 -3
  303. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd-theme-vars.css +93 -0
  304. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +8 -8
  305. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +4 -4
  306. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +20 -5
  307. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +3 -3
  308. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +3 -3
  309. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/theme-styles.css +81 -0
  310. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +5 -0
  311. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +1 -7
  312. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +12 -0
  313. package/package.json +1 -1
  314. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +0 -154
@@ -1,4 +1,3 @@
1
- import { validateDslHandles } from '@gadmin2n/nest-common/workflow-dsl';
2
1
  import {
3
2
  BadRequestException,
4
3
  Injectable,
@@ -8,9 +7,19 @@ import {
8
7
  } from '@nestjs/common';
9
8
  import { Prisma } from '@prisma/client';
10
9
  import { PrismaService } from 'nestjs-prisma';
10
+ import { HumanApprovalService } from '../humanApproval/human-approval.service';
11
11
  import { validateDslGraph } from './dsl-validate.util';
12
12
  import { TemporalService } from './temporal.service';
13
13
  import { verifyWebhookSignature } from './webhook-signature.util';
14
+ import { describeCallableWorkflow } from './workflow-callable';
15
+ import { WorkflowCompilerService } from './workflow-compiler.service';
16
+ import { DraftWorkflowDsl } from './workflow-compiler.types';
17
+ import { validateWorkflowDataEdges } from './workflow-data-edge.util';
18
+ import { areWorkflowDslSourcesEqual } from './workflow-dsl-comparison';
19
+ import {
20
+ NodeOutputsMap,
21
+ validateWorkflowHandles,
22
+ } from './workflow-handle-validator';
14
23
 
15
24
  @Injectable()
16
25
  export class WorkflowService {
@@ -19,6 +28,8 @@ export class WorkflowService {
19
28
  constructor(
20
29
  private prisma: PrismaService,
21
30
  private temporalService: TemporalService,
31
+ private humanApprovalService: HumanApprovalService,
32
+ private workflowCompiler: WorkflowCompilerService,
22
33
  ) {}
23
34
 
24
35
  /**
@@ -37,9 +48,12 @@ export class WorkflowService {
37
48
  * Find all webhook_trigger configs in a DSL.
38
49
  * Each entry includes path + method; used for collision detection on publish.
39
50
  */
40
- private extractWebhookConfigs(
41
- dsl: any,
42
- ): Array<{ path: string; method: string; secret?: string }> {
51
+ private extractWebhookConfigs(dsl: any): Array<{
52
+ path: string;
53
+ method: string;
54
+ secret?: string;
55
+ verificationMode: 'HMAC' | 'NONE';
56
+ }> {
43
57
  if (!Array.isArray(dsl?.nodes)) return [];
44
58
  return dsl.nodes
45
59
  .filter(
@@ -50,6 +64,8 @@ export class WorkflowService {
50
64
  path: n.config.path,
51
65
  method: n.config.method,
52
66
  secret: n.config.secret,
67
+ verificationMode:
68
+ n.config.verificationMode === 'NONE' ? 'NONE' : 'HMAC',
53
69
  }));
54
70
  }
55
71
 
@@ -142,6 +158,87 @@ export class WorkflowService {
142
158
  return { items: enrichedItems, total };
143
159
  }
144
160
 
161
+ async findCallableWorkflows(resultType = 'APPROVAL_SUBJECTS') {
162
+ const workflows = await this.prisma.workflow.findMany({
163
+ where: { status: 'PUBLISHED', isEnabled: true },
164
+ orderBy: { name: 'asc' },
165
+ include: {
166
+ versions: {
167
+ orderBy: { version: 'desc' },
168
+ take: 1,
169
+ select: { dsl: true },
170
+ },
171
+ },
172
+ });
173
+ return workflows.flatMap((workflow) => {
174
+ try {
175
+ const descriptor = describeCallableWorkflow(workflow.versions[0]?.dsl);
176
+ if (
177
+ !descriptor ||
178
+ descriptor.mode !== 'RETURN' ||
179
+ descriptor.resultType !== resultType
180
+ )
181
+ return [];
182
+ return [
183
+ {
184
+ id: String(workflow.id),
185
+ name: workflow.name,
186
+ description: workflow.description,
187
+ inputParameters: descriptor.inputParameters,
188
+ resultType: descriptor.resultType,
189
+ },
190
+ ];
191
+ } catch {
192
+ return [];
193
+ }
194
+ });
195
+ }
196
+
197
+ async findExternalInteractionOptions() {
198
+ const workflows = await this.prisma.workflow.findMany({
199
+ where: { status: 'PUBLISHED', isEnabled: true },
200
+ orderBy: { name: 'asc' },
201
+ include: {
202
+ versions: {
203
+ orderBy: { version: 'desc' },
204
+ take: 1,
205
+ select: { dsl: true },
206
+ },
207
+ },
208
+ });
209
+ const dispatchWorkflows: Array<{ id: string; name: string }> = [];
210
+ const callbackWorkflows: Array<{ id: string; name: string }> = [];
211
+ for (const workflow of workflows) {
212
+ const dsl = workflow.versions[0]?.dsl;
213
+ try {
214
+ if (describeCallableWorkflow(dsl)?.mode === 'ONE_WAY') {
215
+ dispatchWorkflows.push({
216
+ id: String(workflow.id),
217
+ name: workflow.name,
218
+ });
219
+ }
220
+ } catch {
221
+ // Invalid callable Workflows are not selectable.
222
+ }
223
+ const nodes =
224
+ dsl &&
225
+ typeof dsl === 'object' &&
226
+ !Array.isArray(dsl) &&
227
+ Array.isArray((dsl as { nodes?: unknown }).nodes)
228
+ ? (dsl as { nodes: Array<{ type?: string }> }).nodes ?? []
229
+ : [];
230
+ if (
231
+ nodes.filter((node) => node.type === 'webhook_trigger').length === 1
232
+ ) {
233
+ callbackWorkflows.push({
234
+ id: String(workflow.id),
235
+ name: workflow.name,
236
+ });
237
+ }
238
+ }
239
+ return { dispatchWorkflows, callbackWorkflows };
240
+ }
241
+
145
242
  async findOne(id: bigint) {
146
243
  const workflow = await this.prisma.workflow.findUnique({
147
244
  where: { id },
@@ -179,11 +276,25 @@ export class WorkflowService {
179
276
  }
180
277
 
181
278
  async saveDraft(id: bigint, dsl: any) {
182
- const workflow = await this.prisma.workflow.findUnique({ where: { id } });
279
+ const workflow = await this.prisma.workflow.findUnique({
280
+ where: { id },
281
+ include: {
282
+ versions: {
283
+ orderBy: { version: 'desc' },
284
+ take: 1,
285
+ select: { dsl: true },
286
+ },
287
+ },
288
+ });
183
289
  if (!workflow) throw new NotFoundException('Workflow not found');
290
+ const latestPublishedDsl = workflow.versions?.[0]?.dsl;
291
+ const status =
292
+ latestPublishedDsl && areWorkflowDslSourcesEqual(dsl, latestPublishedDsl)
293
+ ? 'PUBLISHED'
294
+ : 'DRAFT';
184
295
  return this.prisma.workflow.update({
185
296
  where: { id },
186
- data: { dsl, status: 'DRAFT' },
297
+ data: { dsl, status },
187
298
  });
188
299
  }
189
300
 
@@ -228,7 +339,29 @@ export class WorkflowService {
228
339
  );
229
340
  }
230
341
 
231
- return this.prisma.workflow.delete({ where: { id } });
342
+ return this.prisma.$transaction(async (tx) => {
343
+ const interactions = await tx.externalInteraction.findMany({
344
+ where: {
345
+ OR: [
346
+ { workflowInstance: { workflowId: id } },
347
+ { workflowVersion: { workflowId: id } },
348
+ ],
349
+ },
350
+ select: { id: true },
351
+ });
352
+ const interactionIds = interactions.map((interaction) => interaction.id);
353
+
354
+ if (interactionIds.length) {
355
+ const where = { interactionId: { in: interactionIds } };
356
+ await tx.externalInteractionSignalOutbox.deleteMany({ where });
357
+ await tx.externalInteractionEvent.deleteMany({ where });
358
+ await tx.externalInteraction.deleteMany({
359
+ where: { id: { in: interactionIds } },
360
+ });
361
+ }
362
+
363
+ return tx.workflow.delete({ where: { id } });
364
+ });
232
365
  }
233
366
 
234
367
  async getVersions(workflowId: bigint) {
@@ -261,22 +394,34 @@ export class WorkflowService {
261
394
  ) {
262
395
  const workflow = await this.prisma.workflow.findUnique({
263
396
  where: { id: workflowId },
397
+ include: {
398
+ versions: {
399
+ orderBy: { version: 'desc' },
400
+ take: 1,
401
+ select: { dsl: true },
402
+ },
403
+ },
264
404
  });
265
405
  if (!workflow) throw new NotFoundException('Workflow not found');
266
406
 
267
407
  // Use workflow.dsl if available; otherwise fall back to latest version's DSL
268
408
  let dslToPublish = workflow.dsl;
269
409
  if (!dslToPublish) {
270
- const latestVersion = await this.prisma.workflowVersion.findFirst({
271
- where: { workflowId },
272
- orderBy: { version: 'desc' },
273
- select: { dsl: true },
274
- });
275
- dslToPublish = latestVersion?.dsl ?? null;
410
+ dslToPublish = workflow.versions?.[0]?.dsl ?? null;
276
411
  }
277
412
  if (!dslToPublish) {
278
413
  throw new NotFoundException('No draft DSL to publish');
279
414
  }
415
+ const latestPublishedDsl = workflow.versions?.[0]?.dsl;
416
+ if (
417
+ latestPublishedDsl &&
418
+ areWorkflowDslSourcesEqual(dslToPublish, latestPublishedDsl)
419
+ ) {
420
+ throw new BadRequestException({
421
+ code: 'WORKFLOW_DSL_UNCHANGED',
422
+ message: '保存后的 Workflow DSL 与最新发布版本相同,无需再次发布',
423
+ });
424
+ }
280
425
 
281
426
  // Structural + cycle validation. Reject malformed/cyclic DSL up-front so the
282
427
  // worker's executeGraph never has to deal with them at runtime.
@@ -286,11 +431,38 @@ export class WorkflowService {
286
431
  throw new BadRequestException(`Invalid DSL: ${err?.message ?? err}`);
287
432
  }
288
433
 
289
- // Per-edge sourceHandle validation against node-type outputs declared in
290
- // @gadmin2n/nest-common (NODE_TYPE_META). nest-common is the single source
291
- // of truth for handle metadata; the seeded t_workflow_node_type.outputs
292
- // column mirrors it (verified at seed time in workflow-node-types.ts).
293
- const handleErrors = validateDslHandles(dslToPublish as any);
434
+ // Validate source handles against the same node-type metadata consumed by
435
+ // the canvas. This also supports project-specific node types and output
436
+ // declarations without requiring a nest-common release.
437
+ const handleDsl = dslToPublish as any;
438
+ const nodeTypes = await this.prisma.workflowNodeType.findMany({
439
+ select: { type: true, outputs: true },
440
+ });
441
+ const outputsMap = Object.fromEntries(
442
+ nodeTypes.map((nodeType) => [
443
+ nodeType.type,
444
+ nodeType.outputs === null
445
+ ? null
446
+ : Array.isArray(nodeType.outputs)
447
+ ? nodeType.outputs.filter(
448
+ (output): output is string => typeof output === 'string',
449
+ )
450
+ : [],
451
+ ]),
452
+ ) as NodeOutputsMap;
453
+ const handleErrors = validateWorkflowHandles(
454
+ {
455
+ ...handleDsl,
456
+ edges: (handleDsl.edges ?? [])
457
+ .filter((edge: any) => !edge.kind || edge.kind === 'FLOW')
458
+ .map((edge: any) =>
459
+ ['response-out', 'result-out'].includes(edge.sourceHandle)
460
+ ? { ...edge, sourceHandle: undefined }
461
+ : edge,
462
+ ),
463
+ },
464
+ outputsMap,
465
+ );
294
466
  if (handleErrors.length > 0) {
295
467
  throw new BadRequestException({
296
468
  message: 'DSL validation failed: invalid edge sourceHandle(s)',
@@ -299,21 +471,43 @@ export class WorkflowService {
299
471
  });
300
472
  }
301
473
 
474
+ const compiledDsl = await this.workflowCompiler.compile(
475
+ dslToPublish as unknown as DraftWorkflowDsl,
476
+ { userId: creator, username: creator },
477
+ );
478
+ try {
479
+ validateWorkflowDataEdges(compiledDsl as any);
480
+ } catch (error) {
481
+ throw new BadRequestException(
482
+ `Invalid node dependency: ${
483
+ error instanceof Error ? error.message : error
484
+ }`,
485
+ );
486
+ }
487
+
302
488
  // Validate webhook path collisions across other published workflows
303
- const webhookConfigs = this.extractWebhookConfigs(dslToPublish);
489
+ const webhookConfigs = this.extractWebhookConfigs(compiledDsl);
304
490
  if (webhookConfigs.length > 0) {
305
491
  const otherPublished = await this.prisma.workflow.findMany({
306
492
  where: { status: 'PUBLISHED', id: { not: workflowId } },
307
- select: { id: true, name: true, dsl: true },
493
+ select: {
494
+ id: true,
495
+ name: true,
496
+ versions: {
497
+ orderBy: { version: 'desc' },
498
+ take: 1,
499
+ select: { dsl: true },
500
+ },
501
+ },
308
502
  });
309
503
  for (const cfg of webhookConfigs) {
310
- if (!cfg.secret) {
504
+ if (cfg.verificationMode === 'HMAC' && !cfg.secret) {
311
505
  throw new Error(
312
506
  `webhook_trigger path="${cfg.method} ${cfg.path}" requires a secret (HMAC strict mode)`,
313
507
  );
314
508
  }
315
509
  const conflict = otherPublished.find((w) =>
316
- this.extractWebhookConfigs(w.dsl).some(
510
+ this.extractWebhookConfigs(w.versions[0]?.dsl).some(
317
511
  (other) => other.path === cfg.path && other.method === cfg.method,
318
512
  ),
319
513
  );
@@ -337,7 +531,7 @@ export class WorkflowService {
337
531
  data: {
338
532
  workflowId,
339
533
  version: nextVersion,
340
- dsl: dslToPublish,
534
+ dsl: compiledDsl as unknown as Prisma.InputJsonValue,
341
535
  prompt: data.changeSummary,
342
536
  changeSummary: data.changeSummary,
343
537
  creator,
@@ -349,17 +543,34 @@ export class WorkflowService {
349
543
  data: { status: 'PUBLISHED' },
350
544
  });
351
545
 
546
+ await tx.audit.create({
547
+ data: {
548
+ creator,
549
+ authorName: creator,
550
+ action: 'PUBLISH_WORKFLOW_VERSION',
551
+ resource: 'workflow',
552
+ resourceId: String(workflowId),
553
+ data: JSON.stringify({
554
+ workflowVersionId: String(version.id),
555
+ version: nextVersion,
556
+ configHashes: compiledDsl.nodes.flatMap((node) =>
557
+ node.source?.configHash ? [node.source.configHash] : [],
558
+ ),
559
+ }),
560
+ },
561
+ });
562
+
352
563
  return version;
353
564
  });
354
565
 
355
566
  // Cron schedule lifecycle: register/update if cron_trigger present, delete otherwise
356
- const cronConfig = this.extractCronConfig(dslToPublish);
567
+ const cronConfig = this.extractCronConfig(result.dsl);
357
568
  try {
358
569
  if (cronConfig) {
359
570
  await this.temporalService.upsertCronSchedule({
360
571
  workflowId: Number(workflowId),
361
572
  versionId: Number(result.id),
362
- dsl: dslToPublish,
573
+ dsl: result.dsl,
363
574
  cron: cronConfig.cron,
364
575
  timezone: cronConfig.timezone,
365
576
  });
@@ -498,7 +709,11 @@ export class WorkflowService {
498
709
 
499
710
  async executeWorkflow(
500
711
  workflowId: bigint,
501
- dto: { context?: Record<string, any>; versionId?: number },
712
+ dto: {
713
+ workflow?: Record<string, any>;
714
+ versionId?: number;
715
+ workflowVersionId?: bigint;
716
+ },
502
717
  creator: string,
503
718
  temporalService: any,
504
719
  ) {
@@ -523,7 +738,11 @@ export class WorkflowService {
523
738
 
524
739
  // Determine which version to use
525
740
  let version;
526
- if (dto.versionId) {
741
+ if (dto.workflowVersionId) {
742
+ version = await this.prisma.workflowVersion.findFirst({
743
+ where: { id: dto.workflowVersionId, workflowId },
744
+ });
745
+ } else if (dto.versionId) {
527
746
  version = await this.prisma.workflowVersion.findFirst({
528
747
  where: { workflowId, version: dto.versionId },
529
748
  });
@@ -533,13 +752,15 @@ export class WorkflowService {
533
752
 
534
753
  if (!version) throw new NotFoundException('No published version found');
535
754
 
755
+ const executionContext = createWorkflowExecutionState(dto.workflow);
756
+
536
757
  // Create a WorkflowInstance record
537
758
  const instance = await this.prisma.workflowInstance.create({
538
759
  data: {
539
760
  workflowId,
540
761
  versionId: version.id,
541
762
  status: 'PENDING',
542
- context: dto.context || {},
763
+ context: executionContext,
543
764
  creator,
544
765
  },
545
766
  });
@@ -550,7 +771,7 @@ export class WorkflowService {
550
771
  workflowId: Number(workflowId),
551
772
  versionId: Number(version.id),
552
773
  dsl: version.dsl,
553
- context: dto.context || {},
774
+ context: executionContext,
554
775
  });
555
776
 
556
777
  // Update instance with Temporal run ID
@@ -562,14 +783,15 @@ export class WorkflowService {
562
783
  return {
563
784
  instanceId: instance.id.toString(),
564
785
  temporalRunId,
786
+ workflowVersionId: version.id.toString(),
565
787
  status: 'PENDING',
566
788
  };
567
789
  }
568
790
 
569
791
  /**
570
792
  * Webhook trigger entry point. Looks up published workflows whose DSL contains a
571
- * webhook_trigger node matching (path, method), verifies HMAC signature against
572
- * each match's secret, and starts a workflow instance per verified match.
793
+ * webhook_trigger node matching (path, method), applies the trigger's configured
794
+ * request verification, and starts a workflow instance per accepted match.
573
795
  *
574
796
  * Returns the list of created instance IDs. Throws:
575
797
  * - NotFoundException when no published workflow listens on this path/method
@@ -585,19 +807,8 @@ export class WorkflowService {
585
807
  headers: Record<string, any>;
586
808
  query: Record<string, any>;
587
809
  }): Promise<{ instanceIds: string[] }> {
588
- // 1) Timestamp window — reject stale requests (±5 min)
589
- const tsMs = Number(input.timestampHeader) * 1000;
590
- if (
591
- !input.timestampHeader ||
592
- !Number.isFinite(tsMs) ||
593
- Math.abs(Date.now() - tsMs) > 5 * 60 * 1000
594
- ) {
595
- throw new UnauthorizedException(
596
- 'Invalid or expired X-Workflow-Timestamp',
597
- );
598
- }
599
-
600
- // 2) Lookup matching published + enabled workflows
810
+ // 1) Lookup matching published + enabled workflows. Verification is configured
811
+ // per trigger, so the matching trigger must be known before headers are checked.
601
812
  const published = await this.prisma.workflow.findMany({
602
813
  where: { status: 'PUBLISHED', isEnabled: true },
603
814
  include: {
@@ -609,23 +820,26 @@ export class WorkflowService {
609
820
  workflowId: bigint;
610
821
  versionId: bigint;
611
822
  dsl: any;
612
- secret: string;
823
+ secret?: string;
824
+ verificationMode: 'HMAC' | 'NONE';
613
825
  };
614
826
  const matches: Match[] = [];
615
827
  for (const wf of published) {
616
828
  const version = wf.versions[0];
617
- const dsl = version?.dsl ?? wf.dsl;
618
- if (!dsl) continue;
829
+ if (!version) continue;
830
+ const dsl = version.dsl;
619
831
  const cfgs = this.extractWebhookConfigs(dsl);
620
832
  const cfg = cfgs.find(
621
833
  (c) => c.path === input.path && c.method === input.method,
622
834
  );
623
- if (!cfg || !cfg.secret) continue;
835
+ if (!cfg) continue;
836
+ if (cfg.verificationMode === 'HMAC' && !cfg.secret) continue;
624
837
  matches.push({
625
838
  workflowId: wf.id,
626
- versionId: version?.id ?? wf.id,
839
+ versionId: version.id,
627
840
  dsl,
628
841
  secret: cfg.secret,
842
+ verificationMode: cfg.verificationMode,
629
843
  });
630
844
  }
631
845
 
@@ -635,10 +849,26 @@ export class WorkflowService {
635
849
  );
636
850
  }
637
851
 
638
- // 3) Verify HMAC against each match's secret. Strict mode: every match must verify.
639
- for (const m of matches) {
852
+ // 2) Preserve strict HMAC verification for existing triggers. A missing
853
+ // verificationMode is normalized to HMAC by extractWebhookConfigs.
854
+ const signedMatches = matches.filter(
855
+ (match) => match.verificationMode === 'HMAC',
856
+ );
857
+ if (signedMatches.length > 0) {
858
+ const tsMs = Number(input.timestampHeader) * 1000;
859
+ if (
860
+ !input.timestampHeader ||
861
+ !Number.isFinite(tsMs) ||
862
+ Math.abs(Date.now() - tsMs) > 5 * 60 * 1000
863
+ ) {
864
+ throw new UnauthorizedException(
865
+ 'Invalid or expired X-Workflow-Timestamp',
866
+ );
867
+ }
868
+ }
869
+ for (const m of signedMatches) {
640
870
  const ok = verifyWebhookSignature(
641
- m.secret,
871
+ m.secret!,
642
872
  input.timestampHeader!,
643
873
  input.rawBody,
644
874
  input.signatureHeader,
@@ -648,8 +878,8 @@ export class WorkflowService {
648
878
  }
649
879
  }
650
880
 
651
- // 4) Trigger executions in parallel
652
- const context = {
881
+ // 3) Trigger executions in parallel
882
+ const workflowData = {
653
883
  headers: input.headers,
654
884
  query: input.query,
655
885
  body: input.body,
@@ -659,7 +889,7 @@ export class WorkflowService {
659
889
  matches.map((m) =>
660
890
  this.executeWorkflow(
661
891
  m.workflowId,
662
- { context },
892
+ { workflow: workflowData, workflowVersionId: m.versionId },
663
893
  'webhook',
664
894
  this.temporalService,
665
895
  ),
@@ -673,7 +903,7 @@ export class WorkflowService {
673
903
  const instance = await this.prisma.workflowInstance.findUnique({
674
904
  where: { id: instanceId },
675
905
  include: {
676
- workflow: { select: { name: true, dsl: true } },
906
+ workflow: { select: { name: true } },
677
907
  nodeExecutions: {
678
908
  orderBy: { createdAt: 'asc' },
679
909
  },
@@ -692,11 +922,6 @@ export class WorkflowService {
692
922
  dsl = version?.dsl || null;
693
923
  }
694
924
 
695
- // Fallback: use DSL from the workflow itself
696
- if (!dsl && instance.workflow.dsl) {
697
- dsl = instance.workflow.dsl;
698
- }
699
-
700
925
  return {
701
926
  ...instance,
702
927
  workflow: { name: instance.workflow.name },
@@ -740,12 +965,18 @@ export class WorkflowService {
740
965
  throw new Error('Can only retry FAILED instances');
741
966
  }
742
967
 
743
- // Create a new instance with the same context
968
+ const executionState = instance.context as Record<string, any>;
969
+ // Create a new instance with the same immutable Workflow data.
744
970
  return this.executeWorkflow(
745
971
  instance.workflowId,
746
972
  {
747
- context: instance.context as Record<string, any>,
748
- versionId: undefined,
973
+ workflow:
974
+ executionState.workflow &&
975
+ typeof executionState.workflow === 'object' &&
976
+ !Array.isArray(executionState.workflow)
977
+ ? executionState.workflow
978
+ : {},
979
+ workflowVersionId: instance.versionId,
749
980
  },
750
981
  creator,
751
982
  temporalService,
@@ -778,34 +1009,32 @@ export class WorkflowService {
778
1009
  instanceId: bigint,
779
1010
  dto: { nodeId: string; approved: boolean; comment?: string },
780
1011
  approverId: string,
781
- temporalService: any,
1012
+ _temporalService: any,
782
1013
  ) {
783
- const instance = await this.prisma.workflowInstance.findUnique({
784
- where: { id: instanceId },
785
- });
786
- if (!instance) throw new NotFoundException('Instance not found');
787
- if (!instance.temporalRunId) {
788
- throw new Error('Instance has no Temporal run ID');
789
- }
790
-
791
- const nodeExecution = await this.prisma.workflowNodeExecution.findUnique({
792
- where: { instanceId_nodeId: { instanceId, nodeId: dto.nodeId } },
1014
+ const request = await this.prisma.approvalRequest.findUnique({
1015
+ where: {
1016
+ workflowInstanceId_nodeId: {
1017
+ workflowInstanceId: instanceId,
1018
+ nodeId: dto.nodeId,
1019
+ },
1020
+ },
793
1021
  });
794
- if (!nodeExecution) throw new NotFoundException('Node execution not found');
795
-
796
- const approvers: string[] = (nodeExecution.input as any)?.approvers || [];
797
- if (!approvers.includes(approverId)) {
798
- throw new UnauthorizedException(
799
- `${approverId} is not an approver for this node`,
800
- );
1022
+ if (!request || request.status !== 'PENDING') {
1023
+ throw new NotFoundException('Open approval request not found');
801
1024
  }
802
-
803
- await temporalService.signalWorkflow(instance.temporalRunId, 'approval', {
804
- nodeId: dto.nodeId,
805
- approved: dto.approved,
806
- approvedBy: approverId,
807
- comment: dto.comment,
808
- });
809
- return { success: true };
1025
+ return this.humanApprovalService.submitDecision(
1026
+ request.id,
1027
+ { decision: dto.approved ? 'APPROVE' : 'REJECT', comment: dto.comment },
1028
+ { userId: approverId },
1029
+ );
810
1030
  }
811
1031
  }
1032
+
1033
+ function createWorkflowExecutionState(
1034
+ value: Record<string, any> | undefined,
1035
+ ): Record<string, any> {
1036
+ return {
1037
+ workflow: value ?? {},
1038
+ nodes: {},
1039
+ };
1040
+ }