@gadmin2n/schematics 0.0.139 → 0.0.141

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 (329) 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/config/ui/Event.ts +1 -1
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +6 -5
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +10 -3
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +6 -4
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -2
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +12 -3
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/gen-jwt.ts +8 -1
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +86 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +710 -121
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +125 -10
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +28 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.spec.ts +61 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.ts +7 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +54 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +86 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +9 -3
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +89 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +68 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +177 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +283 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +10 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +42 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +108 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +101 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +29 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +21 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.registry.ts +30 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.ts +15 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +105 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +96 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +78 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +56 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +111 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.spec.ts +23 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.ts +18 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +240 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +339 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.types.ts +74 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +47 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +41 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +70 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +76 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +12 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +227 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +121 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +160 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +41 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +171 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +245 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +22 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.spec.ts +68 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.ts +126 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule.types.ts +34 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +115 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +45 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +59 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +72 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +144 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +19 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +350 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +774 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +46 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +227 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +14 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +151 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +88 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +43 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +21 -1
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +77 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.dto.ts +98 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +277 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.spec.ts +14 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.ts +59 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integrationConnection.module.ts +10 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/actor-context.util.ts +27 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user-group.provider.ts +208 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +168 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.spec.ts +157 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.ts +176 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.dto.ts +21 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +78 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.spec.ts +100 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +115 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +97 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subjectProvider.module.ts +34 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +89 -1
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +4 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +119 -0
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +91 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +34 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +161 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +390 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/userGroup.module.ts +10 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +17 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +8 -2
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +93 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +34 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +26 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +158 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +155 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +512 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +368 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +43 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +174 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +149 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-comparison.ts +43 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +4 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +70 -28
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +128 -0
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +85 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +157 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +59 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +27 -5
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +18 -3
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +493 -21
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +426 -90
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +79 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +62 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/schema.types.ts +10 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +124 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +236 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +49 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +69 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/workflowConfig.module.ts +20 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.spec.ts +15 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.ts +25 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +103 -11
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.dto.ts +98 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +3 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +72 -62
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +148 -11
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -9
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +5 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +2 -2
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +0 -5
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/PageHeader.tsx +46 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +26 -18
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +2 -2
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +24 -17
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +7 -18
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +2 -2
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +288 -33
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/themeStyles.ts +97 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/SettingDrawer.tsx +251 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +47 -19
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +18 -9
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/menuRenderer.tsx +155 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +123 -129
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.test.ts +10 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +18 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +32 -3
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +98 -3
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +101 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +51 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -1
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +40 -1
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +5 -5
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +16 -1
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +10 -7
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +4 -2
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +26 -2
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +575 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +26 -2
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +575 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +152 -2
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +9 -15
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +41 -9
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +1 -1
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +10 -8
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +3 -3
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +1 -1
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +141 -138
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +3 -6
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.css +3 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +45 -13
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasComponentLibrary.tsx +45 -22
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +175 -119
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +248 -74
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +33 -18
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +16 -10
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +1 -1
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +31 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +15 -0
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +16 -11
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +25 -21
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +6 -1
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +9 -10
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartConfigModal.tsx +4 -7
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +23 -9
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +16 -11
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +2 -5
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +16 -11
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +2 -9
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +23 -12
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +2 -17
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.test.ts +149 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +111 -17
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +1 -0
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.test.ts +83 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.ts +118 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardName.test.ts +26 -0
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +9 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +1 -1
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +10 -8
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +3 -6
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +71 -0
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +209 -0
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +6 -1
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +47 -150
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +21 -20
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +1 -1
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +115 -118
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +1 -1
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +61 -64
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +1 -1
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +187 -200
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +84 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +141 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +16 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +210 -0
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +154 -0
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +194 -5
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +76 -0
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +1 -1
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +176 -22
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +62 -0
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +94 -5
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +15 -10
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +251 -70
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +18 -24
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +106 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +45 -0
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +43 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +283 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +6 -7
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +335 -0
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +433 -237
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +179 -0
  248. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +18 -16
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +20 -16
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +6 -4
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +68 -0
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +367 -0
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connection.types.ts +21 -0
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +180 -0
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +38 -22
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +41 -0
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +6 -0
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +29 -35
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +8 -11
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +4 -3
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +56 -23
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +21 -6
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +17 -20
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +9 -17
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +311 -0
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +218 -0
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +83 -0
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +135 -0
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema-defaults.ts +36 -0
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema.types.ts +32 -0
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.test.tsx +23 -0
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +52 -0
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +9 -13
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +39 -0
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +20 -0
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +72 -0
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +47 -0
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +185 -0
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.test.tsx +102 -0
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +150 -0
  281. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +103 -0
  282. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +135 -0
  283. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +273 -0
  284. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +303 -0
  285. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +189 -0
  286. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +706 -0
  287. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +86 -0
  288. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +458 -0
  289. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +81 -0
  290. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +281 -0
  291. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +61 -0
  292. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +266 -0
  293. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +104 -0
  294. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +98 -0
  295. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +70 -0
  296. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +138 -0
  297. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +25 -0
  298. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +42 -0
  299. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +95 -0
  300. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +15 -11
  301. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.test.tsx +152 -0
  302. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +438 -141
  303. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +49 -0
  304. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +31 -2
  305. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +208 -0
  306. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +246 -0
  307. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +77 -0
  308. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +34 -0
  309. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +18 -0
  310. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +66 -0
  311. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +39 -0
  312. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +48 -0
  313. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +51 -0
  314. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +32 -0
  315. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +1 -1
  316. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +10 -8
  317. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +3 -3
  318. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd-theme-vars.css +93 -0
  319. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +8 -8
  320. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +4 -4
  321. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +40 -5
  322. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +3 -3
  323. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +3 -3
  324. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/theme-styles.css +81 -0
  325. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +5 -0
  326. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +1 -7
  327. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +12 -0
  328. package/package.json +1 -1
  329. 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,14 @@ 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
+ responseMode: 'IMMEDIATE' | 'WAIT_FOR_RESULT';
57
+ responseTimeoutSeconds: number;
58
+ }> {
43
59
  if (!Array.isArray(dsl?.nodes)) return [];
44
60
  return dsl.nodes
45
61
  .filter(
@@ -50,6 +66,18 @@ export class WorkflowService {
50
66
  path: n.config.path,
51
67
  method: n.config.method,
52
68
  secret: n.config.secret,
69
+ verificationMode:
70
+ n.config.verificationMode === 'NONE' ? 'NONE' : 'HMAC',
71
+ responseMode:
72
+ n.config.responseMode === 'WAIT_FOR_RESULT'
73
+ ? 'WAIT_FOR_RESULT'
74
+ : 'IMMEDIATE',
75
+ responseTimeoutSeconds:
76
+ Number.isInteger(n.config.responseTimeoutSeconds) &&
77
+ n.config.responseTimeoutSeconds >= 1 &&
78
+ n.config.responseTimeoutSeconds <= 300
79
+ ? n.config.responseTimeoutSeconds
80
+ : 60,
53
81
  }));
54
82
  }
55
83
 
@@ -142,6 +170,87 @@ export class WorkflowService {
142
170
  return { items: enrichedItems, total };
143
171
  }
144
172
 
173
+ async findCallableWorkflows(resultType = 'APPROVAL_SUBJECTS') {
174
+ const workflows = await this.prisma.workflow.findMany({
175
+ where: { status: 'PUBLISHED', isEnabled: true },
176
+ orderBy: { name: 'asc' },
177
+ include: {
178
+ versions: {
179
+ orderBy: { version: 'desc' },
180
+ take: 1,
181
+ select: { dsl: true },
182
+ },
183
+ },
184
+ });
185
+ return workflows.flatMap((workflow) => {
186
+ try {
187
+ const descriptor = describeCallableWorkflow(workflow.versions[0]?.dsl);
188
+ if (
189
+ !descriptor ||
190
+ descriptor.mode !== 'RETURN' ||
191
+ descriptor.resultType !== resultType
192
+ )
193
+ return [];
194
+ return [
195
+ {
196
+ id: String(workflow.id),
197
+ name: workflow.name,
198
+ description: workflow.description,
199
+ inputParameters: descriptor.inputParameters,
200
+ resultType: descriptor.resultType,
201
+ },
202
+ ];
203
+ } catch {
204
+ return [];
205
+ }
206
+ });
207
+ }
208
+
209
+ async findExternalInteractionOptions() {
210
+ const workflows = await this.prisma.workflow.findMany({
211
+ where: { status: 'PUBLISHED', isEnabled: true },
212
+ orderBy: { name: 'asc' },
213
+ include: {
214
+ versions: {
215
+ orderBy: { version: 'desc' },
216
+ take: 1,
217
+ select: { dsl: true },
218
+ },
219
+ },
220
+ });
221
+ const dispatchWorkflows: Array<{ id: string; name: string }> = [];
222
+ const callbackWorkflows: Array<{ id: string; name: string }> = [];
223
+ for (const workflow of workflows) {
224
+ const dsl = workflow.versions[0]?.dsl;
225
+ try {
226
+ if (describeCallableWorkflow(dsl)?.mode === 'ONE_WAY') {
227
+ dispatchWorkflows.push({
228
+ id: String(workflow.id),
229
+ name: workflow.name,
230
+ });
231
+ }
232
+ } catch {
233
+ // Invalid callable Workflows are not selectable.
234
+ }
235
+ const nodes =
236
+ dsl &&
237
+ typeof dsl === 'object' &&
238
+ !Array.isArray(dsl) &&
239
+ Array.isArray((dsl as { nodes?: unknown }).nodes)
240
+ ? (dsl as { nodes: Array<{ type?: string }> }).nodes ?? []
241
+ : [];
242
+ if (
243
+ nodes.filter((node) => node.type === 'webhook_trigger').length === 1
244
+ ) {
245
+ callbackWorkflows.push({
246
+ id: String(workflow.id),
247
+ name: workflow.name,
248
+ });
249
+ }
250
+ }
251
+ return { dispatchWorkflows, callbackWorkflows };
252
+ }
253
+
145
254
  async findOne(id: bigint) {
146
255
  const workflow = await this.prisma.workflow.findUnique({
147
256
  where: { id },
@@ -179,11 +288,25 @@ export class WorkflowService {
179
288
  }
180
289
 
181
290
  async saveDraft(id: bigint, dsl: any) {
182
- const workflow = await this.prisma.workflow.findUnique({ where: { id } });
291
+ const workflow = await this.prisma.workflow.findUnique({
292
+ where: { id },
293
+ include: {
294
+ versions: {
295
+ orderBy: { version: 'desc' },
296
+ take: 1,
297
+ select: { dsl: true },
298
+ },
299
+ },
300
+ });
183
301
  if (!workflow) throw new NotFoundException('Workflow not found');
302
+ const latestPublishedDsl = workflow.versions?.[0]?.dsl;
303
+ const status =
304
+ latestPublishedDsl && areWorkflowDslSourcesEqual(dsl, latestPublishedDsl)
305
+ ? 'PUBLISHED'
306
+ : 'DRAFT';
184
307
  return this.prisma.workflow.update({
185
308
  where: { id },
186
- data: { dsl, status: 'DRAFT' },
309
+ data: { dsl, status },
187
310
  });
188
311
  }
189
312
 
@@ -228,7 +351,29 @@ export class WorkflowService {
228
351
  );
229
352
  }
230
353
 
231
- return this.prisma.workflow.delete({ where: { id } });
354
+ return this.prisma.$transaction(async (tx) => {
355
+ const interactions = await tx.externalInteraction.findMany({
356
+ where: {
357
+ OR: [
358
+ { workflowInstance: { workflowId: id } },
359
+ { workflowVersion: { workflowId: id } },
360
+ ],
361
+ },
362
+ select: { id: true },
363
+ });
364
+ const interactionIds = interactions.map((interaction) => interaction.id);
365
+
366
+ if (interactionIds.length) {
367
+ const where = { interactionId: { in: interactionIds } };
368
+ await tx.externalInteractionSignalOutbox.deleteMany({ where });
369
+ await tx.externalInteractionEvent.deleteMany({ where });
370
+ await tx.externalInteraction.deleteMany({
371
+ where: { id: { in: interactionIds } },
372
+ });
373
+ }
374
+
375
+ return tx.workflow.delete({ where: { id } });
376
+ });
232
377
  }
233
378
 
234
379
  async getVersions(workflowId: bigint) {
@@ -261,22 +406,34 @@ export class WorkflowService {
261
406
  ) {
262
407
  const workflow = await this.prisma.workflow.findUnique({
263
408
  where: { id: workflowId },
409
+ include: {
410
+ versions: {
411
+ orderBy: { version: 'desc' },
412
+ take: 1,
413
+ select: { dsl: true },
414
+ },
415
+ },
264
416
  });
265
417
  if (!workflow) throw new NotFoundException('Workflow not found');
266
418
 
267
419
  // Use workflow.dsl if available; otherwise fall back to latest version's DSL
268
420
  let dslToPublish = workflow.dsl;
269
421
  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;
422
+ dslToPublish = workflow.versions?.[0]?.dsl ?? null;
276
423
  }
277
424
  if (!dslToPublish) {
278
425
  throw new NotFoundException('No draft DSL to publish');
279
426
  }
427
+ const latestPublishedDsl = workflow.versions?.[0]?.dsl;
428
+ if (
429
+ latestPublishedDsl &&
430
+ areWorkflowDslSourcesEqual(dslToPublish, latestPublishedDsl)
431
+ ) {
432
+ throw new BadRequestException({
433
+ code: 'WORKFLOW_DSL_UNCHANGED',
434
+ message: '保存后的 Workflow DSL 与最新发布版本相同,无需再次发布',
435
+ });
436
+ }
280
437
 
281
438
  // Structural + cycle validation. Reject malformed/cyclic DSL up-front so the
282
439
  // worker's executeGraph never has to deal with them at runtime.
@@ -286,11 +443,38 @@ export class WorkflowService {
286
443
  throw new BadRequestException(`Invalid DSL: ${err?.message ?? err}`);
287
444
  }
288
445
 
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);
446
+ // Validate source handles against the same node-type metadata consumed by
447
+ // the canvas. This also supports project-specific node types and output
448
+ // declarations without requiring a nest-common release.
449
+ const handleDsl = dslToPublish as any;
450
+ const nodeTypes = await this.prisma.workflowNodeType.findMany({
451
+ select: { type: true, outputs: true },
452
+ });
453
+ const outputsMap = Object.fromEntries(
454
+ nodeTypes.map((nodeType) => [
455
+ nodeType.type,
456
+ nodeType.outputs === null
457
+ ? null
458
+ : Array.isArray(nodeType.outputs)
459
+ ? nodeType.outputs.filter(
460
+ (output): output is string => typeof output === 'string',
461
+ )
462
+ : [],
463
+ ]),
464
+ ) as NodeOutputsMap;
465
+ const handleErrors = validateWorkflowHandles(
466
+ {
467
+ ...handleDsl,
468
+ edges: (handleDsl.edges ?? [])
469
+ .filter((edge: any) => !edge.kind || edge.kind === 'FLOW')
470
+ .map((edge: any) =>
471
+ ['response-out', 'result-out'].includes(edge.sourceHandle)
472
+ ? { ...edge, sourceHandle: undefined }
473
+ : edge,
474
+ ),
475
+ },
476
+ outputsMap,
477
+ );
294
478
  if (handleErrors.length > 0) {
295
479
  throw new BadRequestException({
296
480
  message: 'DSL validation failed: invalid edge sourceHandle(s)',
@@ -299,21 +483,43 @@ export class WorkflowService {
299
483
  });
300
484
  }
301
485
 
486
+ const compiledDsl = await this.workflowCompiler.compile(
487
+ dslToPublish as unknown as DraftWorkflowDsl,
488
+ { userId: creator, username: creator },
489
+ );
490
+ try {
491
+ validateWorkflowDataEdges(compiledDsl as any);
492
+ } catch (error) {
493
+ throw new BadRequestException(
494
+ `Invalid node dependency: ${
495
+ error instanceof Error ? error.message : error
496
+ }`,
497
+ );
498
+ }
499
+
302
500
  // Validate webhook path collisions across other published workflows
303
- const webhookConfigs = this.extractWebhookConfigs(dslToPublish);
501
+ const webhookConfigs = this.extractWebhookConfigs(compiledDsl);
304
502
  if (webhookConfigs.length > 0) {
305
503
  const otherPublished = await this.prisma.workflow.findMany({
306
504
  where: { status: 'PUBLISHED', id: { not: workflowId } },
307
- select: { id: true, name: true, dsl: true },
505
+ select: {
506
+ id: true,
507
+ name: true,
508
+ versions: {
509
+ orderBy: { version: 'desc' },
510
+ take: 1,
511
+ select: { dsl: true },
512
+ },
513
+ },
308
514
  });
309
515
  for (const cfg of webhookConfigs) {
310
- if (!cfg.secret) {
516
+ if (cfg.verificationMode === 'HMAC' && !cfg.secret) {
311
517
  throw new Error(
312
518
  `webhook_trigger path="${cfg.method} ${cfg.path}" requires a secret (HMAC strict mode)`,
313
519
  );
314
520
  }
315
521
  const conflict = otherPublished.find((w) =>
316
- this.extractWebhookConfigs(w.dsl).some(
522
+ this.extractWebhookConfigs(w.versions[0]?.dsl).some(
317
523
  (other) => other.path === cfg.path && other.method === cfg.method,
318
524
  ),
319
525
  );
@@ -337,7 +543,7 @@ export class WorkflowService {
337
543
  data: {
338
544
  workflowId,
339
545
  version: nextVersion,
340
- dsl: dslToPublish,
546
+ dsl: compiledDsl as unknown as Prisma.InputJsonValue,
341
547
  prompt: data.changeSummary,
342
548
  changeSummary: data.changeSummary,
343
549
  creator,
@@ -349,17 +555,34 @@ export class WorkflowService {
349
555
  data: { status: 'PUBLISHED' },
350
556
  });
351
557
 
558
+ await tx.audit.create({
559
+ data: {
560
+ creator,
561
+ authorName: creator,
562
+ action: 'PUBLISH_WORKFLOW_VERSION',
563
+ resource: 'workflow',
564
+ resourceId: String(workflowId),
565
+ data: JSON.stringify({
566
+ workflowVersionId: String(version.id),
567
+ version: nextVersion,
568
+ configHashes: compiledDsl.nodes.flatMap((node) =>
569
+ node.source?.configHash ? [node.source.configHash] : [],
570
+ ),
571
+ }),
572
+ },
573
+ });
574
+
352
575
  return version;
353
576
  });
354
577
 
355
578
  // Cron schedule lifecycle: register/update if cron_trigger present, delete otherwise
356
- const cronConfig = this.extractCronConfig(dslToPublish);
579
+ const cronConfig = this.extractCronConfig(result.dsl);
357
580
  try {
358
581
  if (cronConfig) {
359
582
  await this.temporalService.upsertCronSchedule({
360
583
  workflowId: Number(workflowId),
361
584
  versionId: Number(result.id),
362
- dsl: dslToPublish,
585
+ dsl: result.dsl,
363
586
  cron: cronConfig.cron,
364
587
  timezone: cronConfig.timezone,
365
588
  });
@@ -498,7 +721,11 @@ export class WorkflowService {
498
721
 
499
722
  async executeWorkflow(
500
723
  workflowId: bigint,
501
- dto: { context?: Record<string, any>; versionId?: number },
724
+ dto: {
725
+ workflow?: Record<string, any>;
726
+ versionId?: number;
727
+ workflowVersionId?: bigint;
728
+ },
502
729
  creator: string,
503
730
  temporalService: any,
504
731
  ) {
@@ -523,7 +750,11 @@ export class WorkflowService {
523
750
 
524
751
  // Determine which version to use
525
752
  let version;
526
- if (dto.versionId) {
753
+ if (dto.workflowVersionId) {
754
+ version = await this.prisma.workflowVersion.findFirst({
755
+ where: { id: dto.workflowVersionId, workflowId },
756
+ });
757
+ } else if (dto.versionId) {
527
758
  version = await this.prisma.workflowVersion.findFirst({
528
759
  where: { workflowId, version: dto.versionId },
529
760
  });
@@ -533,13 +764,15 @@ export class WorkflowService {
533
764
 
534
765
  if (!version) throw new NotFoundException('No published version found');
535
766
 
767
+ const executionContext = createWorkflowExecutionState(dto.workflow);
768
+
536
769
  // Create a WorkflowInstance record
537
770
  const instance = await this.prisma.workflowInstance.create({
538
771
  data: {
539
772
  workflowId,
540
773
  versionId: version.id,
541
774
  status: 'PENDING',
542
- context: dto.context || {},
775
+ context: executionContext,
543
776
  creator,
544
777
  },
545
778
  });
@@ -550,7 +783,7 @@ export class WorkflowService {
550
783
  workflowId: Number(workflowId),
551
784
  versionId: Number(version.id),
552
785
  dsl: version.dsl,
553
- context: dto.context || {},
786
+ context: executionContext,
554
787
  });
555
788
 
556
789
  // Update instance with Temporal run ID
@@ -562,14 +795,15 @@ export class WorkflowService {
562
795
  return {
563
796
  instanceId: instance.id.toString(),
564
797
  temporalRunId,
798
+ workflowVersionId: version.id.toString(),
565
799
  status: 'PENDING',
566
800
  };
567
801
  }
568
802
 
569
803
  /**
570
804
  * 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.
805
+ * webhook_trigger node matching (path, method), applies the trigger's configured
806
+ * request verification, and starts a workflow instance per accepted match.
573
807
  *
574
808
  * Returns the list of created instance IDs. Throws:
575
809
  * - NotFoundException when no published workflow listens on this path/method
@@ -584,20 +818,16 @@ export class WorkflowService {
584
818
  body: any;
585
819
  headers: Record<string, any>;
586
820
  query: Record<string, any>;
587
- }): 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
821
+ }): Promise<{
822
+ instanceIds: string[];
823
+ response?: {
824
+ statusCode: number;
825
+ headers: Record<string, string>;
826
+ body: unknown;
827
+ };
828
+ }> {
829
+ // 1) Lookup matching published + enabled workflows. Verification is configured
830
+ // per trigger, so the matching trigger must be known before headers are checked.
601
831
  const published = await this.prisma.workflow.findMany({
602
832
  where: { status: 'PUBLISHED', isEnabled: true },
603
833
  include: {
@@ -609,23 +839,30 @@ export class WorkflowService {
609
839
  workflowId: bigint;
610
840
  versionId: bigint;
611
841
  dsl: any;
612
- secret: string;
842
+ secret?: string;
843
+ verificationMode: 'HMAC' | 'NONE';
844
+ responseMode: 'IMMEDIATE' | 'WAIT_FOR_RESULT';
845
+ responseTimeoutSeconds: number;
613
846
  };
614
847
  const matches: Match[] = [];
615
848
  for (const wf of published) {
616
849
  const version = wf.versions[0];
617
- const dsl = version?.dsl ?? wf.dsl;
618
- if (!dsl) continue;
850
+ if (!version) continue;
851
+ const dsl = version.dsl;
619
852
  const cfgs = this.extractWebhookConfigs(dsl);
620
853
  const cfg = cfgs.find(
621
854
  (c) => c.path === input.path && c.method === input.method,
622
855
  );
623
- if (!cfg || !cfg.secret) continue;
856
+ if (!cfg) continue;
857
+ if (cfg.verificationMode === 'HMAC' && !cfg.secret) continue;
624
858
  matches.push({
625
859
  workflowId: wf.id,
626
- versionId: version?.id ?? wf.id,
860
+ versionId: version.id,
627
861
  dsl,
628
862
  secret: cfg.secret,
863
+ verificationMode: cfg.verificationMode,
864
+ responseMode: cfg.responseMode,
865
+ responseTimeoutSeconds: cfg.responseTimeoutSeconds,
629
866
  });
630
867
  }
631
868
 
@@ -635,10 +872,26 @@ export class WorkflowService {
635
872
  );
636
873
  }
637
874
 
638
- // 3) Verify HMAC against each match's secret. Strict mode: every match must verify.
639
- for (const m of matches) {
875
+ // 2) Preserve strict HMAC verification for existing triggers. A missing
876
+ // verificationMode is normalized to HMAC by extractWebhookConfigs.
877
+ const signedMatches = matches.filter(
878
+ (match) => match.verificationMode === 'HMAC',
879
+ );
880
+ if (signedMatches.length > 0) {
881
+ const tsMs = Number(input.timestampHeader) * 1000;
882
+ if (
883
+ !input.timestampHeader ||
884
+ !Number.isFinite(tsMs) ||
885
+ Math.abs(Date.now() - tsMs) > 5 * 60 * 1000
886
+ ) {
887
+ throw new UnauthorizedException(
888
+ 'Invalid or expired X-Workflow-Timestamp',
889
+ );
890
+ }
891
+ }
892
+ for (const m of signedMatches) {
640
893
  const ok = verifyWebhookSignature(
641
- m.secret,
894
+ m.secret!,
642
895
  input.timestampHeader!,
643
896
  input.rawBody,
644
897
  input.signatureHeader,
@@ -648,8 +901,8 @@ export class WorkflowService {
648
901
  }
649
902
  }
650
903
 
651
- // 4) Trigger executions in parallel
652
- const context = {
904
+ // 3) Trigger executions in parallel
905
+ const workflowData = {
653
906
  headers: input.headers,
654
907
  query: input.query,
655
908
  body: input.body,
@@ -659,21 +912,82 @@ export class WorkflowService {
659
912
  matches.map((m) =>
660
913
  this.executeWorkflow(
661
914
  m.workflowId,
662
- { context },
915
+ { workflow: workflowData, workflowVersionId: m.versionId },
663
916
  'webhook',
664
917
  this.temporalService,
665
918
  ),
666
919
  ),
667
920
  );
668
921
 
669
- return { instanceIds: results.map((r) => r.instanceId) };
922
+ const instanceIds = results.map((result) => result.instanceId);
923
+ const waitingIndex = matches.findIndex(
924
+ (match) => match.responseMode === 'WAIT_FOR_RESULT',
925
+ );
926
+ if (waitingIndex === -1) return { instanceIds };
927
+
928
+ const match = matches[waitingIndex];
929
+ const execution = results[waitingIndex];
930
+ try {
931
+ const waited = await this.temporalService.waitForWorkflowResult(
932
+ execution.temporalRunId,
933
+ match.responseTimeoutSeconds * 1000,
934
+ );
935
+ if (waited.kind === 'TIMED_OUT') {
936
+ return {
937
+ instanceIds,
938
+ response: {
939
+ statusCode: 504,
940
+ headers: {},
941
+ body: {
942
+ code: 'WORKFLOW_RESPONSE_TIMEOUT',
943
+ message: `Workflow did not return a result within ${match.responseTimeoutSeconds} seconds`,
944
+ instanceId: execution.instanceId,
945
+ },
946
+ },
947
+ };
948
+ }
949
+
950
+ const workflowResult = asRecord(waited.result);
951
+ if (
952
+ workflowResult.status !== 'COMPLETED' ||
953
+ !Object.prototype.hasOwnProperty.call(workflowResult, 'output')
954
+ ) {
955
+ throw new Error('Workflow completed without a return result');
956
+ }
957
+ const httpResponse = asRecord(workflowResult.httpResponse);
958
+ return {
959
+ instanceIds,
960
+ response: {
961
+ statusCode: normalizeHttpStatusCode(httpResponse.statusCode),
962
+ headers: normalizeHttpHeaders(httpResponse.headers),
963
+ body: workflowResult.output,
964
+ },
965
+ };
966
+ } catch (error) {
967
+ this.logger.error(
968
+ `Workflow ${execution.instanceId} failed while waiting for an HTTP response`,
969
+ error instanceof Error ? error.stack : String(error),
970
+ );
971
+ return {
972
+ instanceIds,
973
+ response: {
974
+ statusCode: 500,
975
+ headers: {},
976
+ body: {
977
+ code: 'WORKFLOW_EXECUTION_FAILED',
978
+ message: 'Workflow execution failed',
979
+ instanceId: execution.instanceId,
980
+ },
981
+ },
982
+ };
983
+ }
670
984
  }
671
985
 
672
986
  async getInstanceDetail(instanceId: bigint) {
673
987
  const instance = await this.prisma.workflowInstance.findUnique({
674
988
  where: { id: instanceId },
675
989
  include: {
676
- workflow: { select: { name: true, dsl: true } },
990
+ workflow: { select: { name: true } },
677
991
  nodeExecutions: {
678
992
  orderBy: { createdAt: 'asc' },
679
993
  },
@@ -692,11 +1006,6 @@ export class WorkflowService {
692
1006
  dsl = version?.dsl || null;
693
1007
  }
694
1008
 
695
- // Fallback: use DSL from the workflow itself
696
- if (!dsl && instance.workflow.dsl) {
697
- dsl = instance.workflow.dsl;
698
- }
699
-
700
1009
  return {
701
1010
  ...instance,
702
1011
  workflow: { name: instance.workflow.name },
@@ -740,12 +1049,18 @@ export class WorkflowService {
740
1049
  throw new Error('Can only retry FAILED instances');
741
1050
  }
742
1051
 
743
- // Create a new instance with the same context
1052
+ const executionState = instance.context as Record<string, any>;
1053
+ // Create a new instance with the same immutable Workflow data.
744
1054
  return this.executeWorkflow(
745
1055
  instance.workflowId,
746
1056
  {
747
- context: instance.context as Record<string, any>,
748
- versionId: undefined,
1057
+ workflow:
1058
+ executionState.workflow &&
1059
+ typeof executionState.workflow === 'object' &&
1060
+ !Array.isArray(executionState.workflow)
1061
+ ? executionState.workflow
1062
+ : {},
1063
+ workflowVersionId: instance.versionId,
749
1064
  },
750
1065
  creator,
751
1066
  temporalService,
@@ -778,34 +1093,55 @@ export class WorkflowService {
778
1093
  instanceId: bigint,
779
1094
  dto: { nodeId: string; approved: boolean; comment?: string },
780
1095
  approverId: string,
781
- temporalService: any,
1096
+ _temporalService: any,
782
1097
  ) {
783
- const instance = await this.prisma.workflowInstance.findUnique({
784
- where: { id: instanceId },
1098
+ const request = await this.prisma.approvalRequest.findUnique({
1099
+ where: {
1100
+ workflowInstanceId_nodeId: {
1101
+ workflowInstanceId: instanceId,
1102
+ nodeId: dto.nodeId,
1103
+ },
1104
+ },
785
1105
  });
786
- if (!instance) throw new NotFoundException('Instance not found');
787
- if (!instance.temporalRunId) {
788
- throw new Error('Instance has no Temporal run ID');
1106
+ if (!request || request.status !== 'PENDING') {
1107
+ throw new NotFoundException('Open approval request not found');
789
1108
  }
1109
+ return this.humanApprovalService.submitDecision(
1110
+ request.id,
1111
+ { decision: dto.approved ? 'APPROVE' : 'REJECT', comment: dto.comment },
1112
+ { userId: approverId },
1113
+ );
1114
+ }
1115
+ }
790
1116
 
791
- const nodeExecution = await this.prisma.workflowNodeExecution.findUnique({
792
- where: { instanceId_nodeId: { instanceId, nodeId: dto.nodeId } },
793
- });
794
- if (!nodeExecution) throw new NotFoundException('Node execution not found');
1117
+ function createWorkflowExecutionState(
1118
+ value: Record<string, any> | undefined,
1119
+ ): Record<string, any> {
1120
+ return {
1121
+ workflow: value ?? {},
1122
+ nodes: {},
1123
+ };
1124
+ }
795
1125
 
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
- );
801
- }
1126
+ function asRecord(value: unknown): Record<string, unknown> {
1127
+ return value && typeof value === 'object' && !Array.isArray(value)
1128
+ ? (value as Record<string, unknown>)
1129
+ : {};
1130
+ }
802
1131
 
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 };
810
- }
1132
+ function normalizeHttpStatusCode(value: unknown): number {
1133
+ return typeof value === 'number' &&
1134
+ Number.isInteger(value) &&
1135
+ value >= 100 &&
1136
+ value <= 599
1137
+ ? value
1138
+ : 200;
1139
+ }
1140
+
1141
+ function normalizeHttpHeaders(value: unknown): Record<string, string> {
1142
+ return Object.fromEntries(
1143
+ Object.entries(asRecord(value)).filter(
1144
+ (entry): entry is [string, string] => typeof entry[1] === 'string',
1145
+ ),
1146
+ );
811
1147
  }